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.Touch
veya Modernizr gibi bir JavaScript çözümü kullanmanızı önerir misiniz ?
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.Touch
veya Modernizr gibi bir JavaScript çözümü kullanmanızı önerir misiniz ?
Yanıtlar:
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.
Modernizer, tam da bu amaç için HTML etiketine sınıflar ekler. Bu durumda, touch
ve no-touch
sen .touch ile seçicileri adýnýnönüne dokunuşun ilgili yönlerini stil böylece. ör .touch .your-container
. Kredi: Ben Swinburne
modernizr
mükemmel olacak yer burası :)
Modernizr.touch
Tarayı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.
touch
ve no-touch
böylece seçicilerinizin önüne ile dokunarak dokunmayla ilgili yönlerinizi biçimlendirebilirsiniz .touch
. Örneğin.touch .your-container
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):
CSS çözümleri, 2013 ortasından itibaren yaygın olarak kullanılamayacak gibi görünmektedir. Yerine...
Nicholas Zakas, Modernizr'in no-touch
, tarayıcı dokunmayı desteklemediğinde bir CSS sınıfı uyguladığını açıklıyor .
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 {
...
}
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>
window.touch
&& window.TouchEvent
yalnızca apple cihazları için çalışır.
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;
}
}
-moz-touch-enabled
yakında
-moz-touch-enabled
Firefox 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/…
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.
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.
Bunu kullanarak bu sorunu çözebildim
@media (hover:none), (hover:on-demand) {
Your class or ID{
attributes
}
}
on-demand
spesifikasyondan ve tarayıcılardan kaldırıldı: github.com/w3c/csswg-drafts/commit/…