Listas deplegables
Alterne las superposiciones contextuales para mostrar listas de enlaces y más con el complemento desplegable Bootstrap.
Los menús desplegables son superposiciones contextuales que se pueden alternar para mostrar listas de enlaces y más. Se hacen interactivos con el complemento de JavaScript desplegable de Bootstrap incluido. Se alternan al hacer clic, no al pasar el mouse; esta es una decisión de diseño intencional.
Los menús desplegables se basan en una biblioteca de terceros, Popper.js , que proporciona posicionamiento dinámico y detección de ventana gráfica. Asegúrese de incluir popper.min.js antes del JavaScript de Bootstrap o use bootstrap.bundle.min.js
/ bootstrap.bundle.js
que contiene Popper.js. Popper.js no se usa para posicionar los menús desplegables en las barras de navegación, ya que no se requiere un posicionamiento dinámico.
Si está compilando nuestro JavaScript desde la fuente, requiereutil.js
.
El estándar WAI ARIA define un role="menu"
widget real , pero esto es específico para menús similares a aplicaciones que activan acciones o funciones. Los menús de ARIA solo pueden contener elementos de menú, elementos de menú de casillas de verificación, elementos de menú de botones de opción, grupos de botones de opción y submenús.
Los menús desplegables de Bootstrap, por otro lado, están diseñados para ser genéricos y aplicables a una variedad de situaciones y estructuras de marcado. Por ejemplo, es posible crear menús desplegables que contengan entradas adicionales y controles de formulario, como campos de búsqueda o formularios de inicio de sesión. Por esta razón, Bootstrap no espera (ni agrega automáticamente) ninguno de los role
atributos aria-
necesarios para los menús ARIA verdaderos. Los autores tendrán que incluir ellos mismos estos atributos más específicos.
Sin embargo, Bootstrap agrega soporte incorporado para la mayoría de las interacciones estándar del menú del teclado, como la capacidad de moverse a través de .dropdown-item
elementos individuales usando las teclas del cursor y cerrar el menú con la ESCtecla.
Envuelve el conmutador del menú desplegable (tu botón o enlace) y el menú desplegable dentro .dropdown
de u otro elemento que declare position: relative;
. Los menús desplegables se pueden activar desde <a>
o <button>
elementos para adaptarse mejor a sus necesidades potenciales.
Cualquiera .btn
se puede convertir en un menú desplegable con algunos cambios de marcado. Así es como puede ponerlos a trabajar con cualquiera de los <button>
elementos:
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Dropdown button
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
Y con <a>
elementos:
<div class="dropdown show">
<a class="btn btn-secondary dropdown-toggle" href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Dropdown link
</a>
<div class="dropdown-menu" aria-labelledby="dropdownMenuLink">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
</div>
</div>
La mejor parte es que también puedes hacer esto con cualquier variante de botón:
Del mismo modo, cree menús desplegables de botones divididos con prácticamente el mismo marcado que los menús desplegables de un solo botón, pero con la adición de .dropdown-toggle-split
un espacio adecuado alrededor del símbolo de intercalación desplegable.
Usamos esta clase adicional para reducir la horizontal padding
a ambos lados del símbolo de intercalación en un 25 % y eliminar lo margin-left
que se agrega para los menús desplegables de botones normales. Esos cambios adicionales mantienen el símbolo de intercalación centrado en el botón de división y brindan un área de impacto de tamaño más apropiado al lado del botón principal.
Los menús desplegables de botones funcionan con botones de todos los tamaños, incluidos los botones desplegables predeterminados y divididos.
Active los menús desplegables sobre los elementos al agregarlos .dropup
al elemento principal.
Active los menús desplegables a la derecha de los elementos al agregar .dropright
al elemento principal.
Active los menús desplegables a la izquierda de los elementos al agregar .dropleft
al elemento principal.
Históricamente, el contenido del menú desplegable tenía que ser enlaces, pero ese ya no es el caso con v4. Ahora, opcionalmente, puede usar <button>
elementos en sus menús desplegables en lugar de solo <a>
s.
<div class="dropdown">
<button class="btn btn-secondary dropdown-toggle" type="button" id="dropdownMenu2" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Dropdown
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenu2">
<button class="dropdown-item" type="button">Action</button>
<button class="dropdown-item" type="button">Another action</button>
<button class="dropdown-item" type="button">Something else here</button>
</div>
</div>
De forma predeterminada, un menú desplegable se coloca automáticamente al 100 % desde la parte superior y a lo largo del lado izquierdo de su elemento principal. Agregue .dropdown-menu-right
a .dropdown-menu
para alinear a la derecha el menú desplegable.
¡Aviso! Los menús desplegables se posicionan gracias a Popper.js (excepto cuando están contenidos en una barra de navegación).
<div class="btn-group">
<button type="button" class="btn btn-secondary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Right-aligned menu
</button>
<div class="dropdown-menu dropdown-menu-right">
<button class="dropdown-item" type="button">Action</button>
<button class="dropdown-item" type="button">Another action</button>
<button class="dropdown-item" type="button">Something else here</button>
</div>
</div>
Agregue un encabezado para etiquetar secciones de acciones en cualquier menú desplegable.
<div class="dropdown-menu">
<h6 class="dropdown-header">Dropdown header</h6>
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
</div>
Separe los grupos de elementos de menú relacionados con un divisor.
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Action</a>
<a class="dropdown-item" href="#">Another action</a>
<a class="dropdown-item" href="#">Something else here</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">Separated link</a>
</div>
Coloque un formulario dentro de un menú desplegable, o conviértalo en un menú desplegable, y use utilidades de margen o relleno para darle el espacio negativo que necesita.
<div class="dropdown-menu">
<form class="px-4 py-3">
<div class="form-group">
<label for="exampleDropdownFormEmail1">Email address</label>
<input type="email" class="form-control" id="exampleDropdownFormEmail1" placeholder="[email protected]">
</div>
<div class="form-group">
<label for="exampleDropdownFormPassword1">Password</label>
<input type="password" class="form-control" id="exampleDropdownFormPassword1" placeholder="Password">
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="dropdownCheck">
<label class="form-check-label" for="dropdownCheck">
Remember me
</label>
</div>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
<div class="dropdown-divider"></div>
<a class="dropdown-item" href="#">New around here? Sign up</a>
<a class="dropdown-item" href="#">Forgot password?</a>
</div>
<form class="dropdown-menu p-4">
<div class="form-group">
<label for="exampleDropdownFormEmail2">Email address</label>
<input type="email" class="form-control" id="exampleDropdownFormEmail2" placeholder="[email protected]">
</div>
<div class="form-group">
<label for="exampleDropdownFormPassword2">Password</label>
<input type="password" class="form-control" id="exampleDropdownFormPassword2" placeholder="Password">
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="dropdownCheck2">
<label class="form-check-label" for="dropdownCheck2">
Remember me
</label>
</div>
<button type="submit" class="btn btn-primary">Sign in</button>
</form>
Agregue .active
elementos en el menú desplegable para diseñarlos como activos .
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Regular link</a>
<a class="dropdown-item active" href="#">Active link</a>
<a class="dropdown-item" href="#">Another link</a>
</div>
Agregue .disabled
elementos en el menú desplegable para diseñarlos como deshabilitados .
<div class="dropdown-menu">
<a class="dropdown-item" href="#">Regular link</a>
<a class="dropdown-item disabled" href="#">Disabled link</a>
<a class="dropdown-item" href="#">Another link</a>
</div>
A través de atributos de datos o JavaScript, el complemento desplegable alterna el contenido oculto (menús desplegables) al alternar la .show
clase en el elemento de la lista principal. Se data-toggle="dropdown"
confía en el atributo para cerrar los menús desplegables a nivel de aplicación, por lo que es una buena idea usarlo siempre.
En dispositivos táctiles, abrir un menú desplegable agrega controladores vacíos ( $.noop
) mouseover
a los elementos secundarios inmediatos del <body>
elemento. Este truco ciertamente feo es necesario para evitar una peculiaridad en la delegación de eventos de iOS , que de lo contrario evitaría que un toque en cualquier lugar fuera del menú desplegable active el código que cierra el menú desplegable. Una vez que se cierra el menú desplegable, estos mouseover
controladores vacíos adicionales se eliminan.
Agregue data-toggle="dropdown"
a un enlace o botón para alternar un menú desplegable.
Llame a los menús desplegables a través de JavaScript:
data-toggle="dropdown"
todavía se requiere
Independientemente de si llama a su menú desplegable a través de JavaScript o en su lugar usa la API de datos, data-toggle="dropdown"
siempre se requiere que esté presente en el elemento desencadenante del menú desplegable.
Las opciones se pueden pasar a través de atributos de datos o JavaScript. Para los atributos de datos, agregue el nombre de la opción a data-
, como en data-offset=""
.
Nombre | Escribe | Defecto | Descripción |
---|---|---|---|
compensar | número | cadena | función | 0 | Desplazamiento del menú desplegable en relación con su destino. Para obtener más información, consulte los documentos de compensación de Popper.js . |
dar la vuelta | booleano | verdadero | Permita que Dropdown se voltee en caso de superposición en el elemento de referencia. Para obtener más información, consulte los documentos flip de Popper.js . |
Perímetro | cadena | elemento | 'padre de desplazamiento' | Límite de restricción de desbordamiento del menú desplegable. Acepta los valores de 'viewport' , 'window' , 'scrollParent' o una referencia HTMLElement (solo JavaScript). Para obtener más información, consulte los documentos de preventOverflow de Popper.js . |
Tenga en cuenta que cuando boundary
se establece en cualquier valor que no sea 'scrollParent'
, el estilo position: static
se aplica al .dropdown
contenedor.
Método | Descripción |
---|---|
$().dropdown('toggle') |
Alterna el menú desplegable de una barra de navegación determinada o navegación con pestañas. |
$().dropdown('update') |
Actualiza la posición del menú desplegable de un elemento. |
$().dropdown('dispose') |
Destruye el menú desplegable de un elemento. |
Todos los eventos desplegables se activan en el .dropdown-menu
elemento principal y tienen una relatedTarget
propiedad, cuyo valor es el elemento ancla de alternancia.
Evento | Descripción |
---|---|
show.bs.dropdown |
Este evento se activa inmediatamente cuando se llama al método de instancia show. |
shown.bs.dropdown |
Este evento se activa cuando el menú desplegable se ha hecho visible para el usuario (esperará a que se completen las transiciones de CSS). |
hide.bs.dropdown |
Este evento se activa inmediatamente cuando se llama al método de instancia oculta. |
hidden.bs.dropdown |
Este evento se activa cuando el menú desplegable ha terminado de ocultarse para el usuario (esperará a que se completen las transiciones de CSS). |