होवर के साथ बूटस्ट्रैप ड्रॉपडाउन


179

ठीक है, इसलिए मुझे जो चाहिए वह काफी सीधा है।

मैंने इसमें कुछ ड्रॉपडाउन मेनू के साथ एक नेवबार स्थापित किया है (उपयोग करते हुए class="dropdown-toggle" data-toggle="dropdown"), और यह ठीक काम करता है।

बात यह है कि यह काम करता है " onClick", जबकि मैं पसंद करूंगा अगर यह काम करता है " onHover"।

क्या ऐसा करने का कोई अंतर्निहित तरीका है?


मेरे नए प्रकाशित उचित प्लगइन देखें जो नीचे दिए गए CSS और js समाधान के मुद्दों को रोकता है: github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
István Ujj-Mészáros

जवाबों:


338

सबसे आसान समाधान CSS में होगा। कुछ ऐसा जोड़ें ...

.dropdown:hover .dropdown-menu {
    display: block;
    margin-top: 0; // remove the gap so it doesn't close
 }

वर्किंग फिडल


3
लंबे 'पूर्ण-निर्मित' समाधानों की तुलना में बहुत बेहतर है। बस इसे जोड़ें और अतिरिक्त परिवर्तनों के बिना डिफ़ॉल्ट पर 'क्लिक' ड्रॉपडाउन काम करता है।
इम्फैस

47
यह अंतर्निहित मोबाइल मेनू के साथ संघर्ष करेगा, इसलिए आपको इसे एक विराम बिंदु @media (न्यूनतम-चौड़ाई: 480px) में लपेटना चाहिए
बिली शिह

7
इसके अलावा ध्यान देने योग्य: यदि आपके पास माता-पिता-बच्चे के रिश्तों के साथ ड्रॉपडाउन मेनू है, उदाहरण के लिए एक वर्डप्रेस थीम में, आपको data-toggleमूल आइटम को क्लिक-सक्षम करने के लिए विशेषता को हटाने की आवश्यकता है ... बस मोबाइल स्क्रीन पर संपार्श्विक क्षति के लिए बाहर देखें।
केन प्रिंस

2
क्या कोई आसान तरीका है कि क्लिक पर प्रदर्शन को अक्षम करें और केवल हॉवर व्यवहार को बनाए रखें?
माइक

1
@ माइस, मैंने अभी एक प्लगइन प्रकाशित किया है जिसमें आप क्लिक ईवेंट को अक्षम कर सकते हैं। प्लगइन केवल बूटस्ट्रैप जावास्क्रिप्ट एपीआई का उपयोग करते हुए बिना किसी सीएसएस हैक के काम करता है, इसलिए यह सभी उपकरणों के साथ संगत है: github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
István Ujj-Mészáros

66

इसे करने का सबसे अच्छा तरीका सिर्फ बूटस्ट्रैप क्लिक इवेंट को एक होवर के साथ ट्रिगर करना है। इस तरह, यह अभी भी टच डिवाइस के अनुकूल रहना चाहिए

$('.dropdown').hover(function(){ 
  $('.dropdown-toggle', this).trigger('click'); 
});

1
विफल रहता है अगर आपके पास एक से अधिक ड्रॉपडाउन स्तर है
कॉनी डेसिंको

1
माता-पिता के लिंक के साथ काम नहीं करना
pio

क्या ड्रॉपडाउन बंद होने के बाद एक्टिव क्लास हटाने का कोई तरीका है?
ब्रेनविजन

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

1
कई ड्रॉपडाउन का उपयोग करके कुछ 'निकटतम' फ़िल्टरिंग की आवश्यकता होती है।
अरे

57

आप jQuery के होवर फ़ंक्शन का उपयोग कर सकते हैं।

आपको बस उस कक्षा को जोड़ने की आवश्यकता होती है openजब माउस प्रवेश करता है और माउस को छोड़ने के बाद कक्षा को हटा देता है।

यहाँ मेरा कोड है:

$(function(){
    $('.dropdown').hover(function() {
        $(this).addClass('open');
    },
    function() {
        $(this).removeClass('open');
    });
});

10
बेहतर तरीका है तो स्वीकृत उत्तर इम्हो। यह सभी बूटस्ट्रैप लॉजिक और स्टाइल को बरकरार रखता है। हालांकि मैं दूसरी कॉल बैक का उपयोग करने की सलाह दूंगा और जब आपने बटन पर क्लिक किया होगा (जब आप बटन छोड़ेंगे और जब आप इसे बंद करेंगे तो यह खुल जाएगा) को हटाने के लिए कुछ स्पष्ट व्यवहार को रोकने के लिए स्पष्ट रूप से removeClass और addClass का उपयोग करें।
बस्तियान लिंडर्स

3
मुझे भी लगता है कि यह सबसे अच्छा जवाब है। बूटस्ट्रैप 4 मेनू के साथ काम करने के लिए, मुझे showइसके बजाय उपयोग करना था open, और इसमें शामिल हैं dropdown-menu: $('.dropdown').hover(function() { $(this).addClass('show'); $(this).find('.dropdown-menu').addClass('show');}, function() {$(this).removeClass('show'); $(this).find('.dropdown-menu').removeClass('show');});(स्वरूपण के लिए क्षमा करें।)
रॉबिन ज़िमरमैन

यदि आपके पास दो ड्रॉपडाउन मेनू आइटम हैं तो काम न करें। किसी भी ड्रॉपडाउन आइटम पर होवर पर दोनों
सबमेनस

23

JQuery का उपयोग करने का एक आसान तरीका यह है:

$(document).ready(function(){
    $('ul.nav li.dropdown').hover(function() {
      $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(200);
    }, function() {
      $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(200);
    });  
});

मुझे चिकनी संक्रमण पसंद है, हालांकि यह मेनू के सभी स्तरों को पहले स्तर के बजाय विस्तारित करने का कारण बनता है। मैं दूसरे स्तर के मेनू नहीं दिखाना चाहता जब तक कि मैं उनके माता-पिता पर मंडराता नहीं हूं।
कॉनी डेसिंको

1
केवल प्रथम स्तर प्राप्त करने के लिए, .first()$(this).find('.dropdown-menu').first().stop(true, true).delay(200).fadeIn(200);
जोड़िए

9

CSS के लिए यह पागल हो जाता है जब आप इस पर क्लिक करते हैं। यह वह कोड है जो मैं उपयोग कर रहा हूं, यह मोबाइल दृश्य के लिए कुछ भी नहीं बदलता है।

$('.dropdown').mouseenter(function(){
    if(!$('.navbar-toggle').is(':visible')) { // disable for mobile view
        if(!$(this).hasClass('open')) { // Keeps it open when hover it again
            $('.dropdown-toggle', this).trigger('click');
        }
    }
});

एक सौंदर्य! टीएक्स! CSS विकल्प बूटस्ट्रैप 3 और इसके बाद के संस्करण पर काम नहीं करेंगे।
पेड्रो फरेरा



5

तो आपके पास यह कोड है:

<a class="dropdown-toggle" data-toggle="dropdown">Show menu</a>

<ul class="dropdown-menu" role="menu">
    <li>Link 1</li>
    <li>Link 2</li> 
    <li>Link 3</li>                                             
</ul>

आम तौर पर यह क्लिक इवेंट पर काम करता है, और आप चाहते हैं कि यह हॉवर ईवेंट पर काम करे। यह बहुत सरल है, बस इस जावास्क्रिप्ट / jquery कोड का उपयोग करें:

$(document).ready(function () {
    $('.dropdown-toggle').mouseover(function() {
        $('.dropdown-menu').show();
    })

    $('.dropdown-toggle').mouseout(function() {
        t = setTimeout(function() {
            $('.dropdown-menu').hide();
        }, 100);

        $('.dropdown-menu').on('mouseenter', function() {
            $('.dropdown-menu').show();
            clearTimeout(t);
        }).on('mouseleave', function() {
            $('.dropdown-menu').hide();
        })
    })
})

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

मैंने कई परियोजनाओं में इस कोड का उपयोग किया है, अगर आपको इसका उपयोग करने में कोई समस्या आती है, तो मुझसे प्रश्न पूछने में संकोच न करें।


इस कोड में बूटस्ट्रैप v3 पर बहुत सारी समस्याएं हैं। 1.) यदि एक से अधिक ड्रॉपडाउन है, तो सभी ड्रॉपडाउन प्रदर्शित किए जाते हैं जब कोई भी ओवर होवर किया जाता है। 2.) छोटे पर्दे पर, हॉवरिंग एक अजीब तरीके से ड्रॉपडाउन दिखाता है।
कायकिनकोडर

4

यह वही है जो मैं इसे कुछ jQuery के साथ होवर पर ड्रॉपडाउन करने के लिए उपयोग करता हूं

$(document).ready(function () {
    $('.navbar-default .navbar-nav > li.dropdown').hover(function () {
        $('ul.dropdown-menu', this).stop(true, true).slideDown('fast');
        $(this).addClass('open');
    }, function () {
        $('ul.dropdown-menu', this).stop(true, true).slideUp('fast');
        $(this).removeClass('open');
    });
});

अच्छा है, लेकिन उप मेनू का समर्थन नहीं करता है।
कोनी डेसिंको

3

फ़ेडिन फ़ेडआउट एनिमेशन के साथ हॉवर फ़ंक्शन का उपयोग करके इसे आज़माएं

$('ul.nav li.dropdown').hover(function() {
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
}, function() {
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
});

यह एनीमेशन 3 डी गहराई में काम नहीं कर रहा है लेकिन यह 2 डी गहराई में काम कर रहा है। क्या आपके पास तीसरी गहराई के लिए कोई अन्य उपाय है?
जिलानी ए

कृपया संदर्भ के लिए JSFiddle जोड़ें
राकेश वडालल

2

इससे आपको बूटस्ट्रैप के लिए अपना स्वयं का होवर वर्ग बनाने में मदद मिलेगी:

सीएसएस:

/* Hover dropdown */
.hover_drop_down.input-group-btn ul.dropdown-menu{margin-top: 0px;}/*To avoid unwanted close*/
.hover_drop_down.btn-group ul.dropdown-menu{margin-top:2px;}/*To avoid unwanted close*/
.hover_drop_down:hover ul.dropdown-menu{
   display: block;
}

मार्जिन को अवांछित करीबी से बचने के लिए सेट किया गया है और वे वैकल्पिक हैं।

HTML:

<div class="btn-group hover_drop_down">
  <button type="button" class="btn btn-default" data-toggle="dropdown"></button>
  <ul class="dropdown-menu" role="menu">
    ...
  </ul>
</div>

बटन विशेषता डेटा को हटाने के लिए मत भूलना -टॉगल = "ड्रॉपडाउन" यदि आप ओनलीक ओपन को हटाना चाहते हैं, और यह तब भी काम करेगा जब इनपुट ड्रॉपडाउन के साथ संलग्न है।


2

यह केवल तब होता है जब आप मोबाइल डिवाइस पर नहीं होते हैं, तो नाविक को रोकते हैं, क्योंकि मुझे लगता है कि नेविगेशन का मँडरा करना मोबाइल डिवाइसेस पर अच्छा काम नहीं करता है:

    $( document ).ready(function() {

    $( 'ul.nav li.dropdown' ).hover(function() {
        // you could also use this condition: $( window ).width() >= 768
        if ($('.navbar-toggle').css('display') === 'none' 
            && false === ('ontouchstart' in document)) {

            $( '.dropdown-toggle', this ).trigger( 'click' );
        }
    }, function() {
        if ($('.navbar-toggle').css('display') === 'none'
            && false === ('ontouchstart' in document)) {

            $( '.dropdown-toggle', this ).trigger( 'click' );
        }
    });

});

आप यहां एक बेहतर समाधान पा सकते हैं: github.com/CWSpear/bootstrap-hover-dropdown
Solarbaypilot

2

मैं अन्य समाधानों की कोशिश करता हूं, मैं बूटस्ट्रैप 3 का उपयोग कर रहा हूं, लेकिन ड्रॉपडाउन मेनू बहुत जल्दी बंद हो जाता है

माना जाता है कि आप वर्ग = "ड्रॉपडाउन" को ली में जोड़ते हैं, मैंने एक टाइमआउट जोड़ा

var hoverTimeout;
$('.dropdown').hover(function() {
    clearTimeout(hoverTimeout);
    $(this).addClass('open');
}, function() {
    var $self = $(this);
    hoverTimeout = setTimeout(function() {
        $self.removeClass('open');
    }, 150);
});

2

एक उचित प्लगइन के साथ अद्यतन किया गया

मैंने ड्रॉपडाउन होवर कार्यक्षमता के लिए एक उचित प्लगइन प्रकाशित किया है, जिसमें आप यह भी परिभाषित कर सकते हैं कि dropdown-toggleतत्व पर क्लिक करते समय क्या होता है:

https://github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover


मैंने इसे क्यों बनाया, जब पहले से ही कई समाधान हैं?

मेरे पास पहले से मौजूद सभी समाधानों के साथ समस्या थी। सरल सीएसएस वाले .openपर कक्षा का उपयोग नहीं कर रहे हैं .dropdown, इसलिए ड्रॉपडाउन टॉगल तत्व पर कोई प्रतिक्रिया नहीं होगी जब ड्रॉपडाउन दिखाई देता है।

Js वाले क्लिक करने में हस्तक्षेप कर रहे हैं .dropdown-toggle, इसलिए ड्रॉपडाउन होवर पर दिखाई देता है, फिर एक खुली ड्रॉपडाउन पर क्लिक करने पर इसे छुपाता है, और माउस को हटाकर फिर से दिखाने के लिए ड्रॉपडाउन ट्रिगर होगा। कुछ js समाधान iOS संगतता को ब्रेक दे रहे हैं, कुछ प्लगइन्स आधुनिक डेस्कटॉप ब्राउज़र पर काम नहीं कर रहे हैं जो स्पर्श घटनाओं का समर्थन कर रहे हैं।

इसलिए मैंने बूटस्ट्रैप ड्रॉपडाउन होवर प्लगइन बनाया जो बिना किसी हैक के केवल मानक बूटस्ट्रैप जावास्क्रिप्ट एपीआई का उपयोग करके इन सभी मुद्दों को रोकता है।


1
    $('.navbar .dropdown').hover(function() {
      $(this).find('.dropdown-menu').first().stop(true, true).slideDown(150);
    }, function() {
      $(this).find('.dropdown-menu').first().stop(true, true).slideUp(105)
    });

1

एक छोटी सी त्रुटि के clickसाथ एक घटना को ट्रिगर करना hover। यदि mouse-inऔर फिर clickइसके विपरीत प्रभाव पैदा करता है। यह opensकब mouse-outऔर closeकहां mouse-in। एक बेहतर समाधान:

$('.dropdown').hover(function() {
    if (!($(this).hasClass('open'))) {
        $('.dropdown-toggle', this).trigger('click');
    }
}, function() {
    if ($(this).hasClass('open')) {
        $('.dropdown-toggle', this).trigger('click');
    }
});

1

एचटीएमएल

        <div class="dropdown">

            <button class="btn btn-primary dropdown-toggle" type="button" data-toggle="dropdown">
                Dropdown Example <span class="caret"></span>
            </button>

            <ul class="dropdown-menu">
                <li><a href="#">HTML</a></li>
                <li><a href="#">CSS</a></li>
                <li><a href="#">JavaScript</a></li>
            </ul>

        </div> 

jQuery

        $(document).ready( function() {                

            /* $(selector).hover( inFunction, outFunction ) */
            $('.dropdown').hover( 
                function() {                        
                    $(this).find('ul').css({
                        "display": "block",
                        "margin-top": 0
                    });                        
                }, 
                function() {                        
                    $(this).find('ul').css({
                        "display": "none",
                        "margin-top": 0
                    });                        
                } 
            );

        });

codepen


0

मैं जो प्रस्ताव पेश कर रहा हूं उसका पता चलता है कि इसका टच डिवाइस नहीं है और यह navbar-toggle(हैमबर्गर मेनू) दिखाई नहीं देता है और पैरेंट मेनू आइटम को होवर पर सबमेनू प्रकट करता है और क्लिक करने पर इसके लिंक का अनुसरण करता है

Tne मार्जिन-टॉप 0 भी बनाता है क्योंकि कुछ ब्राउज़र में नेवबार और मेन्यू के बीच का अंतर आपको सबटाइट्स के लिए मंडराने नहीं देगा

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

    if(!is_touch_device() && $('.navbar-toggle:hidden')){
      $('.dropdown-menu', this).css('margin-top',0);
      $('.dropdown').hover(function(){ 
          $('.dropdown-toggle', this).trigger('click').toggleClass("disabled"); 
      });			
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>

$(function(){
  $("#nav .dropdown").hover(
    function() {
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeIn("fast");
      $(this).toggleClass('open');
    },
    function() {
      $('#products-menu.dropdown-menu', this).stop( true, true ).fadeOut("fast");
      $(this).toggleClass('open');
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet"/>

<ul id="nav" class="nav nav-pills clearfix right" role="tablist">
    <li><a href="#">menuA</a></li>
    <li><a href="#">menuB</a></li>
    <li class="dropdown"><a href="#" class="dropdown-toggle" data-toggle="dropdown">menuC</a>
        <ul id="products-menu" class="dropdown-menu clearfix" role="menu">
            <li><a href="">A</a></li>
            <li><a href="">B</a></li>
            <li><a href="">C</a></li>
            <li><a href="">D</a></li>
        </ul>
    </li>
    <li><a href="#">menuD</a></li>
    <li><a href="#">menuE</a></li>
</ul>


0

बूटस्ट्रैप ड्रॉप-डाउन होवर पर काम करें, और संपत्ति प्रदर्शन जोड़कर क्लिक पर पास रहें : ब्लॉक; सीएसएस में और इन विशेषताओं को हटाकर डेटा-टॉगल = "टैगडाउन" भूमिका = "बटन" बटन टैग से

.dropdown:hover .dropdown-menu {
  display: block;
}
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.0/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">                                     
  <div class="dropdown">
    <button class="btn btn-primary dropdown-toggle">Dropdown Example
    <span class="caret"></span></button>
    <ul class="dropdown-menu">
      <li><a href="#">HTML</a></li>
      <li><a href="#">CSS</a></li>
      <li><a href="#">JavaScript</a></li>
    </ul>
  </div>
</div>

</body>
</html>

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