Cómo agregar submenús desplegables a Bootstrap
Problema: Agregar submenús desplegables a Bootstrap
Bootstrap ofrece componentes de navegación, incluyendo menús desplegables. Sin embargo, crear submenús desplegables anidados dentro de estos menús no es una función integrada. Esta limitación puede dificultar la organización de estructuras de navegación complejas en sitios web basados en Bootstrap.
Implementación de submenús desplegables
Solución basada en CSS para Bootstrap 5
Para agregar submenús desplegables en Bootstrap 5, puedes usar CSS personalizado. Este método se centra en posicionar los submenús y añadir efectos de desplazamiento para los elementos del menú.
Aquí tienes un ejemplo de CSS para posicionar submenús:
.dropdown-submenu {
position: relative;
}
.dropdown-submenu .dropdown-menu {
top: 0;
left: 100%;
margin-top: -1px;
}
Este CSS posiciona el submenú a la derecha de su elemento padre en el menú. Para añadir efectos de desplazamiento, incluye lo siguiente:
.navbar-nav li:hover > ul.dropdown-menu {
display: block;
}
Este CSS muestra el submenú cuando se pasa el cursor sobre el elemento padre del menú.
Ejemplo: Evitar desbordamiento de submenús
Para evitar que los submenús se desborden del área visible en pantallas más pequeñas, añade este CSS:
@media (max-width: 768px) {
.dropdown-submenu .dropdown-menu {
left: 0;
top: 100%;
}
}
Esto posiciona el submenú debajo de su elemento padre en pantallas más pequeñas.
Enfoque mejorado con JavaScript
Para tener más control sobre el comportamiento de los submenús, puedes usar JavaScript. Este método ayuda a evitar que los submenús se cierren y añade funcionalidad de visualización alternada.
Aquí tienes un ejemplo de JavaScript:
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'
})
})
Este script evita que el submenú se cierre cuando el menú desplegable padre está abierto. Alterna la visualización del submenú entre 'block' y 'none' cuando se hace clic.
Métodos Alternativos
Adaptación a Diferentes Versiones de Bootstrap
Implementación de Submenú en Bootstrap 4
Bootstrap 4 necesita cambios en CSS para agregar submenús desplegables. Aquí hay un ejemplo de CSS para Bootstrap 4:
.navbar-nav li:hover > ul.dropdown-menu {
display: block;
}
.dropdown-submenu {
position: relative;
}
.dropdown-submenu > .dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
}
Este CSS coloca el submenú a la derecha de su elemento padre y lo muestra al pasar el mouse.
Para opciones de submenú basadas en clics, puedes usar esta función JavaScript:
$('.dropdown-menu a.dropdown-toggle').on('click', function(e) {
if (!$(this).next().hasClass('show')) {
$(this).parents('.dropdown-menu').first().find('.show').removeClass('show');
}
var $subMenu = $(this).next('.dropdown-menu');
$subMenu.toggleClass('show');
return false;
});
Este script alterna la clase 'show' en el submenú al hacer clic, permitiendo la navegación basada en clics.
Ejemplo: Mejora de Accesibilidad
Para mejorar la accesibilidad, agrega atributos ARIA a los elementos de tu menú desplegable. Por ejemplo:
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Desplegable
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdown">
<!-- Elementos del desplegable aquí -->
</div>
</li>
Esto ayuda a los lectores de pantalla a entender la estructura y el comportamiento de tus menús desplegables.
Soporte Heredado para Bootstrap 3
Para Bootstrap 3, necesitas CSS personalizado para crear submenús desplegables. Aquí tienes un ejemplo:
.dropdown-submenu {
position: relative;
}
.dropdown-submenu > .dropdown-menu {
top: 0;
left: 100%;
margin-top: -6px;
margin-left: -1px;
border-radius: 0 6px 6px 6px;
}
.dropdown-submenu:hover > .dropdown-menu {
display: block;
}
Este CSS coloca el submenú y lo muestra al pasar el mouse.
La estructura HTML para menús desplegables anidados en Bootstrap 3 se ve así:
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Desplegable <b class="caret"></b></a>
<ul class="dropdown-menu">
<li class="dropdown-submenu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Submenú</a>
<ul class="dropdown-menu">
<li><a href="#">Elemento de submenú 1</a></li>
<li><a href="#">Elemento de submenú 2</a></li>
</ul>
</li>
</ul>
</li>
Esta estructura crea un menú desplegable con un submenú anidado, permitiendo la navegación multinivel en Bootstrap 3.