Cihazın dokunmatik ekran olup olmadığını tespit etmek için medya sorgusu


122

Dokunmatik ekranlı bir cihazda değilken bir şeyi gerçekleştirmenin en güvenli yolu, medya sorgularını kullanmak nedir? Hiçbir şekilde yoksa, !window.Touchveya Modernizr gibi bir JavaScript çözümü kullanmanızı önerir misiniz ?


2
2018'e hızlı bir şekilde ilerleyin, CSS artık yerel olarak bu stackoverflow.com/a/50285058/1717735
Buzut

Yanıtlar:


37

Modernizr'i kullanmanızı ve medya sorgu özelliklerini kullanmanızı öneririm .

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

Bununla birlikte, CSS kullanıldığında, örneğin Firefox'ta olduğu gibi sözde sınıf vardır. Şunları kullanabilirsiniz : -moz-system-metric (dokunmatik) . Ancak bu özellikler her tarayıcıda mevcut değildir.

İçin Apple cihazlar, basit kullanımı yapabilirsiniz:

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

Özellikle Ipad için:

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

Ancak bunlar Android'de çalışmıyor .

Modernizr , özellik algılama yetenekleri sağlar ve özellikleri algılama, tarayıcılara dayalı kodlama yapmaktan ziyade kodlamanın iyi bir yoludur.

Dokunmatik Öğelerin Stilini Ayarlama

Modernizer, tam da bu amaç için HTML etiketine sınıflar ekler. Bu durumda, touchve no-touchsen .touch ile seçicileri adýnýnönüne dokunuşun ilgili yönlerini stil böylece. ör .touch .your-container. Kredi: Ben Swinburne


Hiçbir psedo sınıfının tüm modern cihazlar / tarayıcılarla çalışmadığını düşünmekte haklı mıyım?
JJJollyjim

@ JJ56, Evet, her tarayıcı dokunmatik sözde sınıfları desteklemez. Ama modernizrmükemmel olacak yer burası :)
Starx

18
Modernizr.touchTarayıcı destekleri mutlaka bir dokunmatik cihaz yansıtmamaktadır olayları dokunursanız test sadece gösterir. Örneğin, Palm Pre / WebOS (dokunmatik) telefonlar dokunma olaylarını desteklemez ve bu nedenle bu testte başarısız olur.
numediaweb

5
Buna ek olarak, yine de modernizörü dahil ediyorsanız; Modernizer, tam da bu amaç için gövde etiketine sınıflar ekler. Bu durumda, touchve no-touchböylece seçicilerinizin önüne ile dokunarak dokunmayla ilgili yönlerinizi biçimlendirebilirsiniz .touch. Örneğin.touch .your-container
Ben Swinburne

2
Benim için modernizr, gövde etiketine değil, html etiketine dokunma sınıfını ekliyor gibi görünüyor.
Robin Cox

162

CSS4 ortam sorgu taslağında aslında bunun için bir özellik vardır .

'İşaretçi' medya özelliği, fare gibi bir işaretleme aygıtının varlığını ve doğruluğunu sorgulamak için kullanılır. Bir aygıtın birden fazla giriş mekanizması varsa, UA'nın birincil giriş mekanizmalarının en az yetenekli işaretleme aygıtının özelliklerini rapor etmesi önerilir. Bu ortam sorgusu aşağıdaki değerleri alır:

"yok"
- Aygıtın giriş mekanizması bir işaretleme aygıtı içermez.

'kaba'
- Cihazın giriş mekanizması, sınırlı doğruluğa sahip bir işaretleme cihazı içerir.

'iyi'
- Cihazın giriş mekanizması, doğru bir işaretleme cihazı içerir.

Bu şu şekilde kullanılacaktır:

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

Ayrıca bir bilet buldum ilgili Chromium projesinde .

Tarayıcı uyumluluğu Quirksmode'da test edilebilir . Sonuçlar benim sonuçlarım (22 Ocak 2013):

  • Chrome / Win: Çalışır
  • Chrome / iOS: Çalışmıyor
  • Safari / iOS6: Çalışmıyor

3
Sağlanan çözüm postere göre bile işe yaramadığında en çok puan alan cevap bu nasıl olabilir?
erdomester

5
Bunun için tarayıcı desteği artık o kadar kötü değil: Edge, Chrome, Safari, iOS ve Android. Bakınız: caniuse.com/#feat=css-media-interaction
Josa


Benim için çalışıyor;) Bunu araştırdığınız için teşekkürler!
Verri

53

CSS çözümleri, 2013 ortasından itibaren yaygın olarak kullanılamayacak gibi görünmektedir. Yerine...

  1. Nicholas Zakas, Modernizr'in no-touch, tarayıcı dokunmayı desteklemediğinde bir CSS sınıfı uyguladığını açıklıyor .

  2. Veya kendi Modernizr benzeri çözümünüzü uygulamanıza izin veren basit bir kod parçasıyla JavaScript'te tespit edin:

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

    Ardından CSS'nizi şu şekilde yazabilirsiniz:

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

İkincisi çok güzel. Benim için bir cazibesi var! Teşekkürler.
Garavani

@ bjb568 Daha modern bir alternatif olan önerilen düzenleme için teşekkürler, ancak yalnızca IE 10 ve üzerinde çalıştığından, bu sürümü şimdilik saklamanın en iyisi olduğunu düşünüyorum.
Simon East

Bu sınıf html etiketinde olacak gibi görünüyor; bu, CSP kullanılırken varsayılan olarak devre dışı olduğu anlamına gelir.
Leo

36

Ortam türleri, standardın bir parçası olarak dokunma yeteneklerini algılamanıza izin vermez:

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

Dolayısıyla, bunu tutarlı bir şekilde CSS veya medya sorguları yoluyla yapmanın bir yolu yoktur , JavaScript'e başvurmanız gerekecektir.

Modernizr kullanmanıza gerek yok, sadece düz JavaScript kullanabilirsiniz:

<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.TouchEventyalnızca apple cihazları için çalışır.
Starx

22
@vsync Modernizr, geliştiriciler için yararlı olan tüm testleri, dokunma etkinlikleri ve bu sayfayı bulmaları gibi belirli bir özelliği test etmek zorunda kaldıklarında her seferinde Google'a mecbur kalmamaları için korumalı bir kitaplığa koymanın harika bir yoludur. Bilginize, istediğiniz testlerle özelleştirebileceğiniz özel bir Modernizr yapısı var. Bu, ya JS sözdizimini (yani: Modernizr.touch) ya da CSS sınıflarını (.touch .my-element {}) kullanırsanız, projeler arasında her zaman aynı şekilde özellikleri test etmenin harika bir yoludur. Bence, her seferinde tekerleği yeniden icat etmeden bir şeyler yapabileceğimizi kabul etmemenin insan zekasına hakaret olduğunu düşünüyorum.
Alejandro García Iglesias

11
Pekala, yüzlerce proje üzerinde çalıştım ve asla böyle bir şeye ihtiyacım olmadı, çoğu durumda ihtiyacınız olan tek şey çok küçük bir test setidir, asla 5'ten fazla asla diyemem (çoğu durumda), bu yüzden sadece bulun bu 5'i doğrudan kodunuza ekleyin, Modernizer web sitesine gitmenize, özel bir yapı oluşturmanıza, sayfanıza dahil etmenize gerek yok. Geliştiriciler bu kadar tembel olmamalıdır. Bir web geliştiricisi her zaman "kodu nasıl daha hafif hale getirebilirim?" Zihniyetine sahip olmalıdır .. IMHO ve yılların tecrübesi. geliştiriciler bugünlerde tonlarca komut dosyası
eklemeyi

2
Bazıları tembellik diyor. Neden tekerleği yeniden icat edelim diyorum? Yeni bir cihaz / sürüm / platform göründüğünde ve özel durumunuzun değişmesi gerektiğinde ne olacak? Siz a) Özel durum algılama kodunu kendiniz oluşturmaya ve özel kodunuza backport yapmaya, bu süreçte kendinizi yeniden tanımaya veya b) Modernizr'in daha yeni bir sürümünü indirmeye ve onu bırakmaya çalışıyor musunuz? Hangisini yapacağımı biliyorum. GarciaWebDev'e +1.
Sc0ttyD

@ Sc0ttyD Kişisel tercihim, Başlangıçta Modernizr gibi kütüphanelere bağlı kalmadan bir şeyleri kodlamayı öğrenmektir. Bir gün yeni cihazı kodlayan o kişi olmanız gerekebilir ve kitaplık olmadan yapamayacağınız için takılıp kalmak istemezsiniz. Bahsetmiyorum bile, muhtemelen işlerinde yeni bir kütüphane öğrenmek için zamanı olmayan pek çok insan var.
Alex W

28

2017'de, ikinci yanıttaki CSS medya sorgusu hala Firefox'ta çalışmıyor. Bunun için bir çözüm buldum: -moz-touch-etkin


İşte tarayıcılar arası medya sorgusu:

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

bu daha yüksek ve onaylanmış cevap olmalıdır. firefox şartnameyi uygulamak için çalışıyor, bu yüzden -moz-touch-enabledyakında
gerekmeyecek


@ user3445853 OP, dokunmatik ekranla cihazın nasıl tespit edileceğini (medya sorgusu aracılığıyla) sorar. "(İşaretçi: yok)" kuralı doğru olursa, aygıtın kesin bir dokunmatik ekranı yoktur. Ama birisi benim fikrimi onaylamalı (ya da hayır) :)
Sokołow

-moz-touch-enabledFirefox 58+ sürümünde desteklenmediği varsayılmaktadır. Olduğu gibi, bu çözüm Firefox 58-63'ü kapsamaz (Firefox 64+ işaretçi sorgusunu desteklediğinden). Kaynak: developer.mozilla.org/en-US/docs/Web/CSS/@media/…
fgblomqvist

24

Aslında bunun için bir medya sorgusu var:

@media (hover: none) {  }

Firefox dışında oldukça iyi destekleniyor . Safari ve Chrome, mobil cihazlarda en yaygın tarayıcılar olduğundan, daha fazla benimsenene kadar yeterli olabilir.


2
... ve önümüzdeki haftalarda FF için de destek gelecek.
retrovertigo

5

Bu çalışacak. Eğer bana haber vermiyorsa

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

edit: hover on-demand artık desteklenmiyor


3

Bu çözüm, CSS4 tüm tarayıcılar tarafından global olarak desteklenene kadar çalışacaktır. O gün geldiğinde sadece CSS4 kullanın. ancak o zamana kadar bu, mevcut tarayıcılarda çalışır.

tarayıcı 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:

eski yol:

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

daha yeni yol:

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

Cihazın dokunmatik ekranı varsa, yukarıdaki kod "is-touch" sınıfını gövde etiketine ekleyecektir. Artık web uygulamanızda css'e sahip olabileceğiniz herhangi bir konum: arama yapabileceğiniz fareyle üzerine gelinbody:not(.is-touch) the_rest_of_my_css:hover

Örneğin:

button:hover

dönüşür:

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

Modernleştirici kitaplığı çok büyük bir kitaplık olduğundan, bu çözüm modernleştiricinin kullanılmasını önler. Tek yapmaya çalıştığınız dokunmatik ekranları tespit etmekse, bu, derlenen son kaynağın boyutu bir gereklilik olduğunda en iyisi olacaktır.


0

JS veya jQuery kullanarak gövdeye bir sınıf dokunmatik ekranı ekleme

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.