Bootstrap Dropdown con Hover


179

OK, quindi quello di cui ho bisogno è abbastanza semplice.

Ho impostato una barra di navigazione con alcuni menu a discesa (usando class="dropdown-toggle" data-toggle="dropdown"), e funziona benissimo.

Il fatto è che funziona " onClick", mentre preferirei se funzionasse " onHover".

C'è un modo integrato per farlo?


Guarda il mio plug-in corretto appena pubblicato che impedisce i problemi delle seguenti CSS e soluzioni js: github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
István Ujj-Mészáros

Risposte:


338

La soluzione più semplice sarebbe nei CSS. Aggiungi qualcosa come ...

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

Fiddle di lavoro


3
Molto meglio delle lunghe soluzioni "complete". Basta aggiungere questo e il menu a discesa 'clic' predefinito funziona al passaggio del mouse senza ulteriori modifiche.
IamFace,

47
Ciò entrerà in conflitto con il menu mobile pieghevole integrato, quindi dovresti avvolgerlo in un punto di interruzione @media (larghezza minima: 480px)
Billy Shih,

7
È anche degno di nota: se si dispone di un menu a discesa con relazioni padre-figlio, ad esempio in un tema wordpress, è necessario rimuovere l' data-toggleattributo per rendere cliccabile l'elemento genitore ... Basta fare attenzione ai danni collaterali sugli schermi mobili.
Ken Prince,

2
Esiste un modo semplice per disabilitare la visualizzazione al clic e mantenere solo il comportamento al passaggio del mouse?
Micer,

1
@Micer, ho appena pubblicato un plugin in cui è possibile disabilitare l'evento click. Il plug-in funziona senza alcun hack CSS, utilizzando solo l'API javascript Bootstrap, quindi è compatibile con tutti i dispositivi: github.com/istvan-ujjmeszaros/bootstrap-dropdown-hover
István Ujj-Mészáros

66

Il modo migliore per farlo è semplicemente innescare l'evento click bootstrap con un passaggio del mouse. In questo modo, dovrebbe comunque rimanere compatibile con i dispositivi touch

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

1
fallisce se hai più di un livello a discesa
Connie DeCinko,

1
Non funziona con il collegamento principale
pio

c'è un modo per rimuovere la classe attiva una volta chiuso il menu a discesa?
brainvision

C'è un divario di pixel tra l'elemento a discesa e il menu che può far nascondere il menu a volte attraversando, a meno che tu non sia veloce
Matt

1
L'uso di più menu a discesa richiede un filtro "più vicino".
err

57

È possibile utilizzare la funzione hover di jQuery.

Devi solo aggiungere la classe openquando il mouse entra e rimuovere la classe quando il mouse lascia il menu a discesa.

Ecco il mio codice:

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

10
Molto meglio della imho risposta accettata. Ciò mantiene intatte tutta la logica e lo stile del bootstrap. Anche se consiglierei di usare la seconda richiamata e di usare esplicitamente removeClass e addClass per prevenire alcuni comportamenti strani quando si fa clic sul pulsante (dove si aprirà quando si lascia il pulsante e si chiude quando si accede).
Bastiaan Linders,

3
Penso anche che questa sia la risposta migliore. Per farlo funzionare con il menu Bootstrap 4, ho dovuto usare showinvece di open, e includere anche dropdown-menu: $('.dropdown').hover(function() { $(this).addClass('show'); $(this).find('.dropdown-menu').addClass('show');}, function() {$(this).removeClass('show'); $(this).find('.dropdown-menu').removeClass('show');});(Mi dispiace per la formattazione.)
Robin Zimmermann

Non funziona se hai due voci di menu a discesa. Al passaggio del mouse su qualsiasi elemento a discesa verranno visualizzati entrambi i sottomenu
Juan Antonio Tubío,

23

Un modo semplice, usando jQuery, è questo:

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

Adoro la transizione graduale, tuttavia provoca l'espansione di tutti i livelli del menu anziché solo del primo livello. Non voglio che vengano visualizzati i menu di secondo livello fino a quando non passerò il mouse sopra il loro genitore.
Connie DeCinko,

1
Per ottenere solo il primo livello, aggiungi .first() - $(this).find('.dropdown-menu').first().stop(true, true).delay(200).fadeIn(200);...
JEdot il

9

Per CSS diventa pazzo quando fai clic anche su di esso. Questo è il codice che sto usando, inoltre non cambia nulla per la visualizzazione mobile.

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

Una bellezza! Tx! Le alternative CSS non funzioneranno su Bootstrap 3 e versioni successive.
Pedro Ferreira,



5

Quindi hai questo codice:

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

Normalmente funziona all'evento click e vuoi che funzioni all'evento hover. Questo è molto semplice, basta usare questo codice javascript / 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();
        })
    })
})

Funziona molto bene ed ecco la spiegazione: abbiamo un pulsante e un menu. Quando si passa il mouse sul pulsante, viene visualizzato il menu e quando si passa il mouse sul pulsante, il menu viene nascosto dopo 100 ms. Se ti chiedi perché lo uso, è perché hai bisogno di tempo per trascinare il cursore dal pulsante sul menu. Quando si è nel menu, l'ora viene ripristinata e si può rimanere lì tutte le volte che si desidera. Quando esci dal menu, nasconderemo il menu all'istante senza alcun timeout.

Ho usato questo codice in molti progetti, se riscontri problemi nell'usarlo, sentiti libero di farmi domande.


Questo codice presenta molti problemi su bootstrap v3. 1.) Se è presente più di un menu a discesa, tutti i menu a discesa vengono visualizzati quando si passa con il mouse su uno. 2.) Su piccoli schermi, il passaggio del mouse mostra il menu a discesa in un modo strano.
KayakinKoder,

4

Questo è quello che uso per farlo cadere al passaggio del mouse con alcuni 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');
    });
});

Bello ma non supporta i sottomenu.
Connie DeCinko,

3

Prova questo usando la funzione hover con animazioni di dissolvenza in dissolvenza

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

Questa animazione non funziona in terza profondità, ma funziona in seconda profondità. Hai qualche altra soluzione per la terza profondità?
Jilani il

si prega di aggiungere JSFiddle per riferimento
Rakesh Vadnal

2

Questo ti aiuterà a creare la tua classe hover per bootstrap:

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

I margini sono impostati per evitare chiusure indesiderate e sono opzionali.

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>

Non dimenticare di rimuovere l'attributo button data-toggle = "dropdown" se vuoi rimuovere onclick open, e questo funzionerà anche quando l'input è accodato con dropdown.


2

Questo sorvola la barra di navigazione solo quando non sei su un dispositivo mobile, perché trovo che il passaggio del mouse sulla navigazione non funzioni bene su dispositivi mobili:

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

});

Puoi trovare una soluzione molto migliore qui: github.com/CWSpear/bootstrap-hover-dropdown .
solarbaypilot,

2

Provo altre soluzioni, sto usando bootstrap 3, ma il menu a discesa si chiude troppo rapidamente per spostarci sopra

supponendo che tu abbia aggiunto class = "dropdown" a li, ho aggiunto un timeout

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

2

Aggiornato con un plugin appropriato

Ho pubblicato un plug-in adeguato per la funzionalità di passaggio del mouse a discesa, in cui è anche possibile definire cosa succede quando si fa clic su dropdown-toggle sull'elemento:

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


Perché l'ho fatto, quando ci sono già molte soluzioni?

Ho avuto problemi con tutte le soluzioni precedentemente esistenti. Quelli CSS semplici non usano la .openclasse su .dropdown, quindi non ci sarà feedback sull'elemento toggle del menu a discesa quando il menu a discesa è visibile.

Quelli j stanno interferendo con il clic su .dropdown-toggle, quindi il menu a discesa viene visualizzato al passaggio del mouse, quindi lo nasconde quando si fa clic su un menu a discesa aperto e, spostando il mouse, il menu a discesa si attiverà nuovamente. Alcune delle soluzioni js frenano la compatibilità iOS, alcuni plugin non funzionano sui moderni browser desktop che supportano gli eventi touch.

Ecco perché ho creato il plug-in Dropst Hover Bootstrap che previene tutti questi problemi utilizzando solo l'API javascript standard Bootstrap, senza alcun hack.


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

Attivazione a click evento con a hoverha un piccolo errore. Se mouse-ine poi a clickcrea l'effetto viceversa. E opensquando mouse-oute closequando mouse-in. Una soluzione migliore:

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

La soluzione che sto proponendo rileva se il suo dispositivo non è a sfioramento e che il navbar-toggle(menu hamburger) non è visibile e rende la voce del menu principale che rivela il sottomenu al passaggio del mouse e segui il suo collegamento al clic .

Rende anche il margine 0 in alto perché lo spazio tra la barra di navigazione e il menu in alcuni browser non ti permetterà di passare ai sottotemi

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

Menu a discesa Bootstrap Lavora al passaggio del mouse e rimani vicino al clic aggiungendo display proprietà : blocco; in css e rimozione di questi attributi data-toggle = "dropdown" role = "button" dal tag button

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.