मैं सक्षम ब्राउज़रों में स्पर्श के साथ एक होवर का अनुकरण कैसे करूं?


120

इस तरह से कुछ HTML के साथ:

<p>Some Text</p>

तो इस तरह से कुछ सीएसएस:

p {
  color:black;
}

p:hover {
  color:red;
}

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


मैं विशेष रूप से iPhone OS के बारे में सोच रहा हूं - यह CSS एनीमेशन का एक डेमो है जिस पर कई के लिए शुरू करने के लिए क्लिक के बजाय होवर का उपयोग करना आसान है।
रिच ब्रैडशॉ

जवाबों:


172

ठीक है, मैंने इसे काम किया है! इसमें सीएसएस को थोड़ा बदलना और कुछ जेएस जोड़ना शामिल है।

इसे आसान बनाने के लिए jQuery का उपयोग करना:

$(document).ready(function() {
    $('.hover').on('touchstart touchend', function(e) {
        e.preventDefault();
        $(this).toggleClass('hover_effect');
    });
});

अंग्रेजी में: जब आप किसी स्पर्श को शुरू या समाप्त करते हैं, तो कक्षा hover_effectको चालू या बंद करें।

फिर, अपने HTML में, आप जिस किसी भी चीज़ के साथ काम करना चाहते हैं, उसके लिए एक क्लास होवर जोड़ें। अपने CSS में, किसी भी उदाहरण को प्रतिस्थापित करें:

element:hover {
    rule:properties;
}

साथ में

element:hover, element.hover_effect {
    rule:properties;
}

और बस उपयोगिता के लिए, इसे अपने सीएसएस में भी जोड़ें:

.hover {
-webkit-user-select: none;
-webkit-touch-callout: none;        
}

ब्राउजर को रोकने के लिए आपको इमेज या जो भी कॉपी / सेव / सेलेक्ट करना है उसे कॉपी / सेव करें।

आसान!


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

मैंने अपनी वेबसाइट में हटा दिया touchendऔर preventDefault()यह अच्छा काम करता है, लेकिन अब मेनू स्वचालित रूप से लक्ष्य से टैप करके बंद नहीं होता है।
मित्रो

जब उपयोगकर्ता कहीं और छूता है या स्क्रॉल करना शुरू करता है, तो ऐसे मेनू को बंद करने के बारे में कुछ सलाह देना चाहूंगा। मुझे लगता है touchstartकि शरीर पर (या समान) एक और श्रोता हो सकता है लेकिन मुझे आश्चर्य है कि क्या कोई बेहतर तरीका है। धन्यवाद!
डैरिल यंग

2
स्क्रॉल इशारे को अनदेखा करने के लिए वैसे भी क्या है? यह वही है जो मुझे इसकी आवश्यकता है, लेकिन अब मैं इस सामग्री को ऊपर और नीचे स्क्रॉल नहीं कर सकता जिसका यह प्रभाव है।
alsobubbly

1
जब से मैं स्क्रॉल उपलब्ध होना चाहता हूं, तब से मैंने निवारण को हटा दिया, लेकिन टचस्टार्ट और टचेंड पर दिए गए सुझावों के लिए धन्यवाद! भगवान भेजें यह एकमात्र उत्तर है जो मज़बूती से सभी ब्राउज़रों में काम करता है।
पेट्रिएस

54

आपको बस एक पैरेंट पर टचस्टार्ट बांधने की जरूरत है। कुछ इस तरह काम करेगा:

$('body').on('touchstart', function() {});

आपको फ़ंक्शन में कुछ भी करने की आवश्यकता नहीं है, इसे खाली छोड़ दें। यह स्पर्श पर होवर प्राप्त करने के लिए पर्याप्त होगा, इसलिए एक स्पर्श अधिक व्यवहार करता है: हॉवर और कम जैसे: सक्रिय। आईओएस जादू।


2
क्या यह समाधान दूसरे नल पर निष्पादित लिंक के लिए अनुमति देता है?
शमूएलकोबे

1
नहीं, यह अभी भी पहले स्पर्श पर क्लिक को ट्रिगर करता है। मैंने अभी इसका परीक्षण किया।
जैक

बहुत बढ़िया समाधान! जल्द और आसान।
हंटर टर्नर

41

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

<script>
document.addEventListener("touchstart", function(){}, true);
</script>

और अपने सीएसएस में:

element:hover, element:active {
-webkit-tap-highlight-color: rgba(0,0,0,0);
-webkit-user-select: none;
-webkit-touch-callout: none /*only to disable context menu on long press*/
}

इस कोड के साथ आपको अतिरिक्त .hover वर्ग की आवश्यकता नहीं है!


1
यह मेरे लिए काम करता है .. कुछ अन्य चीजें जो इसे और भी अधिक मदद कर सकती हैं, बजाय जावास्क्रिप्ट जोड़ने के, यह करें: <body ontouchstart = ""> फिर css में एक छोटा टाइमर जोड़ें: सक्रिय घटना: tr: सक्रिय {पृष्ठभूमि-रंग : # 118aab; संक्रमण: सभी .2s रैखिक; -वेबकिट-टैप-हाइलाइट-रंग: आरजीबीए (0,0,0,0); -webkit-user-select: कोई नहीं; -वेबकिट-टच-कॉलआउट: कोई नहीं}
Kozy

मेरे लिए काम किया। धन्यवाद ... केवल एक चीज - यह थोड़ा पिछड़ जाता है ... मेरा मतलब है - आपके प्रेस करने के बाद, यह तुरंत लोड नहीं होता है।
रोमन लोसव

Fastclick.js का उपयोग अंतराल को हटाने के लिए करें
Anselm

25

अपने मुख्य प्रश्न का उत्तर देने के लिए: "मैं कैसे सक्षम ब्राउज़रों में एक स्पर्श के साथ एक होवर का अनुकरण करता हूं?"

बस (स्क्रीन टैप करके) तत्व को क्लिक करने की अनुमति दें, और फिर ट्रिगर करें hover जावास्क्रिप्ट का उपयोग करके घटना को ।

var p = document.getElementsByTagName('p')[0];
p.onclick = function() {
 // Trigger the `hover` event on the paragraph
 p.onhover.call(p);
};

यह काम करना चाहिए, जब तक कि वहाँ है hover आपके डिवाइस पर घटना है (भले ही इसका सामान्य रूप से उपयोग नहीं किया जाता है)।

अपडेट करें: मैंने अभी अपने आईफोन पर इस तकनीक का परीक्षण किया है और यह ठीक काम करता है। इसे यहाँ आज़माएँ: http://jsfiddle.net/mathias/YS7ft/show/light/

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


मैं उस onhover.call (p) बिट के बारे में नहीं जानता था, यह बहुत अच्छा है। हालांकि कोई हॉवर नहीं है ...
रिच ब्रैडशॉ

क्या आपने कई तत्वों और लंबे स्पर्श के साथ इसका परीक्षण किया है? मतलब उपयोगकर्ता स्क्रीन के चारों ओर अपनी उंगली घुमाता है, और प्रत्येक तत्व के लिए एक हॉवर शैली दिखाता है?
माक्र्स

अगर आप पहले से ही jQuery का उपयोग कर रहे हैं, तो आप केवल jQuery के साथ होवर इवेंट को कॉल करने में सक्षम हो सकते हैं, जैसे: jQuery.hover (); यकीन नहीं है कि एपीआई समर्थन करता है, हालांकि।
Kzqai

वूप्स, कि tthat ऊपर पोस्ट के लिए लागू एक टिप्पणी वास्तव में jQuery का उपयोग करता है, क्षमा करें।
Kzqai

क्या आपको कोई विशेष स्क्रिप्टिंग करने या फ़ंक्शन को कॉल करने की आवश्यकता है? यह मेरे लिए काम करता है लेकिन केवल एक पृष्ठ पर है और मुझे नहीं पता कि क्या अंतर है।
रिचर्ड यंग

13

आगे बेहतर समाधान

पहले मैं रिच ब्रैडशॉ के दृष्टिकोण के साथ गया , लेकिन फिर समस्याएं दिखाई देने लगीं। 'टचस्टार्ट' पर e.preventDefault () कर घटना, पृष्ठ अब स्क्रॉल और, न तो देर तक दबाए रखने को क्रियान्वित करने को समाप्त करने में सक्षम है विकल्प मेनू और न ही डबल क्लिक करें ज़ूम आग करने में सक्षम है।

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

// Binding to the '.static_parent' ensuring dynamic ajaxified content
$('.static_parent').on('touchstart touchend', '.link', function (e) {

    // If event is 'touchend' then...
    if (e.type == 'touchend') {
        // Ensuring we event prevent default in all major browsers
        e.preventDefault ? e.preventDefault() : e.returnValue = false;
    }

    // Add class responsible for :hover effect
    $(this).toggleClass('hover_effect');
});

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

एक समाधान तब फिर से, सशर्त रूप से यह पता लगाना होगा कि हम किस घटना में हैं, या बस अलग-अलग काम कर रहे हैं, और AddClass () और removeClass () को क्रमशः 'टचस्टार्ट' और 'टचेंड' पर उपयोग करें , यह सुनिश्चित करता है कि यह हमेशा शुरू होता है और समाप्त होता है क्रमशः उस पर निर्णय लेने की बजाय जोड़ना और हटाना। समाप्त करने के लिए हम 'फोकसआउट' ईवेंट प्रकार को हटाने वाली कॉलबैक को भी बाध्य करेंगे , किसी भी लिंक के होवर वर्ग को साफ़ करने के लिए ज़िम्मेदार रहना, जो शायद कभी भी फिर से चालू न हो, जैसे:

$('.static_parent').on('touchstart', '.link', function (e) {
    $(this).addClass('hover_effect');
});

$('.static_parent').on('touchend focusout', '.link', function (e) {
    // Think double click zoom still fails here
    e.preventDefault ? e.preventDefault() : e.returnValue = false;
    $(this).removeClass('hover_effect');
});

atention: कुछ कीड़े अभी भी दो पिछले समाधानों में पाए जाते हैं और, यह भी सोचते हैं (परीक्षण नहीं किया गया है), डबल क्लिक ज़ूम अभी भी विफल रहता है।

साफ और उम्मीद बग नि: शुल्क (नहीं :)) जावास्क्रिप्ट समाधान

अब , एक दूसरे, क्लीनर, टिडियर और उत्तरदायी के लिए, केवल जावास्क्रिप्ट का उपयोग करके संपर्क करें (.hover वर्ग और छद्म: हॉवर के बीच कोई मिश्रण नहीं) और जहां से आप सार्वभौमिक (मोबाइल और डेस्कटॉप) 'क्लिक' ईवेंट पर सीधे अपने ajax व्यवहार को कॉल कर सकते हैं। , मैंने एक बहुत अच्छी तरह से उत्तरित प्रश्न पाया है , जिसमें से मैंने अंत में समझा कि कैसे मैं कई ईवेंट कॉलबैक के बिना टच और माउस ईवेंट को एक साथ मिला सकता हूं, अनिवार्य रूप से एक दूसरे के ईवेंट चेन को बदल रहे हैं। ऐसे:

$('.static_parent').on('touchstart mouseenter', '.link', function (e) {
    $(this).addClass('hover_effect');
});

$('.static_parent').on('mouseleave touchmove click', '.link', function (e) {
    $(this).removeClass('hover_effect');

    // As it's the chain's last event we only prevent it from making HTTP request
    if (e.type == 'click') {
        e.preventDefault ? e.preventDefault() : e.returnValue = false;

        // Ajax behavior here!
    }
});

3

माउस hoverप्रभाव को टच डिवाइस में लागू नहीं किया जा सकता है। जब मैं प्रभाव डालने के लिए सीएसएस में safari iosउपयोग किया जाता है उसी स्थिति के साथ दिखाई देता हूं :active

अर्थात।

p:active {
  color:red;
}

मेरे मामले में इसका काम है। यह भी ऐसा मामला है जिसे जावास्क्रिप्ट का उपयोग करके बाहर किया जा सकता है। बस एक कोशिश करो।


2

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

// Activate only in devices with touch screen
if('ontouchstart' in window)
{
    // this will make touch event add hover pseudoclass
    document.addEventListener('touchstart', function(e) {}, true);

    // modify click event
    document.addEventListener('click', function(e) {
        // get .tapHover element under cursor
        var el = jQuery(e.target).hasClass('tapHover')
            ? jQuery(e.target)
            : jQuery(e.target).closest('.tapHover');

        if(!el.length)
            return;

        // remove tapped class from old ones
        jQuery('.tapHover.tapped').each(function() {
            if(this != el.get(0))
                jQuery(this).removeClass('tapped');
        });

        if(!el.hasClass('tapped'))
        {
            // this is the first tap
            el.addClass('tapped');
            e.preventDefault();
            return false;
        }
        else
        {
            // second tap
            return true;
        }
    }, true);
}
.box {
	float:		left;
	
	display:	inline-block;
	margin:		50px 0 0 50px;
	width:		100px;
	height:		100px;
	overflow:	hidden;
	
	font-size:	20px;
	
	border:		solid 1px black;
}
.box.tapHover {
	background:	yellow;
}
.box.tapped {
	border:		solid 3px red;
}
.box:hover {
	background:	red;
}
<div class="box" onclick="this.innerHTML = Math.random().toFixed(5)"></div>
<div class="box tapHover" onclick="this.innerHTML = Math.random().toFixed(5)"></div>
<div class="box tapHover" onclick="this.innerHTML = Math.random().toFixed(5)"></div>


1

डिवाइस के बिना (या ब्राउज़र) विशिष्ट जेएस मुझे पूरा यकीन है कि आप भाग्य से बाहर हैं।

संपादित करें: सोचा कि आप उससे बचना चाहते थे जब तक कि मैं आपके सवाल को फिर से पढ़ न लूं। मोबाइल सफारी के मामले में आप देशी UIView-s के साथ जो कर सकते हैं उसके समान सभी स्पर्श घटनाओं को प्राप्त करने के लिए पंजीकरण कर सकते हैं। दस्तावेज अभी नहीं मिल सकता है, हालांकि करने की कोशिश करेंगे।


1

इसे करने का एक तरीका यह होगा कि होवर इफेक्ट तब करें जब टच शुरू हो, तब होवर इफेक्ट को हटा दें जब टच चलता है या समाप्त होता है।

जब आप iPhone का उल्लेख करते हैं, तो Apple को सामान्य रूप से टच हैंडलिंग के बारे में कहना पड़ता है ।


क्या लिंक सामग्री अभी भी प्रासंगिक है?
फ्लावेन वोलेन

1

मेरा व्यक्तिगत स्वाद :hoverशैलियों को :focusराज्य के रूप में अच्छी तरह से विशेषता है:

p {
    color: red;
}

p:hover, p:focus {
    color: blue;
}

फिर निम्न HTML के साथ:

<p id="some-p-tag" tabindex="-1">WOOOO</p>

और निम्नलिखित जावास्क्रिप्ट:

$("#some-p-tag").on("touchstart", function(e){
    e.preventDefault();
    var $elem = $(this);

    if($elem.is(":focus")) {
        //this can be registered as a "click" on a mobile device, as it's a double tap
        $elem.blur()
    }
    else {
        $elem.focus();
    }
});

1

हल 2019 - होवर ऑन टच

अब आईओआर या सामान्य रूप से स्पर्श के साथ हॉवर का उपयोग करने से बचना सबसे अच्छा लगता है। नीचे का कोड आपके सीएसएस को लागू करता है जब तक कि स्पर्श बनाए रखा जाता है, और अन्य आईओएस फ्लाईआउट के बिना। यह करो;

  1. जक्वरी ऐड: $ ("पी")। ("टचस्टार्ट", फंक्शन (ई) {$ (यह) .फोकस (); ई। सेवेंटडेफॉल्ट ();});

  2. CSS: p को बदलें: h: p के साथ ध्यान केंद्रित करें, और p: सक्रिय जोड़ें

विकल्प;

  • किसी भी वर्ग आदि के साथ jquery p चयनकर्ता बदलें

  • प्रभाव बना रहने के लिए, p: hover भी रखें, और बॉडी को जोड़ें {कर्सर: पॉंटर;} ताकि कोई नल कहीं भी समाप्त न हो।

  • एक ही कोड में टचस्टार्ट और माउसओवर इवेंट्स पर क्लिक करें (लेकिन परीक्षण नहीं किया गया)

  • e.preventDefault हटाएं (); उपयोगकर्ताओं को इओ फ़्लायआउट का उपयोग करने में सक्षम करने के लिए जैसे प्रतिलिपि

टिप्पणियाँ

  • केवल पाठ तत्वों के लिए परीक्षण किया गया, ios इनपुट आदि का अलग-अलग तरीके से उपचार कर सकता है

  • केवल सफारी या क्रोम का उपयोग करके iPhone XR ios 12.1.12 और ipad 3 ios 9.3.5 पर परीक्षण किया गया।


0

देशी जावास्क्रिप्ट और jQuery का मिश्रण:

var gFireEvent = function (oElem,sEvent) 
{
 try {
 if( typeof sEvent == 'string' && o.isDOM( oElem ))
 {
  var b = !!(document.createEvent),
     evt = b?document.createEvent("HTMLEvents"):document.createEventObject();
  if( b )    
  {  evt.initEvent(sEvent, true, true ); 
    return !oElem.dispatchEvent(evt);
  }
  return oElem.fireEvent('on'+sEvent,evt);
 }
 } catch(e) {}
 return false;
};


// Next you can do is (bIsMob etc you have to determine yourself):

   if( <<< bIsMob || bIsTab || bisTouch >>> )
   {
     $(document).on('mousedown', function(e)
     {
       gFireEvent(e.target,'mouseover' );
     }).on('mouseup', function(e)
     {
       gFireEvent(e.target,'mouseout' );
     });
   }

1
पांडित्यपूर्ण होने के लिए खेद है लेकिन jquac javacript है
matpol

2
@matpol: jQuery जावास्क्रिप्ट है लेकिन जावास्क्रिप्ट jQuery नहीं है। आपके लिए विशेष मैं 'शुद्ध' शब्द जोड़ता हूं, शुद्ध जावास्क्रिप्ट। संतुष्ट सर?
कोडबीट

आप 'शुद्ध' जावास्क्रिप्ट का उपयोग किए बिना jquery का उपयोग नहीं कर सकते। मैं केवल इस बिंदु को बनाता हूं क्योंकि कुछ लोग जो लगातार एसओ हैं, उन्हें यह पता नहीं चलता है।
Matpol

5
देशी जावास्क्रिप्ट और jQuery का मिश्रण, संतुष्ट?
कोडबीट

0

सबसे आसान समाधान मुझे मिला: मेरे पास कुछ <span> टैग थे: उनमें होवर सीएसएस नियम। मैंने <a href = "javascript: void (0)"> और voilà के लिए स्विच किया। IOS में होवर शैलियों ने काम करना शुरू कर दिया।


0

उपयोग सीएसएस का भी उपयोग कर सकते हैं, फ़ोकस लिंक के लिए फ़ोकस और सक्रिय (IE7 और के तहत) जोड़ें। वर्ग मेनू के साथ एक div के अंदर एक उल मेनू का उदाहरण:

.menu ul ul {display:none; position:absolute; left:100%; top:0; padding:0;}
.menu ul ul ul {display:none; position:absolute; top:0; left:100%;}
.menu ul ul a, .menu ul ul a:focus, .menu ul ul a:active { width:170px; padding:4px 4%; background:#e77776; color:#fff; margin-left:-15px; }
.menu ul li:hover > ul { display:block; }
.menu ul li ul li {margin:0;}

यह देर से और अप्रयुक्त है, काम करना चाहिए ;-)

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