कैसे स्पर्श उपकरणों पर बटन के लिए चिपचिपा होवर प्रभाव को रोकने के लिए


144

मैंने पिछले और अगले बटन के साथ एक हिंडोला बनाया है जो हमेशा दिखाई देता है। इन बटनों में एक हॉवर अवस्था होती है, वे नीले रंग की हो जाती हैं। टच डिवाइस पर, iPad की तरह, होवर स्टेट चिपचिपा होता है, इसलिए बटन टैप करने के बाद नीला हो जाता है। मैं ऐसा नहीं चाहता।

  • मैं प्रत्येक बटन के लिए एक no-hoverवर्ग जोड़ सकता हूं ontouchend, और अपने सीएसएस को इस तरह बना सकता हूं: button:not(.no-hover):hover { background-color: blue; }लेकिन यह शायद प्रदर्शन के लिए काफी खराब है, और क्रोमबुक पिक्सेल (जिसमें टचस्क्रीन और माउस दोनों) जैसे उपकरणों को सही ढंग से नहीं संभालता है।

  • मैं इसमें एक touchवर्ग जोड़ सकता हूं documentElementऔर अपने सीएसएस को इस तरह बना सकता हूं: html:not(.touch) button:hover { background-color: blue; }लेकिन यह भी स्पर्श और माउस दोनों के साथ उपकरणों पर सही काम नहीं करता है।

मैं जो पसंद करूंगा वह होवर राज्य को हटा देगा ontouchend। लेकिन ऐसा लगता नहीं है कि यह संभव है। किसी अन्य तत्व पर ध्यान केंद्रित करने से हॉवर स्थिति को हटाया नहीं जाता है। किसी अन्य तत्व को मैन्युअल रूप से टैप करना, लेकिन मैं इसे जावास्क्रिप्ट में ट्रिगर नहीं कर सकता।

सभी समाधान मैंने पाया अपूर्ण लगता है। क्या कोई सही समाधान है?

जवाबों:


55

आप DOM से लिंक को अस्थायी रूप से हटाकर होवर स्टेट को हटा सकते हैं। Http://testbug.handcraft.com/ipad.html देखें


आपके पास सीएसएस में:

:hover {background:red;}

जेएस में आपके पास:

function fix()
{
    var el = this;
    var par = el.parentNode;
    var next = el.nextSibling;
    par.removeChild(el);
    setTimeout(function() {par.insertBefore(el, next);}, 0)
}

और फिर आपके HTML में:

<a href="#" ontouchend="this.onclick=fix">test</a>

3
@ क्रिस अच्छा बिंदु, मैंने ontouchend इवेंट में ऑनक्लिक हैंडलर सेट करने के लिए उदाहरण बदल दिया।
सोज़ेरड विसेर

4
कृपया अपने उत्तर में न्यूनतम प्रदर्शनकारी कोड जोड़ने पर विचार करें। धन्यवाद! stackoverflow.com/help/how-to-answer
2540625

1
@SjoerdVisscher मैंने इसे पेस्ट कर दिया है। StackOverflow को उत्तर में रहना पसंद है, क्योंकि लिंक दूर जा सकते हैं। (और इस मामले में इसे न केवल क्लिक करने की आवश्यकता है, बल्कि फिर स्रोत को देखना है, और बाहर काम करना है जो कि बिट में तकनीक है।)
डैरेन कुक

2
कुछ उपकरणों पर @KevinBorders हाँ तत्वों को हटाने और पुन: स्थापित करने वाले के बीच देरी बहुत ही ध्यान देने योग्य हो सकती है। दुर्भाग्य से, मैंने अपने एंड्रॉइड 4.4 डिवाइस पर पाया कि यह बिना सेटटाइमआउट के काम नहीं करता था।
रॉडने

1
विचार दिलचस्प है, लेकिन मैंने इसे थोड़ा झटकेदार पाया और सभी स्पर्श उपकरणों पर व्यापक रूप से समर्थन नहीं किया। मैं इस तरह के stackoverflow.com/a/39787268/885464 की
लोरेंजो पोलिडोरी

83

एक बार CSS Media Queries Level 4 लागू होने के बाद, आप ऐसा कर पाएंगे:

@media (hover: hover) {
    button:hover {
        background-color: blue;
    }
}

या अंग्रेजी में: "यदि ब्राउज़र उचित / सच / वास्तविक / गैर-उत्सर्जित होवरिंग का समर्थन करता है (जैसे कि माउस जैसा प्राथमिक इनपुट डिवाइस है), तो इस शैली को तब लागू करें जब buttons होवर हो।"

चूंकि मीडिया क्वैरीज़ लेवल 4 का यह हिस्सा अभी तक केवल ब्लीडिंग-एज क्रोम में लागू किया गया है, इसलिए मैंने इससे निपटने के लिए एक पॉलीफ़िल लिखा । इसका उपयोग करके, आप उपरोक्त भविष्य के सीएसएस को इसमें बदल सकते हैं:

html.my-true-hover button:hover {
    background-color: blue;
}

( .no-touchतकनीक पर एक भिन्नता ) और फिर उसी पॉलीफिल से कुछ क्लाइंट-साइड जावास्क्रिप्ट का उपयोग करना जो हॉवरिंग के लिए समर्थन का पता लगाता है, आप my-true-hoverतदनुसार कक्षा की उपस्थिति को टॉगल कर सकते हैं :

$(document).on('mq4hsChange', function (e) {
    $(document.documentElement).toggleClass('my-true-hover', e.trueHover);
});

धन्यवाद! मेरे उद्देश्यों के लिए यह सबसे ब्राउज़र caniuse.com/#search=media%20queries में समर्थित प्रतीत होता है और शानदार ढंग से काम करता है, धन्यवाद!
रागमुफिन

3
आपको इसके बजाय caniuse.com/#feat=css-media-interaction देखने की आवश्यकता है और आप देखेंगे कि यह फ़ायरफ़ॉक्स और IE11 में समर्थित नहीं है :( इसलिए आपको
पॉलीफ़िल की

ऐसा लगता है कि पॉलीफ़िल अब समर्थित नहीं है (रेपो संग्रहीत है) और इसे jQuery की आवश्यकता है ...
amoebe

यह अब मोबाइल ब्राउज़रों में व्यापक रूप से समर्थित है, और एक आकर्षण की तरह काम करता है। मुझे लगता है कि यह स्वीकृत उत्तर होना चाहिए।
ट्रेवर बर्नहैम

यह निश्चित रूप से लागू करने के लिए सबसे आसान और सबसे अच्छा जवाब है। एंड्रॉइड मोबाइल और पीसी पर फ़ायरफ़ॉक्स में काम करता है। दोहरे स्पर्श और माउस उपकरणों के बारे में निश्चित नहीं है।
हॉफमेन

28

यह एक आम समस्या है जिसका कोई सही समाधान नहीं है। हॉवर व्यवहार एक माउस के साथ उपयोगी है और ज्यादातर स्पर्श के साथ हानिकारक है। समस्या को हल करने वाले उपकरण हैं जो क्रोमबुक पिक्सेल और सरफेस की तरह टच और माउस (एक साथ, कम नहीं!) का समर्थन करते हैं।

अगर मैंने डिवाइस को टच इनपुट का समर्थन करने के लिए नहीं समझा है, तो मैंने जो सबसे साफ समाधान पाया है, वह केवल हॉवर व्यवहार को सक्षम करने के लिए है।

var isTouch =  !!("ontouchstart" in window) || window.navigator.msMaxTouchPoints > 0;

if( !isTouch ){
    // add class which defines hover behavior
}

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

मैंने इसे iPhone, iPad, Chromebook Pixel, Surface, और विभिन्न Android उपकरणों पर परीक्षण किया है। मैं इस बात की गारंटी नहीं दे सकता कि जब एक सामान्य USB टच इनपुट (जैसे स्टाइलस) मिक्स में जोड़ा जाएगा तो यह काम करेगा।


1
बहुत बढ़िया, यह मेरे लिए काम कर रहा था, कम्युनिटी विकी / डैरेन कुक के जवाब के विपरीत।
जननिक २५'१६ को

1
अच्छा उत्तर। यह एक समान समाधान है: stackoverflow.com/a/39787268/885464
लोरेंजो पोलिडोरी

11

माडर्निज़्र के साथ आप विशेष रूप से नो-टच डिवाइस के लिए अपने होवर को लक्षित कर सकते हैं:

(नोट: यह StackOverflow के स्निपेट सिस्टम पर नहीं चलता है, इसके बजाय jsfiddle की जाँच करें )

/* this one is sticky */
#regular:hover, #regular:active {
  opacity: 0.5;
}

/* this one isn't */
html.no-touch #no-touch:hover, #no-touch:active {
  opacity: 0.5;
}

ध्यान दें कि :activeइसके साथ लक्षित होने की आवश्यकता नहीं है .no-touchक्योंकि यह मोबाइल और डेस्कटॉप दोनों पर अपेक्षित है।


यह सबसे अच्छा जवाब है IMO लेकिन उदाहरण गलत है। यह टच और नॉन-टच डिवाइस के लिए एक ही होवर स्टेट दिखा रहा है। यह केवल होवर स्थिति को लागू करना चाहिए यदि टैग .no-touchपर मौजूद है html। अन्यथा, इस उत्तर को मेरी स्वीकृति की मुहर मिल जाती है।
morrisbret

2
समस्या यह है कि अब माउस-सक्षम डिवाइस जिनके पास टच स्क्रीन हैं वे सभी जगह हैं, आप वास्तव में इस पद्धति पर अब और भरोसा नहीं कर सकते। हालांकि मैं इसे करने के लिए एक और तरीका नहीं देख सकता ... यह काफी दुविधा है
dudewad

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

आप उद्धारकर्ता हैं बहुत बहुत धन्यवाद यह मोबाइल उपकरणों के लिए पूरी तरह से काम करता है
शिवम

9

आप उन उपकरणों के लिए हॉवर प्रभाव को ओवरराइड कर सकते हैं जो हॉवर का समर्थन नहीं करते हैं। पसंद:

.my-thing {
    color: #BADA55;
}

.my-thing:hover {
    color: hotpink;
}

@media (hover: none) {
    .my-thing {
        color: #BADA55;
    }
}

IOS 12 पर परीक्षण और सत्यापित

इसे इंगित करने के लिए हाट टिप https://stackoverflow.com/a/50285058/178959 पर


यह अधिक आधुनिक समाधान है, कोई जावास्क्रिप्ट या DOM में हेरफेर की आवश्यकता नहीं है, इसमें पूर्ण ब्राउज़र समर्थन (IE को छोड़कर) और स्वीकृत उत्तर होना चाहिए।
फंकजू

8
$("#elementwithhover").click(function() { 
  // code that makes element or parent slide or otherwise move out from under mouse. 

  $(this).clone(true).insertAfter($(this));
  $(this).remove();
});

आप एक क्लिक () के बजाय एक () का उपयोग करके इस उत्तर को बेहतर बना सकते हैं। DOM से तत्व को हटाकर और इसे फिर से अटैच करके, मैंने अपने क्लिक इवेंट खो दिए हैं। जब मैं अपने फ़ंक्शन को ऑन के साथ फिर से लिखता हूं, तो तत्व को बाध्य करता है, फिर हटाए और जोड़े गए काम करता है। उदाहरण के लिए: `$ ('बॉडी')। ('' क्लिक '', '' एलीमेंटविथओवर '', फंक्शन () {// क्लोन, इंसर्ट के बाद, निकालें}); अगर आप यह बदलाव करते हैं तो मैं इसे वोट करूंगा।
विल लैनी

क्लोन सही तत्व के स्थान पर नए हाथी पर क्लिक किए जाने की घटना को रोकता है। इसके क्लोन के बाद मूल तत्व को डोम से हटाया जा रहा है।
वर्लड स्लॉगगेट

भयानक भाई, 10x
कालोयान स्टमाटोव

एक घंटे के लिए खोज और यह अंत में एक प्रदान की है। बहुत - बहुत धन्यवाद!
दर्शन

8

से मोबाइल पर चिपचिपा मंडराना के साथ सौदा करने के लिए 4 तरीके : यहाँ एक तरह से करने के लिए गतिशील रूप से जोड़ सकते हैं या एक "को दूर है can touchउपयोगकर्ता की वर्तमान इनपुट प्रकार के आधार पर दस्तावेज़ में" वर्ग। यह हाइब्रिड उपकरणों के साथ काम करता है जहां उपयोगकर्ता स्पर्श और माउस / ट्रैकपैड के बीच स्विच कर सकता है:

<script>

;(function(){
    var isTouch = false //var to indicate current input type (is touch versus no touch) 
    var isTouchTimer 
    var curRootClass = '' //var indicating current document root class ("can-touch" or "")

    function addtouchclass(e){
        clearTimeout(isTouchTimer)
        isTouch = true
        if (curRootClass != 'can-touch'){ //add "can-touch' class if it's not already present
            curRootClass = 'can-touch'
            document.documentElement.classList.add(curRootClass)
        }
        isTouchTimer = setTimeout(function(){isTouch = false}, 500) //maintain "istouch" state for 500ms so removetouchclass doesn't get fired immediately following a touch event
    }

    function removetouchclass(e){
        if (!isTouch && curRootClass == 'can-touch'){ //remove 'can-touch' class if not triggered by a touch event and class is present
            isTouch = false
            curRootClass = ''
            document.documentElement.classList.remove('can-touch')
        }
    }

    document.addEventListener('touchstart', addtouchclass, false) //this event only gets called when input type is touch
    document.addEventListener('mouseover', removetouchclass, false) //this event gets called when input type is everything from touch to mouse/ trackpad
})();

</script>

यह मेरे लिए सबसे अच्छा तरीका है, साथ ही अगर आप टाइमर को 1000ms तक बढ़ाते हैं तो आप लॉन्ग-प्रेस को भी कवर कर सकते हैं, यहाँ देखें । उत्तम सामग्री!
लोटेकसून

3

मैं अपना खुद का समाधान पोस्ट करने जा रहा था, लेकिन अगर कोई पहले से ही पोस्ट कर रहा है, तो मैंने पाया कि @Rodney ने लगभग ऐसा ही किया है। हालांकि, उन्होंने इसे एक आखिरी निर्णायक चूक दिया, जिसने इसे कम से कम मेरे मामले में एक जैसा बना दिया। मेरा मतलब है, मैंने भी उसी .fakeHoverवर्ग को जोड़ा / हटाया mouseenterऔर mouseleaveघटना का पता लगाया, लेकिन वह भी, प्रति से , लगभग "वास्तविक" की तरह काम करता है :hover। मेरा मतलब है: जब आप अपनी तालिका में एक तत्व पर टैप करते हैं, तो यह पता नहीं चलेगा कि आपने इसे "लीव्ड" कर दिया है - इस प्रकार "नकली" स्थिति को बनाए रखते हुए।

मैंने जो किया वह बस सुनने के लिए था click, इसलिए जब मैं बटन को "टैप" करता हूं, तो मैं मैन्युअल रूप से फायर करता हूं mouseleave

Si यह मेरा अंतिम कोड है:

.fakeHover {
    background-color: blue;
}


$(document).on('mouseenter', 'button.myButton',function(){
    $(this).addClass('fakeHover');
});

$(document).on('mouseleave', 'button.myButton',function(){
    $(this).removeClass('fakeHover');
});

$(document).on('button.myButton, 'click', function(){
    $(this).mouseleave();
});

इस तरह आप hoverअपने बटनों पर "हॉवरिंग" करते समय माउस का उपयोग करते हुए अपनी सामान्य कार्यक्षमता बनाए रखते हैं। खैर, यह लगभग सभी: किसी तरह एकमात्र दोष यह है कि, माउस के साथ बटन पर क्लिक करने के बाद, यह hoverराज्य में नहीं होगा। बहुत पसंद है अगर आपने क्लिक किया और जल्दी से पॉइंटर को बटन से बाहर निकाला। लेकिन मेरे मामले में मैं उसके साथ रह सकता हूं।


2

बाकी के जवाबों का अध्ययन करने के बाद अब तक मैं यही करता आया हूं। यह टच-ओनली, माउस-ओनली या हाइब्रिड यूजर्स को सपोर्ट करने में सक्षम होना चाहिए।

होवर प्रभाव के लिए एक अलग होवर वर्ग बनाएं। डिफ़ॉल्ट रूप से, इस होवर वर्ग को हमारे बटन में जोड़ें।

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

अगली समस्या यह है कि यदि उपयोगकर्ता बटन को छूने के बाद माउस का उपयोग करना चाहता है, तो क्या होगा? इसे हल करने के लिए, हमें हॉवर वर्ग को वापस जोड़ने के लिए एक उपयुक्त क्षण खोजने की आवश्यकता है जिसे हमने हटा दिया है।

हालाँकि, हम इसे हटाने के तुरंत बाद वापस नहीं जोड़ सकते, क्योंकि होवर स्थिति अभी भी सक्रिय है। हम पूरे बटन को भी नष्ट करना और बहलाना नहीं चाह सकते।

इसलिए, मैंने हॉवर स्थिति की जांच करने के लिए एक व्यस्त-प्रतीक्षा एल्गोरिथ्म (सेटइंटरवल का उपयोग करके) का उपयोग करने के बारे में सोचा। एक बार होवर स्थिति को निष्क्रिय कर देने के बाद, हम फिर से होवर क्लास को वापस जोड़ सकते हैं और व्यस्त-प्रतीक्षा को रोक सकते हैं, हमें मूल स्थिति में वापस ला सकते हैं जहां उपयोगकर्ता माउस या स्पर्श का उपयोग कर सकता है।

मुझे पता है कि व्यस्त-प्रतीक्षा इतनी बड़ी नहीं है लेकिन मुझे यकीन नहीं है कि कोई उपयुक्त घटना है। मैंने इसे मूसलीव इवेंट में वापस जोड़ने पर विचार किया है, लेकिन यह बहुत मजबूत नहीं था। उदाहरण के लिए, जब बटन छुआ जाने के बाद कोई अलर्ट आता है, तो माउस स्थिति बदल जाती है, लेकिन मूसलीव इवेंट चालू नहीं होता है।

var button = document.getElementById('myButton');

button.ontouchstart = function(e) {
  console.log('ontouchstart');
  $('.button').removeClass('button-hover');
  startIntervalToResetHover();
};

button.onclick = function(e) {
  console.log('onclick');
}

var intervalId;

function startIntervalToResetHover() {
  // Clear the previous one, if any.
  if (intervalId) {
    clearInterval(intervalId);
  }
  
  intervalId = setInterval(function() {
    // Stop if the hover class already exists.
    if ($('.button').hasClass('button-hover')) {
      clearInterval(intervalId);
      intervalId = null;
      return;
    }
    
    // Checking of hover state from 
    // http://stackoverflow.com/a/8981521/2669960.
    var isHovered = !!$('.button').filter(function() {
      return $(this).is(":hover");
    }).length;
    
    if (isHovered) {
      console.log('Hover state is active');
    } else {
      console.log('Hover state is inactive');
      $('.button').addClass('button-hover');
      console.log('Added back the button-hover class');
      
      clearInterval(intervalId);
      intervalId = null;
    }
  }, 1000);
}
.button {
  color: green;
  border: none;
}

.button-hover:hover {
  background: yellow;
  border: none;
}

.button:active {
  border: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id='myButton' class='button button-hover'>Hello</button>

संपादित करें: एक और तरीका जो मैंने आजमाया है, वह है e.preventDefault()ऑनटचस्टार्ट या ऑनटचेंड के भीतर कॉल करना। यह बटन को छूने पर होवर प्रभाव को रोकने के लिए प्रकट होता है, लेकिन यह बटन क्लिक एनीमेशन को भी रोकता है और ऑनक्लिक फ़ंक्शन को बटन को छूने से रोकता है, इसलिए आपको उन लोगों को मैन्युअल रूप से ऑनटचस्टार्ट या ऑनकचेंड हैंडलर में कॉल करना होगा। बहुत साफ समाधान नहीं है।


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

आपको वैश्विक ontouchstart इवेंट हैंडलर से एक बार hoverTouchUnstick () कॉल करने की आवश्यकता है। और यह समाधान पूरी तरह से काम करेगा।
जुसिड

1

इस JS कोड को अपने पेज में जोड़ें:

document.body.className = 'ontouchstart' in document.documentElement ? '' : 'hover';

अब अपने CSS में हर hover से पहले hover class को इस तरह से जोड़ें:

.hover .foo:hover {}

यदि उपकरण स्पर्श करता है, तो बॉडी क्लास खाली हो जाएगा, अन्यथा उसकी कक्षा होवर हो जाएगी और नियम लागू हो जाएंगे!


मेरे लिए काम नहीं किया, लेकिन यह किया:document.body.className = 'ontouchstart' in window ? '' : 'hover';
dramester

1

मैं प्रत्येक बटन के लिए एक नो-होवर क्लास ऑनटच जोड़ सकता था, और अपना सीएसएस जैसा बना सकता हूं> यह: बटन: नहीं (.नो-होवर): होवर {पृष्ठभूमि-रंग: नीला; } लेकिन यह संभवतः प्रदर्शन के लिए काफी बुरा है, और Chrome बुक पिक्सेल (जिसमें टचस्क्रीन और माउस दोनों) है, जैसे उपकरणों को सही ढंग से हैंडल नहीं करता है।

यह सही शुरुआती बिंदु है। अगला चरण: निम्नलिखित घटनाओं पर nohover वर्ग को लागू / हटाएं (jQuery के साथ डेमो)

buttonelement
 .on("touchend touchcancel",function(){$(this).addClass("nohover")})
 .on("touchstart mouseover",function({$(this).removeClass("nohover")});   

सूचना: यदि आप अन्य वर्गों को बटोनमेंट के लिए आवेदन करना चाहते हैं, तो CSS (: .nohover) में सीएसएस अपेक्षा के अनुरूप काम नहीं करेगा। आपको डिफ़ॉल्ट मान के साथ एक अलग परिभाषा के बजाय जोड़ना होगा और होवर शैली को अधिलेखित करने के लिए महत्वपूर्ण टैग: .nohover {पृष्ठभूमि-रंग: सफेद! महत्वपूर्ण!}

यहां तक ​​कि इसे Chromebook Pixel (जिसमें टचस्क्रीन और माउस दोनों हैं) जैसे उपकरणों को सही तरीके से हैंडल करना चाहिए! और मुझे नहीं लगता, कि यह एक प्रमुख प्रदर्शन हत्यारा है ...


1

एक समाधान जो मेरे लिए काम किया है:

html {
   -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}

इस कोड को अपनी स्टाइलशीट में जोड़ें।

मैं एक लिंक पर क्लिक करने पर आईओएस सफारी पर दिखाई देने वाली ग्रे पृष्ठभूमि से छुटकारा पाना चाहता था। लेकिन यह और अधिक प्रतीत होता है। अब एक बटन (एक :hoverpseudoclass के साथ ) पर क्लिक करने से तुरंत खुल जाता है! मैंने केवल एक iPad पर इसका परीक्षण किया, मुझे नहीं पता कि यह अन्य उपकरणों पर काम करेगा या नहीं।


1

मुझे लगता है कि मैंने इसी तरह की समस्या के लिए एक सुरुचिपूर्ण (न्यूनतम js) समाधान पाया है:

JQuery का उपयोग करके, आप शरीर (या किसी अन्य तत्व) पर होवर को ट्रिगर कर सकते हैं, का उपयोग कर .mouseover()

इसलिए मैं इस हैंडलर को तत्व की ontouchendघटना में संलग्न करता हूं जैसे:

var unhover = function() {
  $("body").mousover();  
};
.hoverable {
  width: 100px;
  height: 100px;
  background: teal;
  cursor: pointer;
}

.hoverable:hover {
  background: pink;
}
<div class="hoverable" ontouchend={unhover}></div>

यह, हालांकि, केवल हटाता है: कुछ अन्य स्पर्श घटना के बाद तत्व से होवर स्यूडोक्लास को ट्रिगर किया गया है, जैसे कि स्वाइप या कोई अन्य स्पर्श


1
आपके कोड स्निपेट के लिए, मेरे द्वारा छुआ जाने के बाद भी वर्ग अभी भी गुलाबी बना हुआ है। मुझे लगता है कि आपने वास्तव में इस प्रश्न में पूछी गई समस्या का समाधान नहीं किया है?
केविन ली

यह समाधान काम नहीं करता है। सबसे पहले, आपने किसी घटना को लागू करने के लिए गलत तरीके का इस्तेमाल किया, आपको .trigger () का उपयोग करना चाहिए । दूसरा, मोबाइल सफारी पर किसी भी तरह से काम नहीं करता है।
xHocquet

1

मेरे पास अच्छा समाधान है जिसे मैं साझा करना चाहूंगा। सबसे पहले आपको यह पता लगाने की जरूरत है कि उपयोगकर्ता इस तरह मोबाइल पर है:

var touchDevice = /ipad|iphone|android|windows phone|blackberry/i.test(navigator.userAgent.toLowerCase());

फिर बस जोड़ें:

if (!touchDevice) {
    $(".navbar-ul").addClass("hoverable");
}

और सीएसएस में:

.navbar-ul.hoverable li a:hover {
    color: #fff;
}

2
हाइब्रिड उपकरणों पर काम नहीं करता है, जैसे विंडोज टचस्क्रीन पीसी।
cspolton

1

मैं इसी तरह की समस्या से गुज़रा, मेरा एप्लिकेशन सभी स्क्रीन आकारों के लिए अनुकूल था, डेस्कटॉप-स्क्रीन-आकार / माउस आधारित उपकरणों में बहुत सारे हॉवर प्रभाव थे , और बाद में मुझे एहसास हुआ कि स्पर्श आधारित डिवाइस एक ऐसी स्थिति पैदा कर रहे थे जिसे चिपचिपा कहा जाता था। -होवर और यह ऐप के लिए टच आधारित डिवाइस उपयोगकर्ताओं के लिए ठीक से काम करने के लिए एक बाधा थी।

हम अपने ऐप में एससीएसएस का उपयोग कर रहे थे । और मैंने टच आधारित डिवाइस की देखभाल के लिए एक मिक्सिन को परिभाषित किया ।

@mixin hover-support {
  @media not all and (pointer: coarse) {
    &:hover {
      @content;
    }
  }
}

और फिर मैंने नीचे उल्लेखित स्निपेट के तहत अपनी सभी सीएसएस कक्षाएं लगाईं।

   @include hover-support() {
    // Your css-classes or css that you want to apply on those devices that support hover.
   }

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

@include hover-support() {
  .animate-icon {
    -webkit-transition: all 0.2s;
    transition: all 0.2s;
    &:hover {
      transform: scale(1.3);
      filter: brightness(85%);
      cursor: pointer;
    }
  }
}

1

यहां कुछ सरल जावास्क्रिप्ट कोड हैं, जिन्हें डेवलपर को सीएसएस को संपादित करने या किसी भी नए सीएसएस नियमों को लिखने की आवश्यकता नहीं है। मैंने इसे बूटस्ट्रैप बटन के लिए लिखा है class="btn", लेकिन यह किसी भी बटन के साथ काम करेगा, जिसमें एक विशिष्ट वर्ग का नाम है।

कदम हैं:

  1. निर्धारित करें कि क्या यह एक टच डिवाइस है
  2. यदि यह है, तो हर सीएसएस नियम में पुनरावृति document.styleSheets
  3. किसी भी नियम को हटाएं जिसमें दोनों हों .btnऔर:hover

सभी .btn :hoverसीएसएस नियमों का उन्मूलन सुनिश्चित करता है कि एक बटन पर कोई दृश्य हॉवर प्रभाव नहीं होगा।

चरण 1: टच डिवाइस का पता लगाएं

की उपस्थिति के लिए मीडिया क्वेरी की जाँच करें (hover: none):

    const hasMatchMedia = typeof window.matchMedia !== 'undefined';
    /**
     * determine if device is touch-capable
     * true - device is touch-capable
     * false - device is not touch-capable
     * null - unable to determine touch capability
     * @return {null|boolean}
     */
    const hasTouch = () => {
      if (hasMatchMedia) {
        return window.matchMedia('(hover: none)').matches;
      }
      return null;
    };

चरण 2: CSS नियम हटाएं जिसमें `btn` और`: hover` शामिल हैं

    /**
     * remove all CSS rules contaning both '.btn' and ':hover'
     * @return {number} count of rules deleted
     */
    function removeBtnHovers () {

      let rulesDeleted = 0;

      // recursively delete '.btn:hover' rules
      function recursiveDelete (rules, styleSheet) {

        if (typeof rules === 'undefined' ||
          typeof rules.length === 'undefined' ||
          rules.length <= 0) {
          return;
        }

        // iterate in reverse order,
        // deleting any rule containing both '.btn' and ':hover'
        const ruleLen = rules.length;
        for (let i = ruleLen - 1; i >= 0; i--) {
          const rule = rules[i];
          if (typeof rule.cssRules === 'undefined') {
            // a standard rule, evaluate it
            const cssText = rule.cssText;
            if (typeof cssText === 'string' &&
              cssText.includes('.btn') &&
              cssText.includes(':hover')) {
              styleSheet.deleteRule(i);
              rulesDeleted++;
            }
          } else {
            // rule contains cssRules, iterate over them
            recursiveDelete(rule.cssRules, rule);
          }
        }
      }

      // iterate over all style sheets in document
      for (const styleSheet of document.styleSheets) {
        let rules = styleSheet.cssRules;
        if (!rules) { continue; }
        recursiveDelete(rules, styleSheet);
      }
      return rulesDeleted;
    }

पूरा कोड GitHub और npm पर है

Terrymorse.com पर लाइव डेमो ।


क्या यह माउस / ट्रैकपैड के साथ टचस्क्रीन उपकरणों के लिए होवर प्रभाव को भी नहीं हटाता है?
जेंसी

@ जस्सी संभवतः। डिवाइस से मेल खाने पर @media (hover:none), या जब उपयोगकर्ता पहली बार स्क्रीन को छूता है तो होवर के नियम हटा दिए जाते हैं। आप इसे सुनिश्चित करने के लिए लाइव डेमो पेज पर आज़मा सकते हैं।
terrymorse

0

आप :activeराज्य पर पृष्ठभूमि-रंग सेट कर सकते हैं और :focus अवक्षेपण पृष्ठभूमि दे सकते हैं ।

यदि आप पृष्ठभूमि-रंग के माध्यम से सेट करते हैं onfocus/ontouch, तो रंग शैली एक बार :focusराज्य जाने के बाद बनी रहती है । फ़ोकस खो जाने पर आपको डीईएफटी बीजी को पुनर्स्थापित करने के लिए
रीसेट की आवश्यकता होती है onblur


लेकिन मैं माउस उपयोगकर्ताओं के लिए होवर प्रभाव को बनाए रखना चाहूंगा।
क्रिस

: होवर और: सक्रिय एक ही सीएसएस प्राप्त कर सकते हैं, यह पर है: फोकस आप समस्या है। दरअसल, अगर आप ऑनफोकस के जरिए बैकग्राउंड-कलर सेट करते हैं, तो एक बार फोकस हो जाने के बाद कलर स्टाइल बना रहता है। आपको डिफॉल्ट बीजी को बहाल करने के लिए ओनलूर पर भी रीसेट की आवश्यकता है
जी-साइरिलस

0

इसने मेरे लिए काम किया: हॉवर स्टाइल को एक नई कक्षा में रखा

.fakehover {background: red}

फिर आवश्यकता पड़ने पर कक्षा जोड़ें / निकालें

$(".someclass > li").on("mouseenter", function(e) {
  $(this).addClass("fakehover");
});
$(".someclass > li").on("mouseleave", function(e) {
  $(this).removeClass("fakehover");
});

टचस्टार्ट और टचेंड घटनाओं के लिए दोहराएं। या जो भी घटनाओं को आप वांछित परिणाम प्राप्त करना पसंद करते हैं, उदाहरण के लिए मैं चाहता था कि होवर प्रभाव एक टच स्क्रीन पर टॉगल किया जाए।


0

डैरेन कुक के जवाब के आधार पर जो आपकी अंगुली को दूसरे तत्व पर ले जाने पर भी काम करता है।

देखें ढूँढें तत्व उंगली एक touchend घटना के दौरान पर है

jQuery(function() {
    FastClick.attach(document.body);
});
// Prevent sticky hover effects for buttons on touch devices
// From https://stackoverflow.com/a/17234319
//
//
// Usage:
// <a href="..." touch-focus-fix>..</a>
//
// Refactored from a directive for better performance and compability
jQuery(document.documentElement).on('touchend', function(event) {
  'use strict';

  function fix(sourceElement) {
    var el = $(sourceElement).closest('[touch-focus-fix]')[0];
    if (!el) {
      return;
    }
    var par = el.parentNode;
    var next = el.nextSibling;
    par.removeChild(el);
    par.insertBefore(el, next);
  }

  fix(event.target);
  var changedTouch = event.originalEvent.changedTouches[0];
  // http://www.w3.org/TR/2011/WD-touch-events-20110505/#the-touchend-event
  if (!changedTouch) {
    return;
  }
  var touchTarget = document.elementFromPoint(changedTouch.clientX, changedTouch.clientY);
  if (touchTarget && touchTarget !== event.target) {
    fix(touchTarget);
  }
});

Codepen Demo


0

आप इस तरह से कोशिश कर सकते हैं।

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

var isEventSupported = function (eventName, elementName) {
    var el = elementName ? document.createElement(elementName) : window;
    eventName = 'on' + eventName;
    var isSupported = (eventName in el);
    if (!isSupported && el.setAttribute) {
        el.setAttribute(eventName, 'return;');
        isSupported = typeof el[eventName] == 'function';
    }
    el = null;
    return isSupported;
};

if (!isEventSupported('touchstart')) {
    $('a').addClass('with-hover');
}

सीएसएस:

a.with-hover:hover {
  color: #fafafa;
}

0

मैंने अपनी परियोजनाओं में अब तक जो भी किया था वह :hoverस्पर्श उपकरणों पर हुए परिवर्तनों को वापस करना था :

.myhoveredclass {
    background-color:green;
}
.myhoveredclass:hover {
    background-color:red;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
    .myhoveredclass:hover, .myhoveredclass:active, .myhoveredclass:focus {
        background-color:green;
    }
}

सभी वर्ग के नाम और रंग प्रदर्शन प्रयोजनों के लिए;;;


0

यह 2 चरणों में पूरी तरह से काम करता है।

  1. अपना बॉडी टैग इस तरह सेट करें <body ontouchstart="">। मैं इस "हैक" का प्रशंसक नहीं हूं, लेकिन यह आईओएस पर सफारी को तुरंत छूने के लिए प्रतिक्रिया करने की अनुमति देता है। निश्चित नहीं कि कैसे, लेकिन यह काम करता है।

  2. इस तरह अपना टौचेबल क्लास सेट करें:

    // I did this in SASS, but this should work with normal CSS as well
    
    // Touchable class
    .example {
    
        // Default styles
        background: green;
    
        // Default hover styles 
        // (Think of this as Desktop and larger)
        &:hover {
            background: yellow;
        }
    
        // Default active styles
        &:active {
            background: red;
        }
    
        // Setup breakpoint for smaller device widths
        @media only screen and (max-width: 1048px) {
    
            // Important!
            // Reset touchable hover styles
            // You may want to use the same exact styles as the Default styles
            &:hover {
                background: green;
            }
    
            // Important!
            // Touchable active styles
            &:active {
                background: red;
            }
        }
    }

आप अपने टौचेबल क्लास पर किसी भी एनीमेशन को हटाना चाह सकते हैं। Android क्रोम iOS की तुलना में थोड़ा धीमा लगता है।

यदि उपयोगकर्ता आपकी कक्षा को स्पर्श करते समय पृष्ठ को स्क्रॉल करता है तो यह सक्रिय स्थिति में लागू होगा।


0

:hover :focus :activeमोबाइल उपकरणों पर कुछ चिपचिपी या अटकी हुई समस्याएं गायब हो सकती हैं <meta name="viewport" content="width=device-width">क्योंकि ब्राउज़र स्क्रीन में हेरफेर करने की कोशिश करते हैं।


0

टचडाउन के बाद मेरे लिए इसका समाधान क्लोन बनाना और नोड को बदलना था ... मुझे ऐसा करने से नफरत है लेकिन यहां तक ​​कि ऑफसेटथाइट के साथ तत्व को फिर से हटाने की कोशिश नहीं की गई थी

    let cloneNode = originNode.cloneNode( true );
    originNode.parentNode.replaceChild( cloneNode, originNode );

अंत में यह मेरे लिए काम नहीं करता था ... मेरे मामले में मुझे एक पूरे ES6 को क्लोन करना होगा जो विस्तारित है और कई घटना श्रोताओं है और यह सिर्फ इस तरह की एक छोटी सी चीज को हल करने के लिए जटिल होने लगी है।
प्रतिबंध

0

यह एक HTML वर्ग स्वैप करके पूरा किया जा सकता है। यह पूरे तत्व को हटाने की तुलना में glitches के लिए कम प्रवण होना चाहिए, विशेष रूप से बड़े, छवि लिंक आदि के साथ।

हम यह भी तय कर सकते हैं हम चाहते हैं कि क्या मंडराना स्टेट्स को टच (टचमॉव) के साथ स्क्रॉल करते समय ट्रिगर किया जाए या यहां तक ​​कि उन्हें देरी करने के लिए टाइमआउट भी जोड़ा जाए।

हमारे कोड में एकमात्र महत्वपूर्ण बदलाव अतिरिक्त HTML वर्ग का उपयोग करना होगा जैसे <a class='hover'></a>कि नए व्यवहार को लागू करने वाले तत्वों पर।

एचटीएमएल

<a class='my-link hover' href='#'>
    Test
</a>

सीएसएस

.my-link:active, // :active can be turned off to disable hover state on 'touchmove'
.my-link.hover:hover {

    border: 2px dotted grey;
}

JS (jQuery के साथ)

$('.hover').bind('touchstart', function () {

   var $el;
   $el = $(this);
   $el.removeClass('hover'); 

   $el.hover(null, function () {
      $el.addClass('hover');
   });
});

उदाहरण

https://codepen.io/mattrcouk/pen/VweajZv

-

मेरे पास दोनों माउस के साथ कोई उपकरण नहीं है और इसे ठीक से जांचने के लिए स्पर्श किया गया है।


0

2020 से आप मीडिया क्वेरी के अंदर होवर शैलियों को जोड़ सकते हैं

@media (hover: hover) and (pointer: fine) {
    /* css hover class/style */
}

यह मीडिया क्वेरी इंगित करती है कि शैलियाँ उन ब्राउज़रों पर काम करेंगी जो अनुकरण नहीं करते: हॉवर करें इसलिए यह टच ब्राउज़र पर काम नहीं करेगा।

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