कैसे निकालें / अनदेखा करें: टच डिवाइस पर hss सीएसएस शैली


141

:hoverयदि कोई उपयोगकर्ता टच डिवाइस के माध्यम से हमारी वेबसाइट पर जाता है, तो मैं सभी सीएसएस घोषणाओं को अनदेखा करना चाहता हूं । क्योंकि :hoverसीएसएस का कोई मतलब नहीं है, और यह भी परेशान कर सकता है अगर कोई टैबलेट इसे क्लिक / टैप पर चलाता है क्योंकि यह तब तक चिपक सकता है जब तक कि तत्व फोकस खो देता है। ईमानदार होने के लिए, मुझे नहीं पता कि स्पर्श उपकरणों को :hoverपहली जगह में ट्रिगर करने की आवश्यकता क्यों महसूस होती है - लेकिन यह वास्तविकता है, इसलिए यह समस्या वास्तविकता भी है।

a:hover {
   color:blue;
   border-color:green;
   // etc. > ignore all at once for touch devices
}

तो, मैं (कैसे) :hoverएक बार में सभी सीएसएस घोषणाओं को हटा / अनदेखा कर सकता हूं (प्रत्येक को जाने बिना) एक के बाद एक स्पर्श उपकरणों के लिए उन्हें घोषित किए जाने के बाद?



1
मुझे यह एक php समाधान के साथ मिलता है, जहां मुझे पता चलता है कि देखने वाला उपकरण मोबाइल है या नहीं और इसके आधार पर विभिन्न परिवर्तनों के साथ सही स्टाइलशीट का उपयोग करें। हालांकि आपके सवाल का जवाब नहीं है। आप संभवतः @media क्वेरीज़ का उपयोग कर सकते हैं, लेकिन जब फ़ोन और टैबलेट में पूर्ण एचडी रिज़ॉल्यूशन हो, तो काम करने की गारंटी नहीं है।
टॉमफिरथ

जवाबों:


171

tl; dr इस का उपयोग करें: https://jsfiddle.net/57tmy8j3/

यदि आप रुचि रखते हैं कि क्यों या अन्य विकल्प क्या हैं, तो पढ़ें।

Quick'n'dirty - निकालें: JS का उपयोग करके होवर शैली

आप :hoverजावास्क्रिप्ट का उपयोग करते हुए सभी सीएसएस नियमों को हटा सकते हैं । यह सीएसएस को छूने और पुराने ब्राउज़रों के साथ भी संगत नहीं होने का लाभ है।

function hasTouch() {
  return 'ontouchstart' in document.documentElement
         || navigator.maxTouchPoints > 0
         || navigator.msMaxTouchPoints > 0;
}

if (hasTouch()) { // remove all the :hover stylesheets
  try { // prevent exception on browsers not supporting DOM styleSheets properly
    for (var si in document.styleSheets) {
      var styleSheet = document.styleSheets[si];
      if (!styleSheet.rules) continue;

      for (var ri = styleSheet.rules.length - 1; ri >= 0; ri--) {
        if (!styleSheet.rules[ri].selectorText) continue;

        if (styleSheet.rules[ri].selectorText.match(':hover')) {
          styleSheet.deleteRule(ri);
        }
      }
    }
  } catch (ex) {}
}

सीमाएं: स्टाइलशीट को एक ही डोमेन पर होस्ट किया जाना चाहिए (इसका मतलब है कि कोई सीडीएन नहीं)। मिश्रित माउस और टच डिवाइस जैसे कि सरफेस या आईपैड प्रो पर होवर को अक्षम करता है , जो UX को नुकसान पहुंचाता है।

CSS-only - मीडिया क्वेरीज़ का उपयोग करें

अपने सभी नियमों को एक @mediaब्लॉक में रखें:

@media (hover: hover) {
  a:hover { color: blue; }
}

या वैकल्पिक रूप से, अपने सभी होवर नियमों (पुराने ब्राउज़र के साथ संगत) को ओवरराइड करें:

a:hover { color: blue; }

@media (hover: none) {
  a:hover { color: inherit; }
}

सीमाएँ: केवल वेब संस्करण का उपयोग करते समय iOS 9.0+, Android के लिए Chrome या Android 5.0+ पर काम करता है। hover: hoverपुराने ब्राउज़रों पर होवर के प्रभाव को तोड़ता है, hover: noneपहले से परिभाषित सभी सीएसएस नियमों को ओवरराइड करने की आवश्यकता है। दोनों मिश्रित माउस और स्पर्श उपकरणों के साथ असंगत हैं ।

सबसे मजबूत - जेएस के माध्यम से स्पर्श का पता लगाएं और सीएसएस को प्राथमिकता दें: होवर नियम

इस पद्धति को सभी होवर नियमों के साथ प्रस्तुत करने की आवश्यकता है body.hasHover। (या अपनी पसंद का कोई वर्ग नाम)

body.hasHover a:hover { color: blue; }

hasHoverवर्ग का उपयोग कर जोड़ा जा सकता है hasTouch()पहला उदाहरण से:

if (!hasTouch()) document.body.className += ' hasHover'

हालांकि, इस व्होल में पिछले उदाहरणों के रूप में मिश्रित स्पर्श उपकरणों के साथ कमियां हैं, जो हमें अंतिम समाधान के लिए लाती हैं। जब भी माउस कर्सर ले जाया जाता है, तो होवर प्रभावों को सक्षम करें, जब भी टच का पता चलता है, तो होवर प्रभावों को अक्षम करें।

function watchForHover() {
  // lastTouchTime is used for ignoring emulated mousemove events
  let lastTouchTime = 0

  function enableHover() {
    if (new Date() - lastTouchTime < 500) return
    document.body.classList.add('hasHover')
  }

  function disableHover() {
    document.body.classList.remove('hasHover')
  }

  function updateLastTouchTime() {
    lastTouchTime = new Date()
  }

  document.addEventListener('touchstart', updateLastTouchTime, true)
  document.addEventListener('touchstart', disableHover, true)
  document.addEventListener('mousemove', enableHover, true)

  enableHover()
}

watchForHover()

यह मूल रूप से किसी भी ब्राउज़र में काम करना चाहिए और आवश्यकतानुसार होवर शैलियों को सक्षम / अक्षम करता है।

यहाँ पूरा उदाहरण है - आधुनिक: https://jsfiddle.net/57tmy8j3/
लिगेसी (पुराने ब्राउज़रों के साथ उपयोग के लिए): https://jsfiddle.net/dkz17jc5/19/


धन्यवाद! सिर्फ एक टिप्पणी: क्या पहले जांच करना बेहतर नहीं होगा यदि document.styleSheetsउपयोग करने के बजाय मौजूद है try/catch?
साइमन फेरीन्ड्री

1
मैंने try/catchअभी-अभी उपयोग किया है अगर कुछ विषम त्रुटि दिखाई देती है, तो यह स्क्रिप्ट को क्रैश कर सकता है, जैसे कि IE पर समान-मूल नीति या परतदार समर्थन के कारण डिलीट काम नहीं कर रहा है (यह प्रतिबिंबित करने के लिए टिप्पणी संपादित की गई है)। लेकिन हाँ, ज्यादातर मामलों में, बस एक साधारण जाँच ही पर्याप्त होनी चाहिए।
ब्लेड

1
यह ध्यान देने योग्य है कि फ़ायरफ़ॉक्स सहित डेस्कटॉप ब्राउज़रों का परिणाम 'नोटआउट' में नहीं होगा। वे स्पर्श घटनाओं को समझने की रिपोर्ट करते हैं।
हैरी बी

3
यह समाधान मिश्रित उपकरणों के लिए काम करते हैं जहां मंडराना लेकिन माउस के लिए काम करेगा स्पर्श घटनाओं के लिए नहीं नहीं है
Nbar

2
@ हनीव ज्यादातर मामलों के लिए सही है, हालांकि आपके विशिष्ट के लिए नहीं। आपके नियम को काम करने से कोड में बहुत जटिलता आ जाएगी, जिससे उत्तर को समझना कठिन हो जाएगा। मेरा सुझाव होगा कि या तो नियमों को विभाजित करना या दूसरे समाधान का उपयोग करना, जो वैसे भी अधिक मजबूत है। हालाँकि, किसी संपादन का सुझाव देने के लिए आपका बहुत स्वागत है, यदि आप पहले समाधान में सुधार कर सकते हैं, तो उसे भी जटिल बनाए बिना।
ब्लेड

43

बचाव के लिए सूचक अनुकूलन !

चूँकि यह कुछ समय के लिए नहीं छुआ गया है, आप इसका उपयोग कर सकते हैं:

a:link {
   color: red;
}

a:hover {
   color:blue;
}

@media (hover: none) {
   a:link {
      color: red;
   }
}

अपने डेस्कटॉप ब्राउज़र और फ़ोन ब्राउज़र दोनों में इस डेमो को देखें । आधुनिक स्पर्श उपकरणों द्वारा समर्थित है

नोट : ध्यान रखें कि चूंकि सरफेस पीसी का प्राथमिक इनपुट (क्षमता) एक माउस है, यह एक नीली लिंक होने पर भी समाप्त हो जाएगा, भले ही यह एक अलग (टैबलेट) स्क्रीन हो। ब्राउज़र हमेशा सबसे सटीक इनपुट की क्षमता के लिए डिफ़ॉल्ट होना चाहिए (चाहिए)।


धन्यवाद, यह सुविधाजनक होगा! हालाँकि, मैंने इसे मोबाइल मोड में क्रोम के साथ आज़माया, लेकिन यह काम नहीं किया - जब मैंने इसे "टैप" किया, तो यह वैसे भी नीला हो गया ...
साइमन फेरन्ड्रिगर

1
@SimonFerndriger यह क्रोम devtools की सिर्फ एक सीमा है। लिंक को वास्तविक स्पर्श-मात्र डिवाइस में खोलने का प्रयास करें।
जेसन टी फेदरिंगम

1
आईपैड क्रोम / सफारी बनाम ओएस एक्स क्रोम / सफारी पर पूरी तरह से काम करना। धन्यवाद! अंत में सुरुचिपूर्ण समाधान आप इस तरह के एक छोटे दृश्य मुद्दे के लिए चाहते हैं।
राकालोफ

3
मैंने अभी-अभी iOS 11 पर चलने वाले अपने वास्तविक iPhone 6S पर यह कोशिश की, और लिंक नीला हो गया।
लुकास पेट्र

1
इसके अलावा नेक्सस 5X के साथ एंड्रॉइड 8.1.0 और क्रोम 68.0.3440.91 पर चलने की कोशिश की गई। लिंक नीला हो गया।
ट्रेविन एवरी

12

मैंने उसी समस्या का सामना किया है (सैमसंग मोबाइल ब्राउज़र के साथ मेरे मामले में) और इसलिए मैं इस प्रश्न पर लड़खड़ा गया।

कल्सल के उत्तर के लिए धन्यवाद मुझे कुछ ऐसा मिला जो मुझे विश्वास है कि लगभग सभी डेस्कटॉप ब्राउज़रों को बाहर कर देगा क्योंकि ऐसा लगता है कि मैंने जिन मोबाइल ब्राउज़रों को पहचानने की कोशिश की थी (संकलित तालिका से स्क्रीनशॉट देखें: सीएसएस पॉइंटर फ़ीचर डिटेक्शन टेबल )।

MDN वेब डॉक्स स्थिति है कि

पॉइंटर CSS @मीडिया सुविधा का उपयोग इस आधार पर शैलियों को लागू करने के लिए किया जा सकता है कि क्या उपयोगकर्ता का प्राथमिक इनपुट तंत्र एक पॉइंटिंग डिवाइस है, और यदि हां, तो यह कितना सही है

मुझे पता चला है कि पॉइंटर: मोटे कुछ ऐसी चीज है जो अटैच्ड टेबल के सभी डेस्कटॉप ब्राउजर्स के लिए अज्ञात है लेकिन एक ही टेबल के सभी मोबाइल ब्राउजर्स के लिए जानी जाती है। यह सबसे प्रभावी विकल्प लगता है क्योंकि अन्य सभी पॉइंटर कीवर्ड मान असंगत परिणाम देते हैं।

इसलिए आप वर्णित कालसाल की तरह एक मीडिया क्वेरी का निर्माण कर सकते हैं लेकिन थोड़ा संशोधित किया जा सकता है। यह सभी स्पर्श उपकरणों को बाहर निकालने के लिए एक उलट तर्क का उपयोग करता है।

सास मिश्रण:

@mixin hover-supported {    
    /* 
     * https://developer.mozilla.org/en-US/docs/Web/CSS/@media/pointer 
     * coarse: The primary input mechanism includes a pointing device of limited accuracy.
     */
    @media not all and (pointer: coarse) {
        &:hover {
            @content;
        }
    }
}

a {
    color:green;
    border-color:blue;

    @include hover-supported() {
        color:blue;
        border-color:green;
    }
}

संकलित सीएसएस:

a {
  color: green;
  border-color: blue;
}
@media not all and (pointer: coarse) {
  a:hover {
    color: blue;
    border-color: green;
  }
}

समस्या का अनुसंधान करने के बाद बनाए गए इस जिस्ट में भी इसका वर्णन किया गया है। Codepenअनुभवजन्य अनुसंधान के लिए ।

अद्यतन : इस अद्यतन को लिखने के रूप में, 2018-08-23, और @DmitriPavlutin द्वारा बताया गया कि यह तकनीक अब फ़ायरफ़ॉक्स डेस्कटॉप के साथ काम नहीं करती है।


धन्यवाद @DmitriPavlutin, तालिका के अनुसार (जब यह संकलित किया गया था) यह होना चाहिए, लेकिन मैं एक और रूप ले सकता था।
प्रोग्रामरपर

@DmitriPavlutin आप वास्तव में सही हैं। उत्तर को अपडेट करेगा
प्रोग्रामर

1
आप इसका मतलब यह है कि यह फ़ायरफ़ॉक्स डेस्कटॉप पर काम नहीं करता है अगर एक विशेष रूप से स्पर्श डिवाइस के साथ प्रयोग किया जाता है? यह मेरे द्वारा आजमाई गई हर चीज के साथ बढ़िया काम करता है।
फजी लॉजेक

@FuzzeeLowgeek अच्छा लगता है! पिछली बार जब मैंने 2018-08-23 की जाँच की थी, तो यदि आप इस बात की पुष्टि कर सकते हैं, तो शायद मैं फिर से उत्तर को अपडेट कर सकता हूँ?
प्रोग्रामरर

9

जेसन के जवाब के अनुसार हम केवल उन उपकरणों को संबोधित कर सकते हैं जो शुद्ध सीएसएस मीडिया प्रश्नों के साथ हॉवर का समर्थन नहीं करते हैं। हम केवल उन उपकरणों को भी संबोधित कर सकते हैं जो होवर का समर्थन करते हैं, जैसे कि एक समान प्रश्न में moogal answers उत्तर@media not all and (hover: none) । यह अजीब लगता है लेकिन यह काम करता है।

मैंने आसान उपयोग के लिए इसमें से एक सैस मिक्सिन बनाया:

@mixin hover-supported {
    @media not all and (hover: none) {
        &:hover {
            @content;
        }
    }
}

अपडेट 2019-05-15 : मैं इस लेख को उन माध्यमों से सुझाता हूं जो सभी विभिन्न उपकरणों से गुजरते हैं जिन्हें हम CSS के साथ लक्षित कर सकते हैं। मूल रूप से यह इन मीडिया नियमों का मिश्रण है, उन्हें विशिष्ट लक्ष्यों के लिए संयोजित करें:

@media (hover: hover) {
    /* Device that can hover (desktops) */
}
@media (hover: none) {
    /* Device that can not hover with ease */
}
@media (pointer: coarse) {
    /* Device with limited pointing accuracy (touch) */
}
@media (pointer: fine) {
    /* Device with accurate pointing (desktop, stylus-based) */
}
@media (pointer: none) {
    /* Device with no pointing */
}

विशिष्ट लक्ष्यों के लिए उदाहरण:

@media (hover: none) and (pointer: coarse) {
    /* Smartphones and touchscreens */
}

@media (hover: hover) and (pointer: fine) {
    /* Desktops with mouse */
}

मुझे मिश्रण पसंद है, यह है कि मैं अपने होवर मिक्सिन का उपयोग केवल उन उपकरणों को लक्षित करने के लिए करता हूं जो इसका समर्थन करते हैं:

@mixin on-hover {
    @media (hover: hover) and (pointer: fine) {
        &:hover {
            @content;
        }
    }
}

button {
    @include on-hover {
        color: blue;
    }
}

यह बिल्कुल काम नहीं करता है। आपके पास हॉवर है: हॉवर-समर्थित मिक्सिन के लिए मीडिया क्वेरी में कोई नहीं? आपको सूचक की आवश्यकता है: यहाँ अन्य उत्तर के अनुसार मोटे।
एलन निएनहुइस

क्या आपने भी इसकी कोशिश की है या आप कहते हैं कि यह काम नहीं करता क्योंकि यह अजीब लगता है? इसलिए मैंने लिखा "यह अजीब लग रहा है" .. और यह मेरे लिए सूचक के बिना काम करता है: मोटे।
कालसाल

मेरे पास अपने OnePlus 5T (क्रोम और फ़ायरफ़िक्स दोनों में) पर सीएसएस-एप्रोच के साथ कुछ असंगत परिणाम थे। इसने iOS पर ठीक काम किया, लेकिन मैं इसे वनप्लस पर काम नहीं कर पाया। मैंने किसी भी पॉइंटर और किसी भी होवर
जेथ जूल

6

मैं वर्तमान में इसी तरह की समस्या से निपट रहा हूं।

दो मुख्य विकल्प हैं जो तुरंत मेरे पास आते हैं: (1) उपयोगकर्ता-स्ट्रिंग जाँच, या (2) एक अलग URL का उपयोग करके अलग-अलग मोबाइल पृष्ठों को बनाए रखना और उपयोगकर्ताओं को चुनना कि उनके लिए क्या बेहतर है।

  1. यदि आप इंटरनेट डक्ट-टेप भाषा जैसे कि PHP या रूबी का उपयोग करने में सक्षम हैं, तो आप पृष्ठ का अनुरोध करने वाले डिवाइस के उपयोगकर्ता स्ट्रिंग की जांच कर सकते हैं , और बस उसी सामग्री की सेवा कर सकते हैं लेकिन <link rel="mobile.css" />सामान्य शैली के बजाय।

उपयोगकर्ता तार में ब्राउज़र, रेंडरर, ऑपरेटिंग सिस्टम, आदि के बारे में जानकारी की पहचान करना है। यह आपको तय करना होगा कि डिवाइस "स्पर्श" बनाम गैर-स्पर्श क्या हैं। आप कहीं भी उपलब्ध इस जानकारी को पा सकते हैं और इसे अपने सिस्टम में मैप कर सकते हैं।

A. यदि आपको पुराने ब्राउज़रों को अनदेखा करने की अनुमति है , तो आपको केवल सामान्य, गैर-मोबाइल सीएसएस में एक नियम जोड़ना होगा, अर्थात्: EDIT : Erk। कुछ प्रयोग करने के बाद, मुझे पता चला कि नीचे का नियम भी वेबकिट-ब्राउज़र में लिंक का पालन करने की क्षमता को निष्क्रिय करने के अलावा निष्क्रिय करने की क्षमता को अक्षम करता है - http://jsfiddle.net/3nkcdeao/ देखें
, जैसे कि, आपके पास होगा थोड़ा और अधिक चयनात्मक होने के लिए कि आप मोबाइल केस के नियमों को कैसे संशोधित करते हैं, जो मैं यहाँ दिखा रहा हूँ, लेकिन यह एक उपयोगी शुरुआती विकल्प हो सकता है:

* { 
    pointer-events: none !important; /* only use !important if you have to */
}

एक माता-पिता के रूप में, माता-पिता पर सूचक-घटनाओं को अक्षम करना और फिर बच्चे पर उन्हें स्पष्ट रूप से सक्षम करना वर्तमान में यदि बच्चे-तत्व में प्रवेश करता है, तो माता-पिता पर कोई भी हॉवर-प्रभाव फिर से सक्रिय हो जाता है :hoverHttp://jsfiddle.net/38Lookhp/5/
देखें

B. यदि आप विरासत वेब-रेंडरर्स का समर्थन कर रहे हैं, तो आपको किसी भी नियम को हटाने की तर्ज पर थोड़ा और काम करना होगा जो विशेष शैलियों को सेट करते हैं :hover। हर किसी के समय को बचाने के लिए, आप बस एक स्वचालित प्रतिलिपि + sed आईएनजी कमांड का निर्माण करना चाहते हैं, जिसे आप मोबाइल संस्करण बनाने के लिए अपने मानक स्टाइल शीट पर चलाते हैं। यह आपको मानक कोड को लिखने / अपडेट करने और :hoverआपके पेज के मोबाइल संस्करण के लिए उपयोग किए जाने वाले किसी भी शैली-नियम को दूर करने की अनुमति देगा ।

  1. (I) वैकल्पिक रूप से, अपने उपयोगकर्ताओं को इस बात से अवगत कराएं कि आपके पास अपनी वेबसाइट.कॉम के अलावा मोबाइल उपकरणों के लिए m.website.com है । हालांकि उपडोमेनिंग सबसे आम तरीका है, आप किसी दिए गए URL के कुछ अन्य पूर्वानुमान योग्य संशोधन भी कर सकते हैं जिससे मोबाइल उपयोगकर्ताओं को संशोधित पृष्ठों तक पहुंचने की अनुमति मिल सके। उस समय, आप यह सुनिश्चित करना चाहेंगे कि उन्हें हर बार साइट के किसी अन्य हिस्से में नेविगेट करने की आवश्यकता नहीं है।

यहां फिर से, आप स्टाइलशीट में केवल एक अतिरिक्त नियम या दो जोड़ने में सक्षम हो सकते हैं या sed या इसी तरह की उपयोगिता का उपयोग करके कुछ अधिक जटिल करने के लिए मजबूर हो सकते हैं । यह लागू करना सबसे आसान होगा: अपने स्टाइलिंग नियमों के लिए नहीं, div:not(.disruptive):hover {...जिसमें आप class="disruptive"सीएसएस का उपयोग करने के बजाय js या सर्वर भाषा का उपयोग करने वाले मोबाइल उपयोगकर्ताओं के लिए कष्टप्रद चीजें करने वाले तत्वों को जोड़ देंगे ।

  1. (II) आप वास्तव में पहले दो को जोड़ सकते हैं और (यदि आपको संदेह है कि कोई उपयोगकर्ता किसी पृष्ठ के गलत संस्करण में भटक गया है) तो आप सुझाव दे सकते हैं कि वे मोबाइल-प्रकार के डिस्प्ले में / बाहर स्विच करते हैं, या बस कहीं एक लिंक है जो उपयोगकर्ताओं को आगे और पीछे फ़्लॉप करने की अनुमति देता है। जैसा कि पहले ही कहा गया है, @media क्वेरीज़ यह निर्धारित करने में उपयोग करने के लिए कुछ हो सकती हैं कि यात्रा के लिए क्या उपयोग किया जा रहा है।

  2. (III) यदि आप एक jQuery समाधान के लिए तैयार हैं, तो एक बार जब आप जानते हैं कि कौन से उपकरण "स्पर्श" हैं और जो नहीं हैं, तो आप पा सकते हैं कि सीएसएस होवर को टच-स्क्रीन उपकरणों पर ध्यान नहीं दिया जा रहा है


pointer-events- वह आश्चर्यजनक है! यह वही है जो मैं देख रहा था, बहुत बहुत धन्यवाद!
साइमन फेरिंडर

1
@SimonFerndriger खैर, मुझे आशा है कि यह आगे बढ़ने में सहायक है। यह सुनिश्चित करना कि कैवियट को डेट करना है, <a>लिंक के तहत दुर्गम हो सकता है pointer-events:none। किसी भी भाग्य के साथ, जो बाद में बदल जाएगा - या सीएसएस 3.x या 4.0+ में pointer-events:navigation-onlyया समान होगा।
सेलेडमनीडे

6

इसे इस्तेमाल करे:

@media (hover:<s>on-demand</s>) {
    button:hover {
        background-color: #color-when-NOT-touch-device;
    }
}

अद्यतन: दुर्भाग्य से W3C ने इस संपत्ति को ऐनक ( https://github.com/w3c/csswg-drafts/commit/2078b46218f7462735bb0b5107c9b3e84fb4c4b1 ) से हटा दिया है ।


यह वास्तव में समस्या को हल करेगा। ऐसा मैंने पहले कभी नहीं सुना। यह किस ब्राउज़र संस्करण में काम करने वाला है?
साइमन फेरिन्ड्रिगर

3
@SimonFerndriger caniuse.com/#feat=css-media-interaction और कुछ और जानकारी: dev.opera.com/articles/media-features
Skeptic

अच्छा ... इसका विस्तृत ब्राउज़र समर्थन नहीं है।
जियाकोमो पिटा

यह अच्छा है! ऐसे सुविधाजनक समाधान के लिए धन्यवाद। मुझे उम्मीद है कि इसे W3C मानकों में जोड़ा जाएगा।
जीपीरोस्ट

मुझे खुशी है कि मैं मदद कर सकता हूं ^ ^
मारूएन मिरि

5

आप Modernizr JS (यह StackOverflow उत्तर भी देखें ) का उपयोग कर सकते हैं , या एक कस्टम JS फ़ंक्शन बना सकते हैं:

function is_touch_device() {
 return 'ontouchstart' in window        // works on most browsers 
  || navigator.maxTouchPoints;       // works on IE10/11 and Surface
};

if ( is_touch_device() ) {
  $('html').addClass('touch');
} else {
  $('html').addClass('no-touch');
} 

करने के लिए स्पर्श के समर्थन का पता लगाने ब्राउज़र में घटना है, और फिर एक नियमित रूप से आवंटित CSSसंपत्ति, साथ तत्व traversing html.no-touchवर्ग, इस तरह:

html.touch a {
    width: 480px;
}

/* FOR THE DESKTOP, SET THE HOVER STATE */
html.no-touch a:hover {
   width: auto;
   color:blue;
   border-color:green;
}

@Blade द्वारा भी यह सुझाव दिया गया था - हालांकि, htmlटैग के बजाय टैग का उपयोग करने से bodyयह पढ़ने में थोड़ा बेहतर हो सकता है। यह वास्तव में समाधान है जो मैं वर्तमान में उपयोग कर रहा हूं। वैसे भी धन्यवाद।
साइमन फेरीन्डरर

1

यह मेरे लिए उपयोगी था: लिंक

function hoverTouchUnstick() {
    // Check if the device supports touch events
    if('ontouchstart' in document.documentElement) {
        // Loop through each stylesheet
        for(var sheetI = document.styleSheets.length - 1; sheetI >= 0; sheetI--) {
            var sheet = document.styleSheets[sheetI];
            // Verify if cssRules exists in sheet
            if(sheet.cssRules) {
                // Loop through each rule in sheet
                for(var ruleI = sheet.cssRules.length - 1; ruleI >= 0; ruleI--) {
                    var rule = sheet.cssRules[ruleI];
                    // Verify rule has selector text
                    if(rule.selectorText) {
                        // Replace hover psuedo-class with active psuedo-class
                        rule.selectorText = rule.selectorText.replace(":hover", ":active");
                    }
                }
            }
        }
    }
}

1

यह भी एक संभव समाधान है, लेकिन आपको अपने सीएसएस के माध्यम से जाना होगा और .no-touchअपने होवर शैलियों से पहले एक वर्ग जोड़ना होगा ।

जावास्क्रिप्ट:

if (!("ontouchstart" in document.documentElement)) {
document.documentElement.className += " no-touch";
}

सीएसएस उदाहरण:

<style>
p span {
    display: none;
}

.no-touch p:hover span {
    display: inline;
}
</style>
<p><a href="/">Tap me</a><span>You tapped!</span></p>

स्रोत

Ps लेकिन हमें याद रखना चाहिए, बाजार में अधिक से अधिक टच-डिवाइस आ रहे हैं, जो एक ही समय में माउस इनपुट का भी समर्थन कर रहे हैं।


0

यह अभी तक एक सही समाधान नहीं हो सकता है (और यह jQuery के साथ है), लेकिन हो सकता है कि यह काम करने के लिए एक दिशा / अवधारणा है: इसे दूसरे तरीके से करने के बारे में क्या? जिसका अर्थ है: हॉवर सीएसएस राज्यों को डिफ़ॉल्ट रूप से निष्क्रिय करना और उन्हें सक्रिय करना यदि दस्तावेज़ पर कहीं भी मूसमव इवेंट का पता चला हो। बेशक यह काम नहीं करता है अगर कोई व्यक्ति js को निष्क्रिय कर दे। इस तरह गोल करने के खिलाफ और क्या बोल सकते हैं?

शायद इस तरह:

सीएसएस:

/* will only work if html has class "mousedetected" */
html.mousedetected a:hover {
   color:blue;
   border-color:green;
}

jQuery:

/* adds "mousedetected" class to html element if mouse moves (which should never happen on touch-only devices shouldn’t it?) */
$("body").mousemove( function() {
    $("html").addClass("mousedetected");
});

1
एक समस्या वास्तव में यह है कि यह भी एक .mousemove () जब स्पर्श उपकरणों पर कुछ पर क्लिक कर रहा है।
को १२:१६ तक लार्स अपग्रेड

1
और आप शायद इस घटना को गैर-रोक देंगे, जिससे प्रदर्शन पर असर पड़ेगा। यदि यह काम करेगा, तो आपको बेहतर उपयोग करना चाहिए$('body').one.('mousemove', ...)
साइमन फेरिंड्रर

0

इसे आज़माएँ (मैं इस उदाहरण में पृष्ठभूमि और पृष्ठभूमि-रंग का उपयोग करता हूँ):

var ClickEventType = ((document.ontouchstart !== null) ? 'click' : 'touchstart');

if (ClickEventType == 'touchstart') {
            $('a').each(function() { // save original..
                var back_color = $(this).css('background-color');
                var background = $(this).css('background');
                $(this).attr('data-back_color', back_color);
                $(this).attr('data-background', background);
            });

            $('a').on('touchend', function(e) { // overwrite with original style..
                var background = $(this).attr('data-background');
                var back_color = $(this).attr('data-back_color');
                if (back_color != undefined) {
                    $(this).css({'background-color': back_color});
                }
                if (background != undefined) {
                    $(this).css({'background': background});
                }
            }).on('touchstart', function(e) { // clear added stlye="" elements..
                $(this).css({'background': '', 'background-color': ''});
            });
}

सीएसएस:

a {
    -webkit-touch-callout: none;
    -webkit-tap-highlight-color: transparent;
    -webkit-user-select: none;
    -khtml-user-select: none;
    -moz-user-select: none;
    -ms-user-select: none;
    user-select: none;
}

0

गंदा तरीका ... सुरुचिपूर्ण नहीं, लेकिन सबसे आसान तरीका जो आपको बचा सकता है।

कुछ भी निकालें जो होवर की विशेषता है।

.your-class:hover:before {
  color: blue;
  background: linear-gradient(to bottom, rgba(231,56,39,0) 0%, #aaaaaa 100%);
}

@media all and (min-width:320px) and (max-width: 960px) {
    .your-class:hover:before {
    color: black;
    background: transparent;
  }
}

0

यदि आपका मुद्दा तब होता है जब आप एंड्रॉइड पर टच / टैप करते हैं और नीले पारदर्शी रंग से पूरी तरह से कवर किया जाता है! फिर आपको बस बदलने की जरूरत है

कूर्स: पॉइंटर; CURSOR: DEFAULT;

मोबाइल फोन / टेबलेट में छिपाने के लिए MediaQuery का उपयोग करें।

यह मेरे लिए काम करता है।


-1

इस आसान 2019 jquery समाधान का प्रयास करें, हालांकि यह थोड़ी देर के आसपास रहा;

  1. इस प्लगइन को सिर में जोड़ें:

    src = "https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"

  2. इसे js में जोड़ें:

    $ ("*")। ("टचेंड", फ़ंक्शन (ई) {$ (यह) .फोकस ();}); // सभी तत्वों पर लागू होता है

  3. इसके लिए कुछ सुझाए गए रूपांतर हैं:

    $ (": इनपुट, चेकबॉक्स,")। ("टचेंड", फ़ंक्शन (ई) {(यह) .focus)}}); // तत्वों को निर्दिष्ट करें

    $ ("*")। ("क्लिक, टचेंड", फ़ंक्शन (ई) {$ (यह) .फोकस ();}) पर; // क्लिक इवेंट शामिल करें

    सीएसएस: शरीर {कर्सर: सूचक; } // ध्यान केंद्रित करने के लिए कहीं भी स्पर्श करें

टिप्पणियाँ

  • टूलटिप्स को प्रभावित करने के लिए बूटस्ट्रैप.js से पहले प्लगइन रखें
  • केवल सफारी या क्रोम का उपयोग करके iPhone XR ios 12.1.12 और ipad 3 ios 9.3.5 पर परीक्षण किया गया।

संदर्भ:

https://code.jquery.com/ui/

https://api.jquery.com/category/selectors/jquery-selector-extensions/


2
2019 में आपको jQuery का उपयोग करने की आवश्यकता नहीं होनी चाहिए - WebAPI बहुत शक्तिशाली है और सभी प्रमुख विशेषताओं का समर्थन करता है।
acme

हां ... 2019 में jQuery? कुछ फ्लैश के बारे में कैसे? Hehehe।
प्रात
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.