장치가 터치 스크린인지 감지하기위한 미디어 쿼리


122

미디어 쿼리를 사용하여 터치 스크린 장치가 아닐 때 작업을 수행하는 가장 안전한 방법은 무엇입니까? 방법이 없다면 !window.Touch또는 Modernizr 와 같은 JavaScript 솔루션을 사용하는 것이 좋습니까?


2
2018 년으로 빨리 감기, CSS는 이제 기본적으로이 작업을 수행 할 수 있습니다. stackoverflow.com/a/50285058/1717735
Buzut

답변:


37

modernizr 를 사용하고 미디어 쿼리 기능을 사용하는 것이 좋습니다 .

if (Modernizr.touch){
   // bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
   // bind to normal click, mousemove, etc
}

그러나 CSS를 사용하면 Firefox와 같은 의사 클래스가 있습니다. 당신은 사용할 수 있습니다 : -moz-시스템 메트릭 (터치 지원) . 그러나 이러한 기능은 모든 브라우저에서 사용할 수 없습니다.

를 들어 애플 장치, 당신은 간단하게 사용을 할 수 있습니다

if(window.TouchEvent) {
   //.....
}

특히 Ipad의 경우 :

if(window.Touch) {
    //....
}

그러나 이들은 Android에서 작동하지 않습니다 .

Modernizr 는 기능 감지 기능을 제공하며 기능 감지는 브라우저를 기반으로 코딩하는 것보다 코딩하는 좋은 방법입니다.

터치 요소 스타일링

Modernizer는 이러한 정확한 목적을 위해 HTML 태그에 클래스를 추가합니다. 이 경우, touch그리고 no-touch당신은 .touch하여 선택기를 앞에 붙여 터치 관련 측면의 스타일을 할 수 있습니다. 예 : .touch .your-container. 크레딧 : Ben Swinburne


모든 최신 장치 / 브라우저에서 작동하는 psedo 클래스가 없다고 생각하는 것이 맞습니까?
JJJollyjim 2012

@ JJ56, 예 모든 브라우저가 터치 의사 클래스를 지원하는 것은 아닙니다. 하지만 그게 modernizr완벽 할 것입니다 :)
Starx 2012-07-09

18
Modernizr.touch테스트는 브라우저가 터치 이벤트를 지원하는지 여부 만 나타내며, 터치 스크린 장치를 반드시 반영하지는 않습니다. 예를 들어 Palm Pre / WebOS (터치) 전화는 터치 이벤트를 지원하지 않으므로이 테스트에 실패합니다.
numediaweb

5
어차피 모더 나이저를 포함한다면 여기에 덧붙이겠습니다. Modernizer는 이러한 정확한 목적을 위해 body 태그에 클래스를 추가합니다. 이 경우, touch그리고 no-touch당신이 스타일을 할 수 있도록 터치하여 선택기를 앞에 붙여 측면을 관련 .touch. 예.touch .your-container
Ben Swinburne 2013 년

2
나를 위해 modernizr는 body 태그가 아닌 html 태그에 터치 클래스를 추가하는 것 같습니다.
Robin Cox

162

실제로 CSS4 미디어 쿼리 초안 에 대한 속성이 있습니다 .

'포인터'미디어 기능은 마우스와 같은 포인팅 장치의 존재 여부와 정확성을 쿼리하는 데 사용됩니다. 장치에 여러 입력 메커니즘이있는 경우 UA가 기본 입력 메커니즘의 최소 기능 포인팅 장치의 특성을보고하는 것이 좋습니다. 이 미디어 쿼리는 다음 값을 사용합니다.

'없음'
-장치의 입력 메커니즘에 포인팅 장치가 포함되어 있지 않습니다.

'coarse'-
장치의 입력 메커니즘에는 정확도가 제한된 포인팅 장치가 포함됩니다.

'fine'-
장치의 입력 메커니즘에는 정확한 포인팅 장치가 포함됩니다.

이것은 다음과 같이 사용됩니다.

/* Make radio buttons and check boxes larger if we have an inaccurate pointing device */
@media (pointer:coarse) {
    input[type="checkbox"], input[type="radio"] {
        min-width:30px;
        min-height:40px;
        background:transparent;
    }
}

이와 관련된 Chromium 프로젝트 에서도 티켓 을 찾았 습니다 .

브라우저 호환성은 Quirksmode 에서 테스트 할 수 있습니다 . 내 결과입니다 (2013 년 1 월 22 일) :

  • Chrome / Win : 작동
  • Chrome / iOS : 작동하지 않음
  • Safari / iOS6 : 작동하지 않음

3
제공된 솔루션이 포스터대로도 작동하지 않을 때 어떻게 가장 많은 포인트로 답이 될 수 있습니까?
erdomester

5
이에 대한 브라우저 지원은 더 이상 나쁘지 않습니다 : Edge, Chrome, Safari, iOS 및 Android. 참조 : caniuse.com/#feat=css-media-interaction
Josa

3

나를 위해 작동합니다;) 이것을 조사해 주셔서 감사합니다!
Verri

52

CSS 솔루션은 2013 년 중반 현재 널리 사용되지 않는 것으로 보입니다. 대신 ...

  1. Nicholas Zakas는 Modernizr no-touch가 브라우저가 터치를 지원하지 않을 때 CSS 클래스를 적용 한다고 설명 합니다 .

  2. 또는 간단한 코드로 JavaScript에서 감지하여 자신 만의 Modernizr 솔루션을 구현할 수 있습니다.

    <script>
        document.documentElement.className += 
        (("ontouchstart" in document.documentElement) ? ' touch' : ' no-touch');
    </script>

    그런 다음 CSS를 다음과 같이 작성할 수 있습니다.

    .no-touch .myClass {
        ...
    }
    .touch .myClass {
        ...
    }

두 번째는 아주 좋습니다. 나를 위해 매력을 작동합니다! 감사.
Garavani 2014 년

@ bjb568 더 현대적인 대안 인 제안 된 편집에 감사하지만 IE 10 이상에서만 작동하므로 당분간이 버전을 유지하는 것이 가장 좋습니다.
Simon East

해당 클래스가 html 태그에있는 것처럼 들립니다. 이는 CSP를 사용할 때 기본적으로 비활성화되어 있음을 의미합니다.
Leo

35

미디어 유형을 사용하면 표준의 일부로 터치 기능을 감지 할 수 없습니다.

http://www.w3.org/TR/css3-mediaqueries/

따라서 CSS 또는 미디어 쿼리를 통해 일관되게 수행 할 수있는 방법이 없으므로 JavaScript에 의존해야합니다.

Modernizr를 사용할 필요가 없으며 일반 JavaScript를 사용할 수 있습니다.

<script type="text/javascript">
    var is_touch_device = 'ontouchstart' in document.documentElement;
    if(is_touch_device) alert("touch is enabled!");
</script>

AFAIK, window.touch&& window.TouchEvent는 애플 장치에서만 작동합니다.
Starx 2012

22
@vsync Modernizr는 개발자에게 유용한 모든 테스트를 관리 라이브러리에 넣을 수있는 좋은 방법입니다. 터치 이벤트와 같은 특정 기능을 테스트하고이 페이지를 찾아야 할 때마다 Google을 사용할 필요가 없기 때문입니다. 참고로 원하는 테스트로 사용자 지정할 수있는 사용자 지정 Modernizr 빌드가 있습니다. JS 구문 (예 : Modernizr.touch) 또는 CSS 클래스 (.touch .my-element {})를 사용하여 프로젝트간에 항상 동일한 방식으로 기능을 테스트하는 훌륭한 방법입니다. 매번 바퀴를 재창조하지 않고도 우리가 할 수 있다는 것을 인식하지 못하는 것은 인간 지능에 대한 모욕이라고 생각합니다.
Alejandro García Iglesias 2013

11
글쎄요, 저는 수백 개의 프로젝트에서 일했지만 그런 것은 전혀 필요하지 않았습니다. 대부분의 경우 필요한 것은 매우 작은 테스트 세트입니다. 5 개 이하로 말할 수 있습니다 (대부분의 경우). 그 5 개를 코드에 직접 입력하면 실제로 Modernizer 웹 사이트로 이동하거나 사용자 지정 빌드를 만들거나 페이지에 포함 할 필요가 없습니다. 개발자는 그렇게 게으르지 않아야합니다. 웹 개발자는 항상 "어떻게하면 코드를 더 가볍게 만들 수 있습니까?"라는 사고 방식과 다년간의 경험을 가지고 있어야합니다. 요즘 개발자들은 수많은 스크립트를 포함하는 것을 좋아하는 것 같습니다. : /
vsync

2
어떤 사람들은 게으르다 고 말합니다. 바퀴를 재발 명 한 이유는 무엇입니까? 새 장치 / 버전 / 플랫폼이 나타나고 특별한 경우를 변경해야하는 경우는 어떻습니까? a) 특수한 경우 감지 코드를 직접 해결하고 사용자 지정 코드로 백 포트하여 프로세스에서이를 다시 숙지하거나 b) 최신 버전의 Modernizr를 다운로드하여 드롭 하시겠습니까? 나는 내가 무엇을할지 압니다. GarciaWebDev에 +1.
Sc0ttyD 2013

@ Sc0ttyD 개인적으로 선호하는 것은 Modernizr와 같은 라이브러리에 의존하지 않고 처음에 코딩하는 법을 배우는 것입니다. 언젠가는 새 장치를 코딩하는 사람이되어야 할 수도 있고 라이브러리 없이는 할 수 없기 때문에 갇히고 싶지 않을 수도 있습니다. 말할 것도없이, 새로운 도서관을 배울 시간이없는 사람들이 많을 것입니다.
Alex W

28

2017 년에는 두 번째 답변의 CSS 미디어 쿼리가 Firefox에서 여전히 작동하지 않습니다. 이에 대한 해결책을 찾았습니다. -moz-touch-enabled


따라서 다음은 브라우저 간 미디어 쿼리입니다.

@media (-moz-touch-enabled: 1), (pointer:coarse) {
    .something {
        its: working;
    }
}

이것은 더 높고 승인 된 답변이어야합니다. 파이어 폭스는 사양을 구현에 노력하고, 너무 -moz-touch-enabled빨리하지 않아도됩니다
Dogoku


@ user3445853 OP는 터치 스크린으로 장치를 감지 (미디어 쿼리를 통해)하는 방법을 묻습니다. "(포인터 : 없음)"규칙이 참이면 장치에 확실히 터치 스크린이없는 것입니다. 하지만 누군가 내 의견을 확인해야합니다 (아니요) :)
Sokołow

-moz-touch-enabledFirefox 58 이상에서는 지원되지 않습니다. 에서와 같이이 솔루션은 Firefox 58-63을 다루지 않습니다 (Firefox 64 이상이 포인터 쿼리를 지원하기 때문에). 출처 : developer.mozilla.org/en-US/docs/Web/CSS/@media/…
fgblomqvist

24

실제로 미디어 쿼리가 있습니다.

@media (hover: none) {  }

Firefox 외에도 상당히 잘 지원됩니다 . Safari와 Chrome은 모바일 장치에서 가장 일반적인 브라우저이므로 더 많이 채택 될 때까지 충분할 수 있습니다.


2
... 그리고 다음 주에 FF에 대한 지원도 제공됩니다.
retrovertigo

5

작동합니다. 알려주지 않으면

@media (hover: none) and (pointer: coarse) {
    /* Touch screen device style goes here */
}

편집 : 주문형 호버는 더 이상 지원되지 않습니다.


3

이 솔루션은 CSS4가 모든 브라우저에서 전역 적으로 지원 될 때까지 작동합니다. 그날이 오면 CSS4를 사용하십시오. 그러나 그때까지는 현재 브라우저에서 작동합니다.

browser-util.js

export const isMobile = {
  android: () => navigator.userAgent.match(/Android/i),
  blackberry: () => navigator.userAgent.match(/BlackBerry/i),
  ios: () => navigator.userAgent.match(/iPhone|iPad|iPod/i),
  opera: () => navigator.userAgent.match(/Opera Mini/i),
  windows: () => navigator.userAgent.match(/IEMobile/i),
  any: () => (isMobile.android() || isMobile.blackberry() || 
  isMobile.ios() || isMobile.opera() || isMobile.windows())
};

길 위에:

옛날 방식 :

isMobile.any() ? document.getElementsByTagName("body")[0].className += 'is-touch' : null;

새로운 방법 :

isMobile.any() ? document.body.classList.add('is-touch') : null;

위 코드는 장치에 터치 스크린이있는 경우 "is-touch"클래스를 body 태그에 추가합니다. 이제 웹 응용 프로그램의 모든 위치에서 : hover에 대한 CSS를 사용할 수 있습니다.body:not(.is-touch) the_rest_of_my_css:hover

예를 들면 :

button:hover

된다 :

body:not(.is-touch) button:hover

이 솔루션은 modernizer lib가 매우 큰 라이브러리이기 때문에 modernizer를 사용하지 않습니다. 터치 스크린을 감지하는 것뿐이라면 최종 컴파일 된 소스의 크기가 필요한 경우 이것이 가장 좋습니다.


0

JS 또는 jQuery를 사용하여 본문에 클래스 터치 스크린 추가

  //allowing mobile only css
    var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));
    if(isMobile){
        jQuery("body").attr("class",'touchscreen');
    }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.