Sottomenu a discesa Bootstrap mancante


324

Bootstrap 3 è ancora in RC, ma stavo solo cercando di implementarlo. Non sono riuscito a capire come mettere una classe di sottomenu. Anche in css non esiste una classe e anche i nuovi documenti non ne parlano

Era lì in 2.x con il nome della classe come sottomenu a discesa


2
Ricorda che alcuni componenti sono stati modificati nella versione 3, inclusi menu, menu di navigazione e modali.
Deividi Cavarzan,

11
la mancanza di supporto nativo per questa utile funzione (imho) in BS3 è uno dei motivi principali per cui non sono ancora passato. anche se concordo sul fatto che non è così utile nei dispositivi mobili e che ora hanno un approccio "mobile first", sembra miope rimuovere una funzionalità che hanno già implementato, che è MOLTO utile sul desktop
Andrew Brown

4
Concordato sul fatto che è miope per rimuovere la funzionalità prevista. Questo tipo di cambiamento radicale dà agli sviluppatori aziendali una brutta giornata.
RJB,

Per effettuare un menu a discesa basta usare css codepen.io/Gothburz/pen/GpJKqP
Gothburz

Risposte:


555

Aggiornato 2018

Il file dropdown-submenuè stato rimosso in Bootstrap 3 RC. Nelle parole dell'autore Bootstrap Mark Otto ..

"I sottomenu non hanno molto spazio sul web in questo momento, specialmente il web mobile. Saranno rimossi con 3.0" - https://github.com/twbs/bootstrap/pull/6342

Ma con un po 'di CSS in più puoi ottenere la stessa funzionalità.

Bootstrap 4 (sottomenu della barra di navigazione al passaggio del mouse)

.navbar-nav li:hover > ul.dropdown-menu {
    display: block;
}
.dropdown-submenu {
    position:relative;
}
.dropdown-submenu>.dropdown-menu {
    top:0;
    left:100%;
    margin-top:-6px;
}

Passaggio del menu a discesa del sottomenu della barra di navigazione Passaggio del menu a discesa del sottomenu della barra di
navigazione (allineato a destra)
Clic del menu a discesa del sottomenu della barra di navigazione (allineato a destra)
Passaggio del menu a discesa del menu di navigazione (nessun sottomenu)


Bootstrap 3

Ecco un esempio che utilizza 3.0 RC 1: http://bootply.com/71520

Ecco un esempio che utilizza Bootstrap 3.0.0 (final): http://bootply.com/86684

CSS

.dropdown-submenu {
    position:relative;
}
.dropdown-submenu>.dropdown-menu {
    top:0;
    left:100%;
    margin-top:-6px;
    margin-left:-1px;
    -webkit-border-radius:0 6px 6px 6px;
    -moz-border-radius:0 6px 6px 6px;
    border-radius:0 6px 6px 6px;
}
.dropdown-submenu:hover>.dropdown-menu {
    display:block;
}
.dropdown-submenu>a:after {
    display:block;
    content:" ";
    float:right;
    width:0;
    height:0;
    border-color:transparent;
    border-style:solid;
    border-width:5px 0 5px 5px;
    border-left-color:#cccccc;
    margin-top:5px;
    margin-right:-10px;
}
.dropdown-submenu:hover>a:after {
    border-left-color:#ffffff;
}
.dropdown-submenu.pull-left {
    float:none;
}
.dropdown-submenu.pull-left>.dropdown-menu {
    left:-100%;
    margin-left:10px;
    -webkit-border-radius:6px 0 6px 6px;
    -moz-border-radius:6px 0 6px 6px;
    border-radius:6px 0 6px 6px;
}

Markup di esempio

<div class="navbar navbar-default navbar-fixed-top" role="navigation">
    <div class="container">
        <div class="navbar-header">
            <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">  
                <span class="sr-only">Toggle navigation</span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </button>
        </div>
        <div class="collapse navbar-collapse navbar-ex1-collapse">
            <ul class="nav navbar-nav">
                <li class="menu-item dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Drop Down<b class="caret"></b></a>
                    <ul class="dropdown-menu">
                        <li class="menu-item dropdown dropdown-submenu">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown">Level 1</a>
                            <ul class="dropdown-menu">
                                <li class="menu-item ">
                                    <a href="#">Link 1</a>
                                </li>
                                <li class="menu-item dropdown dropdown-submenu">
                                    <a href="#" class="dropdown-toggle" data-toggle="dropdown">Level 2</a>
                                    <ul class="dropdown-menu">
                                        <li>
                                            <a href="#">Link 3</a>
                                        </li>
                                    </ul>
                                </li>
                            </ul>
                        </li>
                    </ul>
                </li>
            </ul>
        </div>
    </div>
</div>

PS - Esempio in barra di navigazione che regola la posizione a sinistra: http://bootply.com/92442


5
Sì, grazie, l'ho aggiunto al foglio di stile del mio tema, basta copiarlo incollato dalla vecchia versione di bootstrap wordpress.org/themes/bikaner
DevC

8
Ad esempio bootply.com/86684 , aggiungi la seguente riga in css per il passaggio del mouse corretto sulla voce di menu principale quando visualizzi il sottomenu: .dropdown-submenu:hover {background: #e2e1e1;}
Eduardo Moralles

1
Funziona anche con 3.1.1. Mille grazie per la soluzione. Stavo battendo la testa contro il muro cercando di modificare il file bootstrap.js per funzionare correttamente.
Joel Kinzel,

2
Sto cercando di semplificare il più possibile le cose, ma ce n'è bisogno su siti Web di grandi dimensioni senza possibilità di aggirare più livelli di navigazione (come i siti Web governativi).
Troy Templeman,

1
Il sottomenu scompare anche prima che io possa spostare il mouse su di esso, quindi il passaggio del mouse non funziona! Non passa con il mouse, basandosi sul clic, ma funziona bene.
Polv,

61

La soluzione @skelly è buona ma non funziona sui dispositivi mobili poiché lo stato al passaggio del mouse non funziona.

Ho aggiunto un po 'di JS per ripristinare il comportamento di BS 2.3.2.

PS: funzionerà con il CSS che ci arrivi: http://bootply.com/71520 anche se puoi commentare la parte seguente:

CSS:

/*.dropdown-submenu:hover>.dropdown-menu{display:block;}*/

JS:

$('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) {
  // Avoid following the href location when clicking
  event.preventDefault();
  // Avoid having the menu to close when clicking
  event.stopPropagation();
  // If a menu is already open we close it
  $('ul.dropdown-menu [data-toggle=dropdown]').parent().removeClass('open');
  // opening the one you clicked on
  $(this).parent().addClass('open');
});

Il risultato può essere trovato sul mio tema WordPress (inizio pagina): http://shprinkone.julienrenaux.fr/


5
Sei il ragazzo più intelligente in questo post
user1143669 l'

2
Questa soluzione non tiene conto della volontà di mantenere la funzionalità hover quando si è sul desktop e non funziona anche per il secondo livello del sottomenu. Affinché ciò funzioni per più livelli di sottomenu, modifica le ultime due righe nella riga seguente:, $(this).closest(".dropdown-submenu").toggleClass("open");che aprirà / chiuderà le voci del menu dei collegamenti. Per mantenere il passaggio del mouse sul desktop è necessario un controllo sulla larghezza della finestra del browser, che differirà per ciascun sito.
bordi

grazie per il tuo codice. ma nel telefono cellulare il tuo codice ha un bug.
jian dan

42

Fino ad oggi (9 gennaio 2014) Bootstrap 3 non supporta ancora il menu a discesa del sottomenu.

Ho cercato su Google il menu di navigazione reattivo e ho scoperto che questo è il migliore che abbia pensato.

Sono i menu intelligenti http://www.smartmenus.org/

Spero che questa sia la via d'uscita per chiunque desideri un menu di navigazione con sottomenu multilivello.

aggiornamento 17-02-2015 I menu intelligenti ora supportano completamente lo stile dell'elemento Bootstrap per il sottomenu. Per ulteriori informazioni, consultare il sito Web dei menu intelligenti.


Ho avuto problemi nel tentativo di far passare il bootstrap su PC e fare clic sul tablet con più livelli. Mi hai migliorato la giornata! Funziona magnificamente - Utilizza praticamente lo stesso markup di bootstrap. Grazie! :)
Hippie,

2
Questa soluzione è gratuita, open source e funziona molto bene con BootStrap 3.
Patrick Desjardins

5
Sorprendente! Facile! Per dettagli specifici sull'integrazione di Bootstrap 3, vedere qui: vadikom.github.io/smartmenus/src/demo/bootstrap-navbar.html
manafire

1
Smartmenus è carino, tuttavia funziona solo con le barre di navigazione, non con semplici menu a discesa.
Nikolai Prokoschenko,

1
hai salvato il mio progetto :-)
Sikander,

5

Il codice di Shprink mi ha aiutato di più, ma per evitare che il menu a discesa andasse fuori schermo l'ho aggiornato in:

JS:

$('ul.dropdown-menu [data-toggle=dropdown]').on('click', function(event) {
    // Avoid following the href location when clicking
    event.preventDefault(); 
    // Avoid having the menu to close when clicking
    event.stopPropagation(); 
    // If a menu is already open we close it
    $('ul.dropdown-menu [data-toggle=dropdown]').parent().removeClass('open');
    // opening the one you clicked on
    $(this).parent().addClass('open');

    var menu = $(this).parent().find("ul");
    var menupos = $(menu).offset();

    if (menupos.left + menu.width() > $(window).width()) {
        var newpos = -$(menu).width();
        menu.css({ left: newpos });    
    } else {
        var newpos = $(this).parent().width();
        menu.css({ left: newpos });
    }

});

CSS: DA background-color: #eeeeee TO background-color: # c5c5c5 - il carattere bianco e lo sfondo chiaro non stavano bene.

.nav .open > a,
.nav .open > a:hover,
.nav .open > a:focus {
  background-color: #c5c5c5;
  border-color: #428bca;
}

Spero che questo aiuti le persone tanto quanto ha fatto per me!

Ma spero che Bootstrap aggiunga la funzionalità dei sottotitoli appena possibile.


4

Commenta la soluzione davvero utile di Skelly : in Bootstrap-sass 3.3.6, utilities.scss, linea 19: .pull-lefthas float:left !important. Da allora, consiglio di usare! Important anche nel suo CSS:

.dropdown-submenu.pull-left {
    float:none !important;
}

2

Ho riscontrato questo problema alcuni giorni fa. Ho provato molte soluzioni e nessuna ha funzionato davvero per me alla fine ho finito per creare un ampliamento / override del codice a discesa di bootstrap. È una copia del codice originale con modifiche alla funzione closeMenus.

Penso che sia una buona soluzione poiché non influenza le classi principali di bootstrap js.

Puoi verificarlo su gihub: https://github.com/djokodonev/bootstrap-multilevel-dropdown


Questa è un'ottima soluzione per il menu a discesa multilivello, mi piace usarlo.
huncyrus,

Sono contento che ti sia piaciuto :-)
George Donev il

-2

Faccio un'altra soluzione per il menu a discesa. Spero che questo sia utile. Basta aggiungere questo script js

<script type="text/javascript"> jQuery("document").ready(function() {
  jQuery("ul.dropdown-menu > .dropdown.parent").click(function(e) {
    e.preventDefault();
    e.stopPropagation();
    if (jQuery(this).hasClass('open2'))
      jQuery(this).removeClass('open2');
    else {
      jQuery(this).addClass('open2');
    }

  });
}); < /script>

<style type="text/css">.open2{display:block; position:relative;}</style>
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.