Falta el submenú desplegable Bootstrap

Resuelto DevC asked hace 11 años • 11 respuestas

Bootstrap 3 todavía está en RC, pero solo estaba intentando implementarlo. No pude entender cómo poner una clase de submenú. Incluso no hay clases de CSS e incluso los nuevos documentos no dicen nada al respecto.

Estaba allí en 2.x con el nombre de la clase como submenú desplegable

DevC avatar Aug 03 '13 01:08 DevC
Aceptado

Bootstrap 5 (actualización 2023)

Agregue algo de JavaScript para evitar que el submenú se cierre cuando el menú desplegable principal esté abierto. Esto se puede hacer alternando display:block...

let dropdowns = document.querySelectorAll('.dropdown-toggle')
dropdowns.forEach((dd)=>{
    dd.addEventListener('click', function (e) {
        var el = this.nextElementSibling
        el.style.display = el.style.display==='block'?'none':'block'
    })
})

Menú desplegable de varios niveles de Bootstrap 5: haga clic en Menú
desplegable de varios niveles de Bootstrap 5: pase el cursor
Menú desplegable de varios niveles de Bootstrap 5: pase el cursor y anime la transición

O puede utilizar este método exclusivo de CSS para los menús desplegables de la barra de navegación...

.dropdown-submenu {
  position: relative;
}

.dropdown-submenu .dropdown-menu {
  top: 0;
  left: 100%;
  margin-top: -1px;
}

.navbar-nav li:hover > ul.dropdown-menu {
    display: block;
}

Submenús desplegables de desplazamiento de la barra de navegación de Bootstrap 5 (solo CSS)


Bootstrap 4 (actualización 2018)

Se dropdown-submenuha eliminado en Bootstrap 3 RC. En palabras del autor de Bootstrap, Mark Otto.

"Los submenús simplemente no tienen mucho lugar en la web en este momento, especialmente en la web móvil. Se eliminarán con 3.0" - https://github.com/twbs/bootstrap/pull/6342

Pero con un poco más de CSS puedes obtener la misma funcionalidad.

submenú de la barra de navegación al pasar el 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;
}

Colocar el cursor sobre el menú desplegable de la barra de navegación Colocar el cursor
sobre el menú desplegable de la barra de navegación (alineado a la derecha)
Clic en el menú desplegable de la barra de navegación (alineado a la derecha)
Colocar el cursor sobre el menú desplegable de la barra de navegación (sin submenú)


Arranque 3

Aquí hay un ejemplo que usa Bootstrap 3: https://codeply.com/p/T9FWGhhL0S

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

Marcado de muestra

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

PD: ejemplo en la barra de navegación que ajusta la posición izquierda: https://codeply.com/p/XEiERVGcmz

Carol Skelly avatar Aug 02 '2013 19:08 Carol Skelly

La solución @skelly es buena pero no funcionará en dispositivos móviles ya que el estado de desplazamiento no funcionará.

Agregué un poco de JS para recuperar el comportamiento de BS 2.3.2.

PD: funcionará con el CSS que obtienes allí: http://bootply.com/71520 aunque puedes comentar la siguiente parte:

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

El resultado se puede encontrar en mi tema de WordPress (parte superior de la página): http://shprinkone.julienrenaux.fr/

Shprink avatar Sep 08 '2013 10:09 Shprink