Zapytanie o Media w celu wykrycia, czy urządzenie jest Ekranem dotykowym

Jaki jest najbezpieczniejszy sposób, używając zapytań o media, aby coś się stało, gdy nie ma Urządzenia z Ekranem dotykowym? Jeśli nie ma możliwości, czy sugerujesz użycie rozwiązania JavaScript, takiego jak !window.Touch lub Modernizr?

8 answers

Sugerowałbym użyciemodernizr i wykorzystanie jego funkcji zapytań o media.

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

Jednak, używając CSS, istnieją pseudo klasy jak, na przykład w Firefoksie. Możesz użyć :-moz-system-metric(dotykowy). Ale te funkcje nie są dostępne dla każdej przeglądarki.

Dla urządzeń Apple możesz w prosty sposób używać:

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

Specjalnie dla iPada:

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

Ale te nie działają na Androidzie .

Modernizr daje możliwości wykrywania funkcji, a wykrywanie funkcji jest dobry sposób na kodowanie, A nie kodowanie na podstawie przeglądarek.

Stylizacja Elementów Dotykowych

Modernizer dodaje klasy do znacznika HTML w tym właśnie celu. W tym przypadku, touch i no-touch, więc można stylizować swoje aspekty dotykowe poprzez prefiks selektorów z .dotyk. np. .touch .your-container. Napisy: Ben Swinburne

 36
Author: Starx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 19:37:19

Istnieje właściwość dla tego w css4 Media query draft .

Funkcja 'pointer' służy do zapytań o obecność i dokładność urządzenia wskazującego, takiego jak mysz. Jeśli urządzenie ma wielu mechanizmów wprowadzania, zaleca się, aby UA zgłaszał charakterystyka najmniej sprawnego urządzenia wskazującego głównego mechanizmy wejściowe. To Zapytanie o media przyjmuje następujące wartości:

'none'
- Wejście mechanizm urządzenia nie obejmuje urządzenia wskazującego.

'coarse"
- Mechanizm wejściowy urządzenia zawiera urządzenie wskazujące o ograniczonej dokładności.

'fine"
- Mechanizm wejściowy urządzenia zawiera dokładne urządzenie wskazujące.

To byłoby używane jako takie:

/* 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;
    }
}

Znalazłem również bilet w projekcie Chromium związanym z tym.

Kompatybilność przeglądarki można przetestować na Quirksmode . To są moje wyniki (22 sty 2013):

  • Chrome / Win: Działa
  • Chrome / iOS: nie działa
  • Safari/iOS6: nie działa
 140
Author: Znarkus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-23 03:19:26

Rozwiązania CSS nie wydają się być powszechnie dostępne od połowy 2013 roku. Zamiast tego...

  1. Nick Zakas wyjaśnia , że Modernizr stosuje no-touch klasę CSS, gdy przeglądarka nie obsługuje touch.

  2. Lub wykryć w JavaScript za pomocą prostego fragmentu kodu, pozwalającego zaimplementować własne rozwiązanie przypominające Modernizr:

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

    Następnie możesz zapisać swój CSS jako:

    .no-touch .myClass {
        ...
    }
    .touch .myClass {
        ...
    }
    
 46
Author: Simon East,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-12 10:28:03

Typy nośników nie pozwalają na wykrywanie możliwości dotykowych w ramach standardu:

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

Tak więc, nie ma sposobu, aby to zrobić konsekwentnie {[9] } poprzez CSS lub media queries, będziesz musiał uciekać się do JavaScript.

Nie trzeba używać Modernizr, można po prostu użyć zwykłego JavaScript:

<script type="text/javascript">
    var is_touch_device = 'ontouchstart' in document.documentElement;
    if(is_touch_device) alert("touch is enabled!");
</script>
 34
Author: Alex W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-17 20:45:17

W 2017 roku zapytanie CSS media z drugiej odpowiedzi nadal nie działa na Firefoksie. Znalazłem do tego soluton: - moz-touch-enabled


Oto Zapytanie o media między przeglądarkami:

@media (-moz-touch-enabled: 1), (pointer:coarse) {
    .something {
        its: working;
    }
}
 22
Author: Sokołow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-23 17:05:38

Istnieje właściwie Zapytanie o media:

@media (hover: none) { … }

Oprócz Firefoksa, jest to dość dobrze obsługiwane . Safari i Chrome są najczęstszymi przeglądarkami na urządzeniach mobilnych, może wystarczyć do większej adopcji.

 4
Author: Buzut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-11 06:52:28

To rozwiązanie będzie działać, dopóki CSS4 nie będzie obsługiwany globalnie przez wszystkie przeglądarki. Kiedy nadejdzie ten dzień, po prostu użyj CSS4. ale do tego czasu działa to dla obecnych przeglądarek.

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())
};

Onload:

Old way:

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

Nowszy sposób:

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

Powyższy kod doda klasę" is-touch " do znacznika body, jeśli urządzenie ma ekran dotykowy. Teraz dowolne miejsce w aplikacji webowej, w którym miałbyś css dla: hover możesz wywołać body:not(.is-touch) the_rest_of_my_css:hover

Dla przykład:

button:hover

Staje się:

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

To rozwiązanie pozwala uniknąć użycia modernizer, ponieważ modernizer lib jest bardzo dużą biblioteką. Jeśli wszystko, co próbujesz zrobić, to wykryć ekrany dotykowe, będzie to najlepsze, gdy wymagany jest rozmiar końcowego skompilowanego źródła.

 3
Author: Patrick W. McMahon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-15 20:02:08

Dodawanie klasy touchscreen do ciała za pomocą JS lub jQuery

  //allowing mobile only css
    var isMobile = ('ontouchstart' in document.documentElement && navigator.userAgent.match(/Mobi/));
    if(isMobile){
        jQuery("body").attr("class",'touchscreen');
    }
 0
Author: Matoeil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 15:19:21