टचस्क्रीन डिवाइस पर न होने पर कुछ करने के लिए मीडिया के प्रश्नों का उपयोग करने का सबसे सुरक्षित तरीका क्या है? अगर कोई रास्ता नहीं है, तो क्या आप जावास्क्रिप्ट समाधान का उपयोग करने का सुझाव देते हैं जैसे कि !window.Touchमॉर्डनिज़्र?
टचस्क्रीन डिवाइस पर न होने पर कुछ करने के लिए मीडिया के प्रश्नों का उपयोग करने का सबसे सुरक्षित तरीका क्या है? अगर कोई रास्ता नहीं है, तो क्या आप जावास्क्रिप्ट समाधान का उपयोग करने का सुझाव देते हैं जैसे कि !window.Touchमॉर्डनिज़्र?
जवाबों:
मैं सुझाव दूंगा कि आधुनिकीकरण का उपयोग करें और इसकी मीडिया क्वेरी सुविधाओं का उपयोग करें।
if (Modernizr.touch){
// bind to touchstart, touchmove, etc and watch `event.streamId`
} else {
// bind to normal click, mousemove, etc
}
हालाँकि, CSS का उपयोग करके, जैसे कि फ़ायरफ़ॉक्स में छद्म वर्ग हैं। आप उपयोग कर सकते हैं : -Moz- सिस्टम-मीट्रिक (स्पर्श-सक्षम) । लेकिन ये फीचर्स हर ब्राउजर के लिए उपलब्ध नहीं हैं।
के लिए एप्पल उपकरणों, आप सरल उपयोग कर सकते हैं:
if(window.TouchEvent) {
//.....
}
विशेष रूप से Ipad के लिए:
if(window.Touch) {
//....
}
लेकिन, ये एंड्रॉइड पर काम नहीं करते हैं ।
मॉर्डनिजर फीचर डिटेक्शन एबिलिटी देता है और ब्राउजर के आधार पर कोडिंग के बजाय फीचर्स को डिटेक्ट करना एक अच्छा तरीका है।
आधुनिकतावादी इस सटीक उद्देश्य के लिए HTML टैग में कक्षाएं जोड़ता है। इस मामले में, touchऔर no-touchइसलिए आप अपने चयनकर्ताओं को .touch के साथ उपसर्ग करके अपने स्पर्श संबंधी पहलुओं को स्टाइल कर सकते हैं। उदा .touch .your-container। क्रेडिट: बेन स्वाइनबर्न
modernizrसही होगा :)
Modernizr.touchपरीक्षण केवल इंगित करता है यदि ब्राउज़र का समर्थन करता है घटनाओं, जो जरूरी एक टचस्क्रीन डिवाइस को प्रतिबिंबित नहीं करता स्पर्श करें। उदाहरण के लिए, पाम प्री / वेबओएस (टच) फोन स्पर्श घटनाओं का समर्थन नहीं करते हैं और इस तरह इस परीक्षण को विफल करते हैं।
touchऔर no-touchइसलिए आप अपने चयनकर्ताओं के साथ प्रीफ़िक्स करके अपने स्पर्श संबंधी पहलुओं को स्टाइल कर सकते हैं .touch। जैसे.touch .your-container
CSS4 मीडिया क्वेरी ड्राफ्ट में वास्तव में इसके लिए एक संपत्ति है ।
'पॉइंटर' मीडिया फीचर का इस्तेमाल माउस जैसे पॉइंटिंग डिवाइस की मौजूदगी और सटीकता के बारे में बताने के लिए किया जाता है। यदि किसी उपकरण में एकाधिक इनपुट तंत्र हैं, तो यह अनुशंसा की जाती है कि UA प्राथमिक इनपुट तंत्र के कम से कम सक्षम पॉइंटिंग डिवाइस की विशेषताओं की रिपोर्ट करें। यह मीडिया क्वेरी निम्न मान लेता है:
'कोई नहीं'
- डिवाइस के इनपुट तंत्र में एक पॉइंटिंग डिवाइस शामिल नहीं है।'मोटे ’
- डिवाइस के इनपुट तंत्र में सीमित सटीकता का एक पॉइंटिंग डिवाइस शामिल है।'ठीक'
- डिवाइस के इनपुट तंत्र में एक सटीक पॉइंटिंग डिवाइस शामिल है।
इसका उपयोग इस प्रकार किया जाएगा:
/* 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;
}
}
मुझे इस से संबंधित क्रोमियम परियोजना में एक टिकट भी मिला ।
ब्राउज़र संगतता को Quirksmode पर परीक्षण किया जा सकता है । ये मेरे परिणाम हैं (22 जून 2013):
2013 के मध्य तक CSS समाधान व्यापक रूप से उपलब्ध नहीं हैं। बजाय...
निकोलस ज़कास बताते हैं कि no-touchजब ब्राउज़र स्पर्श का समर्थन नहीं करता है तो मॉडर्निज़र एक सीएसएस क्लास लागू करता है।
या जावास्क्रिप्ट में पता लगाएं एक सरल कोड के साथ, आप अपने खुद के आधुनिकीकरण जैसे समाधान को लागू करने की अनुमति देते हैं:
<script>
document.documentElement.className +=
(("ontouchstart" in document.documentElement) ? ' touch' : ' no-touch');
</script>
तब आप अपने सीएसएस को इस प्रकार लिख सकते हैं:
.no-touch .myClass {
...
}
.touch .myClass {
...
}मीडिया प्रकार आपको मानक के भाग के रूप में स्पर्श क्षमताओं का पता लगाने की अनुमति नहीं देते हैं:
http://www.w3.org/TR/css3-mediaqueries/
तो, सीएसएस या मीडिया प्रश्नों के माध्यम से इसे लगातार करने का कोई तरीका नहीं है , आपको जावास्क्रिप्ट का सहारा लेना होगा।
मॉडर्निज़्र का उपयोग करने की कोई आवश्यकता नहीं है, आप बस सादे जावास्क्रिप्ट का उपयोग कर सकते हैं:
<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केवल सेब उपकरणों के लिए काम करते हैं।
2017 में, सीएसएस मीडिया क्वेरी दूसरे उत्तर से अभी भी फ़ायरफ़ॉक्स पर काम नहीं करती है। मुझे इसके लिए एक विलेपन मिला: -मोज़ -टच-इनेबल्ड
तो, यहाँ क्रॉस-ब्राउज़र मीडिया क्वेरी है:
@media (-moz-touch-enabled: 1), (pointer:coarse) {
.something {
its: working;
}
}
-moz-touch-enabledजल्द ही आवश्यक नहीं होगा
-moz-touch-enabledमाना जाता है कि फ़ायरफ़ॉक्स 58+ में समर्थित नहीं है। जैसा कि, यह समाधान फ़ायरफ़ॉक्स 58-63 को कवर नहीं करता है (क्योंकि फ़ायरफ़ॉक्स 64+ सूचक क्वेरी का समर्थन करता है)। स्रोत: developer.mozilla.org/en-US/docs/Web/CSS/@media/…
वास्तव में इसके लिए एक मीडिया क्वेरी है:
@media (hover: none) { … }
फ़ायरफ़ॉक्स के अलावा, यह काफी अच्छी तरह से समर्थित है । सफारी और क्रोम मोबाइल उपकरणों पर सबसे आम ब्राउज़र होने के नाते, यह अधिक से अधिक गोद लेने को बर्दाश्त कर सकता है।
यह समाधान तब तक काम करेगा जब तक CSS4 वैश्विक रूप से सभी ब्राउज़रों द्वारा समर्थित नहीं है। जब वह दिन आता है तो बस CSS4 का उपयोग करें। लेकिन तब तक, यह वर्तमान ब्राउज़रों के लिए काम करता है।
ब्राउज़र-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;
यदि डिवाइस में टच स्क्रीन है, तो उपरोक्त कोड "टैग को स्पर्श" वर्ग को बॉडी टैग में जोड़ देगा। अब आपके वेब एप्लिकेशन में कोई भी स्थान जहाँ आपके लिए css होगा: होवर आप कॉल कर सकते हैंbody:not(.is-touch) the_rest_of_my_css:hover
उदाहरण के लिए:
button:hover
हो जाता है:
body:not(.is-touch) button:hover
यह समाधान मॉर्डनाइज़र का उपयोग करने से बचता है क्योंकि मॉर्डनाइज़र लिब एक बहुत बड़ा पुस्तकालय है। यदि आप सभी करने की कोशिश कर रहे हैं टच स्क्रीन का पता लगाने, यह सबसे अच्छा होगा जब अंतिम संकलित स्रोत का आकार एक आवश्यकता है।
मैं इस मुद्दे को हल करने में सक्षम था
@media (hover:none), (hover:on-demand) {
Your class or ID{
attributes
}
}
on-demandकल्पना से और ब्राउज़र से हटा दिया गया है: github.com/w3c/csswg-drafts/commit/…