Hover ile Bootstrap Açılır Menüsü


179

Tamam, bu yüzden ihtiyacım olan şey oldukça basit.

İçinde bazı açılır menüler bulunan bir gezinti çubuğu ayarladım (kullanarak class="dropdown-toggle" data-toggle="dropdown") ve iyi çalışıyor.

Mesele şu ki, " onClick" çalışıyor, ben çalışırsa tercih ederim " onHover".

Bunu yapmanın yerleşik bir yolu var mı?


Aşağıdaki CSS ve js çözümlerinin sorunlarını önleyen yeni yayınlanan uygun eklentime bakın: github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
István Ujj-Mészáros 27:15

Yanıtlar:


338

En kolay çözüm CSS'de olacaktır. Şuna benzer bir şey ekle ...

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

Çalışma keman


3
Uzun 'tam yapılı' çözümlerden çok daha iyi. Bunu ekleyin ve varsayılan 'tıklama' açılır menüsü fareyle fazladan değişiklik yapılmadan çalışır.
IamFace

47
Bu, yerleşik katlanabilir mobil menü ile çakışacaktır, bu yüzden onu bir medya noktasına @media (min genişlik: 480 piksel) sarmalısınız
Billy Shih

7
Ayrıca dikkat çeken: örneğin bir wordpress temasında ebeveyn-çocuk ilişkilerine sahip bir açılır menünüz varsa data-toggle, üst öğenin tıklanabilir olmasını sağlamak için özelliği kaldırmanız gerekir ... Mobil ekranlarda teminat hasarına dikkat edin.
Ken Prince

2
Tıklamada görüntülemeyi devre dışı bırakmanın ve yalnızca fareyle üzerine gelme davranışını korumanın kolay bir yolu var mı?
Micer

1
@Micer, az önce click olayını devre dışı bırakabileceğiniz bir eklenti yayınladım. Eklenti, yalnızca Bootstrap javascript API'sını kullanarak herhangi bir CSS kesmeksiz çalışır
István Ujj-Mészáros 27:15

66

Bunu yapmanın en iyi yolu, fareyle üzerine gelindiğinde bootstraps click olayını tetiklemektir. Bu şekilde, yine de dokunmatik cihaz dostu kalmalıdır

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

1
Birden fazla açılır düzeyiniz varsa başarısız olur
Connie DeCinko

1
Ana bağlantı ile
çalışmıyor

kapatıldıktan sonra Active sınıfını kaldırmanın bir yolu var mı?
brainvision

Açılan öğe ile menü arasında, hızlı olmadıkça menünün bir ara geçişi gizlemesine neden olabilecek bir piksel boşluğu var
Matt

1
Birden fazla açılır menü kullanmak için bazı "en yakın" filtreleme gerekir.
err

57

JQuery'nin üzerine gelme işlevini kullanabilirsiniz.

openFare girdiğinde sınıfı eklemeniz ve fare açılır menüden ayrıldığında sınıfı kaldırmanız yeterlidir .

İşte benim kod:

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

10
Kabul edilen cevaptan daha iyi imho. Bu, tüm bootstrap mantığını ve stilini sağlam tutar. Yine de ikinci aramayı kullanmanızı tavsiye ederim ve düğmeyi tıkladığınızda bazı garip davranışları önlemek için removeClass ve addClass'ı açıkça kullanın (düğmeyi bıraktığınızda açılacak ve girdiğinizde kapanacak).
Bastiaan Linders

3
Ben de bunun en iyi cevap olduğunu düşünüyorum. Bootstrap 4 menüsü ile çalışmak için, showyerine kullanmak zorunda kaldım openve ayrıca şunları da dahil etmeliyim dropdown-menu: $('.dropdown').hover(function() { $(this).addClass('show'); $(this).find('.dropdown-menu').addClass('show');}, function() {$(this).removeClass('show'); $(this).find('.dropdown-menu').removeClass('show');});(Biçimlendirme için özür dilerim.)
Robin Zimmermann

İki açılır menü öğeniz varsa çalışmaz. Herhangi bir açılır menüde fareyle üzerine
gelindiğinde

23

JQuery kullanarak kolay bir yol şudur:

$(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);
    });  
});

Yumuşak geçişi seviyorum, ancak menünün tüm düzeylerinin sadece ilk seviye yerine genişlemesine neden oluyor. Ebeveynlerinin üzerine gelinceye kadar ikinci düzey menülerin görünmesini istemiyorum.
Connie DeCinko

1
Eklemek, sadece ilk seviyesini elde etmek için .first() - $(this).find('.dropdown-menu').first().stop(true, true).delay(200).fadeIn(200);...
JEdot

9

CSS için de tıkladığınızda çıldırıyor. Bu kullandığım kod, mobil görünüm için hiçbir şey değiştirmez.

$('.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');
        }
    }
});

Güzellik! Tx! CSS alternatifleri Bootstrap 3 ve ötesinde çalışmaz.
Pedro Ferreira



5

Yani bu koda sahipsiniz:

<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>

Normalde tıklama olayında çalışır ve fareyle üzerine gelme olayında çalışmasını istersiniz. Bu çok basit, sadece bu javascript / jquery kodunu kullanın:

$(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();
        })
    })
})

Bu çok iyi çalışıyor ve işte açıklama: bir düğmemiz ve bir menümüz var. Düğmenin üzerine geldiğimizde menüyü görüntüleriz ve düğmenin faresini kapattığımızda 100 ms sonra menüyü gizleriz. Bunu neden kullandığımı merak ediyorsanız, imleci menü üzerindeki düğmeden sürüklemek için zamana ihtiyacınız var. Menüdeyken, zaman sıfırlanır ve orada istediğiniz kadar kalabilirsiniz. Menüden çıktığınızda, herhangi bir zaman aşımı olmadan menüyü anında gizleyeceğiz.

Bu kodu birçok projede kullandım, eğer herhangi bir sorunla karşılaşırsanız, bana soru sormaktan çekinmeyin.


Bu kodun bootstrap v3'te birçok sorunu var. 1.) Birden fazla açılır menü varsa, üzerine gelindiğinde tüm açılır listeler görüntülenir. 2.) Küçük ekranlarda fareyle üzerine gelme, açılır menüyü garip bir şekilde gösterir.
KayakinKoder

4

Bazı jQuery ile üzerine gelindiğinde açılır menü yapmak için kullandığım şey bu

$(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');
    });
});

Güzel ama alt menüleri desteklemiyor.
Connie DeCinko

3

Fadein fadeout animasyonlarıyla fareyle üzerine gelme işlevini kullanarak bunu deneyin

$('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);
});

Bu animasyon 3. derinlikte çalışmıyor, ancak 2. derinlikte çalışıyor. 3. derinlik için başka bir çözümünüz var mı?
Jilani A

referans için lütfen JSFiddle ekleyin
Rakesh Vadnal

2

Bu, önyükleme için kendi üzerine gelme sınıfınızı oluşturmanıza yardımcı olacaktır:

CSS:

/* 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;
}

Kenar boşlukları istenmeyen kapanmayı önleyecek şekilde ayarlanmıştır ve isteğe bağlıdır.

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>

Onclick open'ı kaldırmak istiyorsanız data-toggle = "dropdown" düğme özelliğini kaldırmayı unutmayın ve bu, giriş açılır listeye eklendiğinde de çalışır.


2

Gezinmeyi gezdirmenin mobil bölümlerde iyi çalışmadığını gördüğüm için, bu yalnızca bir mobil cihazda olmadığınızda gezinme çubuğunu gezdirir:

    $( 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' );
        }
    });

});

Burada çok daha iyi bir çözüm bulabilirsiniz: github.com/CWSpear/bootstrap-hover-dropdown .
solarbaypilot

2

Diğer çözümleri deniyorum, bootstrap 3 kullanıyorum, ancak açılır menü üzerinde hareket etmek için çok hızlı kapanıyor

li'ye class = "dropdown" eklemeniz gerekiyorsa, bir zaman aşımı ekledim

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

2

Uygun bir eklenti ile güncellendi

dropdown-toggleÖğeyi tıklattığınızda ne olacağını bile tanımlayabileceğiniz açılır fareyle üzerine gelme işlevselliği için uygun bir eklenti yayınladım :

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


Zaten birçok çözüm olduğunda neden başardım?

Daha önce var olan tüm çözümlerle sorunlarım vardı. Basit CSS olanlar .opensınıfı üzerinde kullanmazlar .dropdown, bu nedenle açılır menü görünür durumdayken açılır liste öğesi hakkında geri bildirim alınmaz .

Js olanlar tıklamaya müdahale ediyor .dropdown-toggle, bu yüzden açılır menü fareyle üzerine gelindiğinde, daha sonra açılan bir açılır kutuyu tıkladığınızda gizler ve fareyi hareket ettirerek açılır menü tekrar görünmesini tetikler. Bazı js çözümleri iOS uyumluluğunu frenliyor, bazı eklentiler dokunmatik olayları destekleyen modern masaüstü tarayıcılarında çalışmıyor.

Bu nedenle, tüm bu sorunları önleyen herhangi bir kesmek olmadan yalnızca standart Bootstrap javascript API'sini kullanarak önleyen Bootstrap Dropdown Hover eklentisini yaptım .


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

Bir clickolayı bir ile tetiklemek hoverküçük bir hatayla sonuçlanır. Eğer mouse-inve sonra a clicktersi bir etki yaratır. Ne openszaman mouse-outve closene zaman mouse-in. Daha iyi bir çözüm:

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

1

html

        <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

Onun cihazı dokunmayın ve eğer algılar öneriyorum çözüm navbar-toggle(hamburger menüsü) görünmüyorsa ve ebeveyn menü öğesi yapar vurgulu üzerinde açığa alt menüsünü ve ve tıklama üzerindeki bağlantıyı takip .

Ayrıca tne margin-top 0 yapar, çünkü bazı tarayıcıdaki gezinme çubuğu ve menü arasındaki boşluk alt öğelerin üzerine gelmenize izin vermez

$(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

Bootstrap açılır menüsü Fareyle üzerine gelindiğinde çalışın ve özellik display: block; css'de ve bu nitelikleri kaldırırken data-toggle = "dropdown" role = "button" düğme etiketinden

.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>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.