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


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.