Offcanvas
Construye barras laterales ocultas en tu proyecto para navegación, carritos de compra y más con unas pocas clases y nuestro plugin de JavaScript.
Cómo funciona
Offcanvas es un componente de barra lateral que se puede alternar mediante JavaScript para
que aparezca desde el borde izquierdo, derecho, superior o inferior del viewport. Los botones o anclajes se
usan como disparadores que se adjuntan a elementos específicos que alternas, y los atributos data
se usan para invocar nuestro JavaScript.
- Offcanvas comparte parte del mismo código JavaScript que los modales. Conceptualmente, son bastante similares, pero son plugins independientes.
- De manera similar, algunas variables de Sass de origen para los estilos y dimensiones de offcanvas se heredan de las variables del modal.
- Cuando se muestra, offcanvas incluye un fondo por defecto que se puede clicar para ocultar el offcanvas.
- Al igual que los modales, solo se puede mostrar un offcanvas a la vez.
¡Atención! Dado cómo CSS maneja las animaciones, no puedes usar
margin o translate en un elemento .offcanvas. En su lugar, usa la clase
como un elemento contenedor independiente.
prefers-reduced-motion. Consulta la sección de movimiento reducido de nuestra
documentación de accesibilidad.Ejemplos
Componentes offcanvas
A continuación se muestra un ejemplo de offcanvas que se muestra por defecto (vía
.show en .offcanvas). Offcanvas incluye soporte para un encabezado con un botón de
cierre y una clase body opcional para algo de padding inicial. Sugerimos que incluyas encabezados
offcanvas con acciones de cierre siempre que sea posible, o que proporciones una acción de cierre explícita.
Offcanvas
<div class="offcanvas offcanvas-start show" tabindex="-1" id="offcanvas" aria-labelledby="offcanvasLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasLabel">Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
Content for the offcanvas goes here. You can place just about any Bootstrap component or custom elements here.
</div>
</div>
Demo en vivo
Usa los botones a continuación para mostrar y ocultar un elemento offcanvas vía JavaScript
que conmuta la clase .show en un elemento con la clase .offcanvas.
.offcanvasoculta contenido (por defecto).offcanvas.showmuestra contenido
Puedes usar un enlace con el atributo href, o un botón con el atributo
data-bs-target. En ambos casos, se requiere data-bs-toggle="offcanvas".
Offcanvas
<a class="btn btn-primary" data-bs-toggle="offcanvas" href="#offcanvasExample" role="button" aria-controls="offcanvasExample">
Link with href
</a>
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasExample" aria-controls="offcanvasExample">
Button with data-bs-target
</button>
<div class="offcanvas offcanvas-start" tabindex="-1" id="offcanvasExample" aria-labelledby="offcanvasExampleLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasExampleLabel">Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<div>
Some text as placeholder. In real life you can have the elements you have chosen. Like, text, images, lists, etc.
</div>
<div class="dropdown mt-3">
<button class="btn btn-secondary dropdown-toggle" type="button" data-bs-toggle="dropdown">
Dropdown button
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#">Action</a></li>
<li><a class="dropdown-item" href="#">Another action</a></li>
<li><a class="dropdown-item" href="#">Something else here</a></li>
</ul>
</div>
</div>
</div>
Desplazamiento del body
El desplazamiento del elemento <body> se deshabilita cuando un offcanvas
y su fondo son visibles. Usa el atributo data-bs-scroll para habilitar el desplazamiento del
<body>.
Offcanvas con desplazamiento del body
Prueba a desplazar el resto de la página para ver esta opción en acción.
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasScrolling" aria-controls="offcanvasScrolling">Enable body scrolling</button>
<div class="offcanvas offcanvas-start" data-bs-scroll="true" data-bs-backdrop="false" tabindex="-1" id="offcanvasScrolling" aria-labelledby="offcanvasScrollingLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasScrollingLabel">Offcanvas with body scrolling</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Try scrolling the rest of the page to see this option in action.</p>
</div>
</div>
Desplazamiento del body y fondo
También puedes habilitar el desplazamiento del <body> con un fondo
visible.
Fondo con desplazamiento
Prueba a desplazar el resto de la página para ver esta opción en acción.
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasWithBothOptions" aria-controls="offcanvasWithBothOptions">Enable both scrolling & backdrop</button>
<div class="offcanvas offcanvas-start" data-bs-scroll="true" tabindex="-1" id="offcanvasWithBothOptions" aria-labelledby="offcanvasWithBothOptionsLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasWithBothOptionsLabel">Backdrop with scrolling</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Try scrolling the rest of the page to see this option in action.</p>
</div>
</div>
Fondo estático
Cuando el fondo está establecido como estático, el offcanvas no se cerrará al hacer clic fuera de él.
Offcanvas
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#staticBackdrop" aria-controls="staticBackdrop">
Toggle static offcanvas
</button>
<div class="offcanvas offcanvas-start" data-bs-backdrop="static" tabindex="-1" id="staticBackdrop" aria-labelledby="staticBackdropLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="staticBackdropLabel">Offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<div>
I will not close if you click outside of me.
</div>
</div>
</div>
Offcanvas oscuro
Añadido en v5.2.0Cambia la apariencia de los offcanvas con utilidades para que coincidan mejor con
diferentes contextos como navbars oscuros. Aquí añadimos .text-bg-dark al .offcanvas
y .btn-close-white a .btn-close para un estilo correcto con un offcanvas oscuro. Si
tienes dropdowns dentro, considera también añadir .dropdown-menu-dark a
.dropdown-menu.
Offcanvas
Coloca el contenido del offcanvas aquí.
<div class="offcanvas offcanvas-start show text-bg-dark" tabindex="-1" id="offcanvasDark" aria-labelledby="offcanvasDarkLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasDarkLabel">Offcanvas</h5>
<button type="button" class="btn-close btn-close-white" data-bs-dismiss="offcanvasDark" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p>Place offcanvas content here.</p>
</div>
</div>
Responsive
Añadido en v5.2.0Las clases offcanvas responsive ocultan el contenido fuera del viewport desde un punto de
interrupción específico hacia abajo. Por encima de ese punto de interrupción, el contenido interno se
comportará como de costumbre. Por ejemplo, .offcanvas-lg oculta el contenido en un offcanvas por
debajo del punto de interrupción lg, pero muestra el contenido por encima del punto de
interrupción lg.
Offcanvas responsive
Este es contenido dentro de un .offcanvas-lg.
<button class="btn btn-primary d-lg-none" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasResponsive" aria-controls="offcanvasResponsive">Toggle offcanvas</button>
<div class="alert alert-info d-none d-lg-block">Resize your browser to show the responsive offcanvas toggle.</div>
<div class="offcanvas-lg offcanvas-end" tabindex="-1" id="offcanvasResponsive" aria-labelledby="offcanvasResponsiveLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasResponsiveLabel">Responsive offcanvas</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#offcanvasResponsive" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
<p class="mb-0">This is content within an <code>.offcanvas-lg</code>.</p>
</div>
</div>
Las clases offcanvas responsive están disponibles para cada punto de interrupción.
.offcanvas.offcanvas-sm.offcanvas-md.offcanvas-lg.offcanvas-xl.offcanvas-xxl
Ubicación
No hay una ubicación predeterminada para los componentes offcanvas, por lo que debes añadir una de las clases modificadoras de abajo.
.offcanvas-startcoloca offcanvas a la izquierda del viewport (mostrado arriba).offcanvas-endcoloca offcanvas a la derecha del viewport.offcanvas-topcoloca offcanvas en la parte superior del viewport.offcanvas-bottomcoloca offcanvas en la parte inferior del viewport
Prueba los ejemplos superior, derecho e inferior a continuación.
Offcanvas superior
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasTop" aria-controls="offcanvasTop">Toggle top offcanvas</button>
<div class="offcanvas offcanvas-top" tabindex="-1" id="offcanvasTop" aria-labelledby="offcanvasTopLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasTopLabel">Offcanvas top</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
...
</div>
</div>
Offcanvas derecho
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasRight" aria-controls="offcanvasRight">Toggle right offcanvas</button>
<div class="offcanvas offcanvas-end" tabindex="-1" id="offcanvasRight" aria-labelledby="offcanvasRightLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasRightLabel">Offcanvas right</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body">
...
</div>
</div>
Offcanvas inferior
<button class="btn btn-primary" type="button" data-bs-toggle="offcanvas" data-bs-target="#offcanvasBottom" aria-controls="offcanvasBottom">Toggle bottom offcanvas</button>
<div class="offcanvas offcanvas-bottom" tabindex="-1" id="offcanvasBottom" aria-labelledby="offcanvasBottomLabel">
<div class="offcanvas-header">
<h5 class="offcanvas-title" id="offcanvasBottomLabel">Offcanvas bottom</h5>
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body small">
...
</div>
</div>
Accesibilidad
Dado que el panel offcanvas es conceptualmente un diálogo modal, asegúrate de añadir
aria-labelledby="..."—haciendo referencia al título del offcanvas—a .offcanvas. Ten
en cuenta que no necesitas añadir role="dialog" ya que lo añadimos vía JavaScript.
CSS
Variables
Añadido en v5.2.0Como parte del enfoque evolutivo de variables CSS de Bootstrap, offcanvas ahora usa
variables CSS locales en .offcanvas para una personalización en tiempo real mejorada. Los valores
de las variables CSS se establecen mediante Sass, por lo que la personalización con Sass también sigue siendo
compatible.
--#{$prefix}offcanvas-zindex: #{$zindex-offcanvas};
--#{$prefix}offcanvas-width: #{$offcanvas-horizontal-width};
--#{$prefix}offcanvas-height: #{$offcanvas-vertical-height};
--#{$prefix}offcanvas-padding-x: #{$offcanvas-padding-x};
--#{$prefix}offcanvas-padding-y: #{$offcanvas-padding-y};
--#{$prefix}offcanvas-color: #{$offcanvas-color};
--#{$prefix}offcanvas-bg: #{$offcanvas-bg-color};
--#{$prefix}offcanvas-border-width: #{$offcanvas-border-width};
--#{$prefix}offcanvas-border-color: #{$offcanvas-border-color};
--#{$prefix}offcanvas-box-shadow: #{$offcanvas-box-shadow};
Variables Sass
$offcanvas-padding-y: $modal-inner-padding;
$offcanvas-padding-x: $modal-inner-padding;
$offcanvas-horizontal-width: 400px;
$offcanvas-vertical-height: 30vh;
$offcanvas-transition-duration: .3s;
$offcanvas-border-color: $modal-content-border-color;
$offcanvas-border-width: $modal-content-border-width;
$offcanvas-title-line-height: $modal-title-line-height;
$offcanvas-bg-color: $modal-content-bg;
$offcanvas-color: $modal-content-color;
$offcanvas-box-shadow: $modal-content-box-shadow-xs;
$offcanvas-backdrop-bg: $modal-backdrop-bg;
$offcanvas-backdrop-opacity: $modal-backdrop-opacity;
Uso
El plugin offcanvas utiliza algunas clases y atributos para manejar el trabajo pesado:
.offcanvasoculta el contenido.offcanvas.showmuestra el contenido.offcanvas-startoculta el offcanvas a la izquierda.offcanvas-endoculta el offcanvas a la derecha.offcanvas-topoculta el offcanvas en la parte superior.offcanvas-bottomoculta el offcanvas en la parte inferior
Añade un botón de cierre con el atributo data-bs-dismiss="offcanvas", que
activa la funcionalidad de JavaScript. Asegúrate de usar el elemento <button> con él para
un comportamiento adecuado en todos los dispositivos.
Vía atributos data
Alternar
Añade data-bs-toggle="offcanvas" y un data-bs-target o
href al elemento para asignar automáticamente el control de un elemento offcanvas. El atributo
data-bs-target acepta un selector CSS para aplicar el offcanvas. Asegúrate de añadir la clase
offcanvas al elemento offcanvas. Si quieres que se abra por defecto, añade la clase adicional
show.
Cerrar
El cierre se puede lograr con el atributo data en un botón dentro del
offcanvas como se demuestra a continuación:
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" aria-label="Close"></button>
o en un botón fuera del offcanvas usando data-bs-target como
se demuestra a continuación:
<button type="button" class="btn-close" data-bs-dismiss="offcanvas" data-bs-target="#my-offcanvas" aria-label="Close"></button>
Vía JavaScript
Habilita manualmente con:
const offcanvasElementList = document.querySelectorAll('.offcanvas')
const offcanvasList = [...offcanvasElementList].map(offcanvasEl => new bootstrap.Offcanvas(offcanvasEl))
Opciones
Como las opciones se pueden pasar vía atributos data o JavaScript, puedes añadir un nombre
de opción a data-bs-, como en data-bs-animation="{value}". Asegúrate de cambiar el
tipo de capitalización del nombre de la opción de “camelCase” a “kebab-case” al pasar las
opciones vía atributos data. Por ejemplo, usa data-bs-custom-class="beautifier" en lugar de
data-bs-customClass="beautifier".
A partir de Bootstrap 5.2.0, todos los componentes soportan un atributo data reservado
experimental data-bs-config que puede albergar una configuración simple del
componente como una cadena JSON. Cuando un elemento tiene los atributos
data-bs-config='{"delay":0, "title":123}' y data-bs-title="456", el valor final de
title será 456 y los atributos data separados sobrescribirán los valores dados en
data-bs-config. Además, los atributos data existentes pueden albergar valores JSON como
data-bs-delay='{"show":0,"hide":150}'.
| Nombre | Tipo | Predeterminado | Descripción |
|---|---|---|---|
backdrop |
boolean o la cadena static |
true |
Aplica un fondo en el body mientras el offcanvas está abierto. Alternativamente,
especifica static para un fondo que no cierre el offcanvas al hacer clic. |
keyboard |
boolean | true |
Cierra el offcanvas cuando se presiona la tecla escape. |
scroll |
boolean | false |
Permite el desplazamiento del body mientras el offcanvas está abierto. |
Métodos
Métodos asíncronos y transiciones
Todos los métodos de la API son asíncronos e inician una transición. Vuelven al llamador tan pronto como se inicia la transición pero antes de que termine. Además, una llamada a un método en un componente en transición será ignorada.
Consulta nuestra documentación de JavaScript para más información.
Activa tu contenido como un elemento offcanvas. Acepta un objeto de opciones
opcional.
Puedes crear una instancia de offcanvas con el constructor, por ejemplo:
const bsOffcanvas = new bootstrap.Offcanvas('#myOffcanvas')
| Método | Descripción |
|---|---|
getInstance |
Método estático que te permite obtener la instancia de offcanvas asociada a un elemento DOM. |
getOrCreateInstance |
Método estático que te permite obtener la instancia de offcanvas asociada a un elemento DOM, o crear una nueva en caso de que no haya sido inicializada. |
hide |
Oculta un elemento offcanvas. Vuelve al llamador antes de que el elemento
offcanvas se haya ocultado realmente (es decir, antes de que ocurra el evento
hidden.bs.offcanvas). |
show |
Muestra un elemento offcanvas. Vuelve al llamador antes de que el elemento
offcanvas se haya mostrado realmente (es decir, antes de que ocurra el evento
shown.bs.offcanvas). |
toggle |
Conmuta un elemento offcanvas a mostrado u oculto. Vuelve al llamador
antes de que el elemento offcanvas se haya mostrado u ocultado realmente (es decir, antes
de que ocurra el evento shown.bs.offcanvas o hidden.bs.offcanvas). |
Eventos
La clase offcanvas de Bootstrap expone algunos eventos para conectarse a la funcionalidad de offcanvas.
| Tipo de evento | Descripción |
|---|---|
hide.bs.offcanvas |
Este evento se dispara inmediatamente cuando se ha llamado al método
hide. |
hidden.bs.offcanvas |
Este evento se dispara cuando un elemento offcanvas se ha ocultado al usuario (esperará a que se completen las transiciones CSS). |
hidePrevented.bs.offcanvas |
Este evento se dispara cuando el offcanvas se muestra, su fondo es
static y se hace clic fuera del offcanvas. El evento también se dispara cuando se
presiona la tecla escape y la opción keyboard está establecida en false.
|
show.bs.offcanvas |
Este evento se dispara inmediatamente cuando se llama al método de instancia
show. |
shown.bs.offcanvas |
Este evento se dispara cuando un elemento offcanvas se ha hecho visible para el usuario (esperará a que se completen las transiciones CSS). |
const myOffcanvas = document.getElementById('myOffcanvas')
myOffcanvas.addEventListener('hidden.bs.offcanvas', event => {
// do something...
})