Popovers
Documentación y ejemplos para añadir popovers de Bootstrap, como los que se encuentran en iOS, a cualquier elemento de tu sitio.
Descripción general
Cosas a saber cuando se usa el plugin popover:
- Los popovers dependen de la librería de terceros Popper para el posicionamiento. Debes incluir popper.min.js antes
de
bootstrap.js, o usarbootstrap.bundle.min.jsque contiene Popper. - Los popovers requieren el plugin popover como dependencia.
- Los popovers son opt-in por razones de rendimiento, por lo que debes inicializarlos tú mismo.
- Los valores de
titleycontentde longitud cero nunca mostrarán un popover. - Especifica
container: 'body'para evitar problemas de renderizado en componentes más complejos (como nuestros grupos de entrada, grupos de botones, etc). - Activar popovers en elementos ocultos no funcionará.
- Los popovers para elementos
.disabledodisableddeben activarse desde un elemento contenedor. - Cuando se disparan desde anclajes que se ajustan a múltiples líneas, los popovers se
centrarán entre el ancho total de los anclajes. Usa
.text-nowrapen tus<a>s para evitar este comportamiento. - Los popovers deben ocultarse antes de que sus elementos correspondientes hayan sido eliminados del DOM.
- Los popovers pueden activarse gracias a un elemento dentro de un shadow DOM.
prefers-reduced-motion. Consulta la sección de movimiento reducido de nuestra
documentación de accesibilidad.Sigue leyendo para ver cómo funcionan los popovers con algunos ejemplos.
Ejemplos
Habilitar popovers
Como se mencionó anteriormente, debes inicializar los popovers antes de que puedan usarse.
Una forma de inicializar todos los popovers en una página sería seleccionarlos por su atributo
data-bs-toggle, así:
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
Demo en vivo
Usamos JavaScript similar al fragmento anterior para renderizar el siguiente popover en
vivo. Los títulos se establecen mediante data-bs-title y el contenido del cuerpo se establece
mediante data-bs-content.
title o
data-bs-title en tu HTML. Cuando se usa title, Popper lo reemplazará automáticamente
con data-bs-title cuando el elemento se renderice.<button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" data-bs-title="Popover title" data-bs-content="And here's some amazing content. It's very engaging. Right?">Click to toggle popover</button>
Cuatro direcciones
Hay cuatro opciones disponibles: arriba, derecha, abajo e izquierda. Las direcciones se
invierten al usar Bootstrap en RTL. Establece data-bs-placement para cambiar la dirección.
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Top popover">
Popover on top
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Right popover">
Popover on right
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Bottom popover">
Popover on bottom
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Left popover">
Popover on left
</button>
contenedor personalizado
Cuando tienes algunos estilos en un elemento padre que interfieren con un popover, querrás
especificar un contenedor personalizado para que el HTML del popover aparezca dentro de ese
elemento en su lugar. Esto es común en tablas responsive, grupos de entrada y similares.
const popover = new bootstrap.Popover('.example-popover', {
container: 'body'
})
Otra situación en la que querrás establecer un contenedor personalizado
explícito son los popovers dentro de un diálogo modal, para asegurar
que el popover mismo se adjunte al modal. Esto es particularmente importante para los popovers que contienen
elementos interactivos: los diálogos modales atraparán el foco, por lo que a menos que el popover sea un
elemento hijo del modal, los usuarios no podrán enfocar ni activar estos elementos interactivos.
const popover = new bootstrap.Popover('.example-popover', {
container: '.modal-body'
})
Popovers personalizados
Añadido en v5.2.0Puedes personalizar la apariencia de los popovers usando variables
CSS. Establecemos una clase personalizada con data-bs-custom-class="custom-popover" para
delimitar nuestra apariencia personalizada y la usamos para sobrescribir algunas de las variables CSS locales.
.custom-popover {
--bs-popover-max-width: 200px;
--bs-popover-border-color: var(--bs-primary);
--bs-popover-header-bg: var(--bs-primary);
--bs-popover-header-color: var(--bs-white);
--bs-popover-body-padding-x: 1rem;
--bs-popover-body-padding-y: .5rem;
}
<button type="button" class="btn btn-secondary"
data-bs-toggle="popover" data-bs-placement="right"
data-bs-custom-class="custom-popover"
data-bs-title="Custom popover"
data-bs-content="This popover is themed via CSS variables.">
Custom popover
</button>
Cerrar al siguiente clic
Usa el disparador focus para cerrar los popovers en el siguiente clic del
usuario en un elemento diferente al elemento conmutador.
Marcado específico requerido para cerrar-al-siguiente-clic
Para un comportamiento adecuado entre navegadores y plataformas, debes usar la etiqueta
<a>, no la etiqueta <button>, y también debes incluir un
atributo tabindex.
<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-bs-toggle="popover" data-bs-trigger="focus" data-bs-title="Dismissible popover" data-bs-content="And here's some amazing content. It's very engaging. Right?">Dismissible popover</a>
const popover = new bootstrap.Popover('.popover-dismiss', {
trigger: 'focus'
})
Elementos deshabilitados
Los elementos con el atributo disabled no son interactivos, lo que significa
que los usuarios no pueden pasar el cursor o hacer clic en ellos para activar un popover (o tooltip). Como
solución alternativa, querrás activar el popover desde un <div> o <span>
contenedor, idealmente enfocable por teclado usando tabindex="0".
Para los disparadores de popover deshabilitados, también puedes preferir
data-bs-trigger="hover focus" para que el popover aparezca como retroalimentación visual
inmediata para tus usuarios ya que pueden no esperar hacer clic en un elemento deshabilitado.
<span class="d-inline-block" tabindex="0" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Disabled popover">
<button class="btn btn-primary" type="button" disabled>Disabled button</button>
</span>
CSS
Variables
Añadido en v5.2.0Como parte del enfoque evolutivo de variables CSS de Bootstrap, los popovers ahora usan
variables CSS locales en .popover 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}popover-zindex: #{$zindex-popover};
--#{$prefix}popover-max-width: #{$popover-max-width};
@include rfs($popover-font-size, --#{$prefix}popover-font-size);
--#{$prefix}popover-bg: #{$popover-bg};
--#{$prefix}popover-border-width: #{$popover-border-width};
--#{$prefix}popover-border-color: #{$popover-border-color};
--#{$prefix}popover-border-radius: #{$popover-border-radius};
--#{$prefix}popover-inner-border-radius: #{$popover-inner-border-radius};
--#{$prefix}popover-box-shadow: #{$popover-box-shadow};
--#{$prefix}popover-header-padding-x: #{$popover-header-padding-x};
--#{$prefix}popover-header-padding-y: #{$popover-header-padding-y};
@include rfs($popover-header-font-size, --#{$prefix}popover-header-font-size);
--#{$prefix}popover-header-color: #{$popover-header-color};
--#{$prefix}popover-header-bg: #{$popover-header-bg};
--#{$prefix}popover-body-padding-x: #{$popover-body-padding-x};
--#{$prefix}popover-body-padding-y: #{$popover-body-padding-y};
--#{$prefix}popover-body-color: #{$popover-body-color};
--#{$prefix}popover-arrow-width: #{$popover-arrow-width};
--#{$prefix}popover-arrow-height: #{$popover-arrow-height};
--#{$prefix}popover-arrow-border: var(--#{$prefix}popover-border-color);
Variables Sass
$popover-font-size: $font-size-sm;
$popover-bg: $white;
$popover-max-width: 276px;
$popover-border-width: $border-width;
$popover-border-color: var(--#{$prefix}border-color-translucent);
$popover-border-radius: $border-radius-lg;
$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width);
$popover-box-shadow: $box-shadow;
$popover-header-font-size: $font-size-base;
$popover-header-bg: shade-color($popover-bg, 6%);
$popover-header-color: $headings-color;
$popover-header-padding-y: .5rem;
$popover-header-padding-x: $spacer;
$popover-body-color: $body-color;
$popover-body-padding-y: $spacer;
$popover-body-padding-x: $spacer;
$popover-arrow-width: 1rem;
$popover-arrow-height: .5rem;
Uso
Habilitar popovers vía JavaScript:
const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)
Hacer que los popovers funcionen para usuarios de teclado y tecnología de asistencia
Para permitir que los usuarios de teclado activen tus popovers, solo debes añadirlos a
elementos HTML que sean tradicionalmente enfocables por teclado e interactivos (como enlaces o controles de
formulario). Aunque elementos HTML arbitrarios (como <span>s) pueden hacerse enfocables
añadiendo el atributo tabindex="0", esto añadirá paradas de tabulación potencialmente molestas
y confusas en elementos no interactivos para los usuarios de teclado, y la mayoría de las tecnologías de
asistencia actualmente no anuncian el contenido del popover en esta situación. Además, no confíes únicamente
en hover como disparador de tus popovers, ya que esto hará imposible activarlos para los
usuarios de teclado.
Aunque puedes insertar HTML estructurado y rico en los popovers con la opción
html, recomendamos encarecidamente que evites añadir una cantidad excesiva de contenido. La
forma en que los popovers funcionan actualmente es que, una vez mostrados, su contenido está vinculado al
elemento disparador con el atributo aria-describedby. Como resultado, la totalidad del
contenido del popover será anunciada a los usuarios de tecnologías de asistencia como un flujo largo e
ininterrumpido.
Además, aunque también es posible incluir controles interactivos (como elementos de
formulario o enlaces) en tu popover (añadiendo estos elementos al allowList de atributos y
etiquetas permitidos), ten en cuenta que actualmente el popover no gestiona el orden de foco del teclado.
Cuando un usuario de teclado abre un popover, el foco permanece en el elemento disparador, y como el popover
usualmente no sigue inmediatamente al disparador en la estructura del documento, no hay garantía de que
avanzar/presionar TAB mueva a un usuario de teclado al popover mismo. En resumen, simplemente
añadir controles interactivos a un popover probablemente hará que estos controles sean
inalcanzables/inutilizables para los usuarios de teclado y de tecnologías de asistencia, o como mínimo
creará un orden de foco general ilógico. En estos casos, considera usar un diálogo modal en su lugar.
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}'.
sanitize, sanitizeFn, y allowList no se pueden proporcionar
usando atributos data.| Nombre | Tipo | Predeterminado | Descripción |
|---|---|---|---|
allowList |
object | Valor por defecto | Objeto que contiene atributos y etiquetas permitidos. |
animation |
boolean | true |
Aplica una transición de fundido CSS al popover. |
boundary |
string, element | 'clippingParents' |
Límite de restricción de overflow del popover (se aplica solo al modificador
preventOverflow de Popper). Por defecto es 'clippingParents' y puede aceptar una
referencia HTMLElement (solo mediante JavaScript). Para más información consulta la documentación de detectOverflow
de Popper. |
container |
string, element, false | false |
Añade el popover a un elemento específico. Ejemplo:
container: 'body'. Esta opción es particularmente útil ya que te permite posicionar el
popover en el flujo del documento cerca del elemento disparador - lo que evitará que el popover flote
lejos del elemento disparador durante un redimensionamiento de ventana. |
content |
string, element, function | '' |
Valor de contenido predeterminado si el atributo data-bs-content no
está presente. Si se proporciona una función, se llamará con su referencia this
establecida en el elemento al que está adjunto el popover. |
customClass |
string, function | '' |
Añade clases al popover cuando se muestra. Ten en cuenta que estas clases se
añadirán además de cualquier clase especificada en la plantilla. Para añadir múltiples clases,
sepáralas con espacios: 'class-1 class-2'. También puedes pasar una función que devuelva
una sola cadena que contenga nombres de clase adicionales. |
delay |
number, object | 0 |
Retrasa la muestra y ocultamiento del popover (ms); no se aplica al tipo de
disparo manual. Si se proporciona un número, el retraso se aplica tanto a ocultar/mostrar. La
estructura del objeto es: delay: { "show": 500, "hide": 100 }. |
fallbackPlacements |
string, array | ['top', 'right', 'bottom', 'left'] |
Define ubicaciones de respaldo proporcionando una lista de ubicaciones en un array (en orden de preferencia). Para más información consulta la documentación de behavior de Popper. |
html |
boolean | false |
Permite HTML en el popover. Si es true, las etiquetas HTML en el
title del popover se renderizarán en el popover. Si es false, se usará la propiedad
innerText para insertar contenido en el DOM. Usa texto si te preocupan los ataques XSS.
|
offset |
number, string, function | [0, 0] |
Desplazamiento del popover relativo a su objetivo. Puedes pasar una cadena en los
atributos data con valores separados por comas como: data-bs-offset="10,20". Cuando se
usa una función para determinar el desplazamiento, se llama con un objeto que contiene la posición del
popper, la referencia y los rects del popper como primer argumento. El nodo DOM del elemento
disparador se pasa como segundo argumento. La función debe devolver un array con dos números: skidding, distance. Para más información
consulta la documentación de offset
de Popper. |
placement |
string, function | 'top' |
Cómo posicionar el popover: auto, top, bottom, left, right. Cuando se especifica
auto, reorientará dinámicamente el popover. Cuando se usa una función para determinar la
ubicación, se llama con el nodo DOM del popover como primer argumento y el nodo DOM del elemento
disparador como segundo. El contexto this se establece en la instancia del popover. |
popperConfig |
null, object, function | null |
Para cambiar la configuración predeterminada de Popper de Bootstrap, consulta la configuración de Popper. Cuando se usa una función para crear la configuración de Popper, se llama con un objeto que contiene la configuración predeterminada de Popper de Bootstrap. Te ayuda a usar y fusionar la configuración predeterminada con tu propia configuración. La función debe devolver un objeto de configuración para Popper. |
sanitize |
boolean | true |
Habilita o deshabilita la sanitización. Si se activa, las opciones
'template', 'content' y 'title' se sanitizarán. |
sanitizeFn |
null, function | null |
Aquí puedes proporcionar tu propia función de sanitización. Esto puede ser útil si prefieres usar una librería dedicada para realizar la sanitización. |
selector |
string, false | false |
Si se proporciona un selector, los objetos popover se delegarán a los objetivos
especificados. En la práctica, esto se usa para también aplicar popovers a elementos DOM añadidos
dinámicamente (soporte jQuery.on). Consulta este issue y un ejemplo informativo. Nota: el
atributo title no debe usarse como selector. |
template |
string |
'<div class="popover" role="popover"><div class="popover-arrow"></div><div class="popover-inner"></div></div>'
|
HTML base para usar al crear el popover. El title del popover se
inyectará en .popover-inner. .popover-arrow se convertirá en la flecha del
popover. El elemento envoltorio más externo debe tener la clase .popover y
role="popover". |
title |
string, element, function | '' |
Valor de título predeterminado si el atributo title no está presente.
Si se proporciona una función, se llamará con su referencia this establecida en el
elemento al que está adjunto el popover. |
trigger |
string | 'hover focus' |
Cómo se dispara el popover: click, hover, focus, manual. Puedes pasar múltiples
disparadores; sepáralos con un espacio. 'manual' indica que el popover se disparará
programáticamente mediante los métodos .popover('show'), .popover('hide') y
.popover('toggle'); este valor no se puede combinar con ningún otro disparador.
'hover' por sí solo resultará en popovers que no pueden ser disparados mediante el
teclado, y solo debe usarse si existen métodos alternativos para transmitir la misma información a
usuarios de teclado. |
Atributos data para popovers individuales
Las opciones para popovers individuales también se pueden especificar mediante el uso de atributos data, como se explicó anteriormente.
Usando una función con popperConfig
const popover = new bootstrap.Popover(element, {
popperConfig(defaultBsPopperConfig) {
// const newPopperConfig = {...}
// use defaultBsPopperConfig if needed...
// return newPopperConfig
}
})
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.
| Método | Descripción |
|---|---|
disable |
Elimina la capacidad de mostrar el popover de un elemento. El popover solo podrá mostrarse si se vuelve a habilitar. |
dispose |
Oculta y destruye el popover de un elemento (Elimina los datos almacenados en el
elemento DOM). Los popovers que usan delegación (que se crean usando la opción
selector) no se pueden destruir individualmente en los elementos disparadores
descendientes. |
enable |
Da a un elemento la capacidad de mostrar su popover. Los popovers están habilitados por defecto. |
getInstance |
Método estático que te permite obtener la instancia de popover asociada a un elemento DOM. |
getOrCreateInstance |
Método estático que te permite obtener la instancia de popover asociada a un elemento DOM, o crear una nueva en caso de que no haya sido inicializada. |
hide |
Oculta el popover de un elemento. Vuelve al llamador antes de que el
popover se haya ocultado realmente (es decir, antes de que ocurra el evento
hidden.bs.popover). Esto se considera una activación "manual" del popover. |
setContent |
Proporciona una forma de cambiar el contenido del popover después de su inicialización. |
show |
Muestra el popover de un elemento. Vuelve al llamador antes de que el
popover se haya mostrado realmente (es decir, antes de que ocurra el evento
shown.bs.popover). Esto se considera una activación "manual" del popover. Los popovers
cuyo título y contenido son ambos de longitud cero nunca se muestran. |
toggle |
Conmuta el popover de un elemento. Vuelve al llamador antes de que el
popover se haya mostrado u ocultado realmente (es decir, antes de que ocurra el evento
shown.bs.popover o hidden.bs.popover). Esto se considera una activación
"manual" del popover. |
toggleEnabled |
Conmuta la capacidad de mostrar u ocultar el popover de un elemento. |
update |
Actualiza la posición del popover de un elemento. |
// getOrCreateInstance example
const popover = bootstrap.Popover.getOrCreateInstance('#example') // Returns a Bootstrap popover instance
// setContent example
myPopover.setContent({
'.popover-header': 'another title',
'.popover-body': 'another content'
})
setContent acepta un argumento
object, donde cada clave de propiedad es un selector string válido dentro de la
plantilla del popover, y cada valor de propiedad relacionado puede ser string |
element | function | nullEventos
| Evento | Descripción |
|---|---|
hide.bs.popover |
Este evento se dispara inmediatamente cuando se ha llamado al método de instancia
hide. |
hidden.bs.popover |
Este evento se dispara cuando el popover ha terminado de ocultarse al usuario (esperará a que se completen las transiciones CSS). |
inserted.bs.popover |
Este evento se dispara después del evento show.bs.popover cuando la
plantilla del popover se ha añadido al DOM. |
show.bs.popover |
Este evento se dispara inmediatamente cuando se llama al método de instancia
show. |
shown.bs.popover |
Este evento se dispara cuando el popover se ha hecho visible al usuario (esperará a que se completen las transiciones CSS). |
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
// do something...
})