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 usar
bootstrap.bundle.min.js/bootstrap.bundle.jsque contiene Popper para que los popovers funcionen. - Los popovers requieren el plugin de tooltip 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 activan desde anclas que se envuelven en múltiples líneas, los popovers se
centrarán entre el ancho total de las anclas. Usa
.text-nowrapen tus<a>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.
Ejemplo: Habilitar popovers en todas partes
Una forma de inicializar todos los popovers en una página sería seleccionarlos por su
atributo data-bs-toggle:
var popoverTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle="popover"]'))
var popoverList = popoverTriggerList.map(function (popoverTriggerEl) {
return new bootstrap.Popover(popoverTriggerEl)
})
Ejemplo: Usando la opción container
Cuando tienes algunos estilos en un elemento padre que interfieren con un popover, querrás
especificar un container personalizado para que el HTML del popover aparezca dentro de ese
elemento en su lugar.
var popover = new bootstrap.Popover(document.querySelector('.example-popover'), {
container: 'body'
})
Ejemplo
<button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" 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: alineado arriba, derecha, abajo e izquierda. Las direcciones se reflejan cuando se usa Bootstrap en RTL.
<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>
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" title="Dismissible popover" data-bs-content="And here's some amazing content. It's very engaging. Right?">Dismissible popover</a>
var popover = new bootstrap.Popover(document.querySelector('.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>
Sass
Variables
$popover-font-size: $font-size-sm;
$popover-bg: $white;
$popover-max-width: 276px;
$popover-border-width: $border-width;
$popover-border-color: rgba($black, .2);
$popover-border-radius: $border-radius-lg;
$popover-inner-border-radius: subtract($popover-border-radius, $popover-border-width);
$popover-box-shadow: $box-shadow;
$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;
$popover-arrow-color: $popover-bg;
$popover-arrow-outer-color: fade-in($popover-border-color, .05);
Uso
Habilitar popovers vía JavaScript:
var exampleEl = document.getElementById('example')
var popover = new bootstrap.Popover(exampleEl, options)
Hacer que los popovers funcionen para usuarios de teclado y tecnologías 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
Las opciones se pueden pasar vía atributos data o JavaScript. Para los atributos data,
añade el nombre de la opción a data-bs-, como en data-bs-animation="". Asegúrate de
cambiar el tipo de capitalización del nombre de la opción de camelCase a kebab-case cuando pases las opciones
vía atributos data. Por ejemplo, en lugar de usar data-bs-customClass="beautifier", usa
data-bs-custom-class="beautifier".
sanitize, sanitizeFn, y allowList no se pueden proporcionar
usando atributos data.| Nombre | Tipo | Predeterminado | Descripción |
|---|---|---|---|
animation |
boolean | true |
Aplicar una transición de fundido CSS al popover |
container |
string | element | false | false |
Añade el popover a un elemento específico. Ejemplo: |
content |
string | element | function | '' |
Valor de contenido por defecto si el atributo Si se proporciona una función, se llamará con su referencia |
delay |
number | object | 0 |
Retrasar la muestra y ocultación del popover (ms) - no se aplica al tipo de disparador manual Si se proporciona un número, el retraso se aplica tanto a ocultar/mostrar La estructura del objeto es: |
html |
boolean | false |
Inserta HTML 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.
|
placement |
string | function | 'right' |
Cómo posicionar el popover - auto | top | bottom | left | right. 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
|
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 permitir que el contenido HTML dinámico tenga popovers añadidos. Consulta esto y un ejemplo informativo. |
template |
string |
'<div class="popover" role="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'
|
HTML base a usar cuando se crea el popover. El El El El elemento contenedor más externo debe tener la clase |
title |
string | element | function | '' |
Valor de título por defecto si el atributo Si se proporciona una función, se llamará con su referencia |
trigger |
string | 'click' |
Cómo se activa el popover - click | hover | focus | manual. Puedes pasar múltiples
disparadores; sepáralos con un espacio. manual no se puede combinar con ningún otro
disparador. |
fallbackPlacements |
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 comportamiento de Popper |
boundary |
string | element | 'clippingParents' |
Límite de overflow del popover (se aplica solo al modificador preventOverflow de
Popper). Por defecto es 'clippingParents' y puede aceptar una referencia HTMLElement (solo
vía JavaScript). Para más información consulta la documentación de
detectOverflow de Popper. |
customClass |
string | function | '' |
Añade clases al popover cuando se muestra. Ten en cuenta que estas clases se
añadirán además de las clases especificadas en la plantilla. Para añadir múltiples clases, sepáralas
con espacios: También puedes pasar una función que devuelva una sola cadena que contenga nombres de clases adicionales. |
sanitize |
boolean | true |
Habilita o deshabilita la sanitización. Si se activa, las opciones
'template', 'content' y 'title' serán sanitizadas. Consulta la sección del sanitizador en nuestra
documentación de JavaScript. |
allowList |
object | Valor por defecto | Objeto que contiene las etiquetas y atributos permitidos |
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. |
offset |
array | string | function | [0, 8] |
Desplazamiento del popover relativo a su objetivo. Puedes pasar una cadena en
atributos data con valores separados por comas como: Cuando se usa una función para determinar el desplazamiento, se llama con un objeto
que contiene la colocación de popper, la referencia y los rects de 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:
Para más información consulta la documentación de offset de Popper. |
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. |
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.
Usar una función con popperConfig
var popover = new bootstrap.Popover(element, {
popperConfig: function (defaultBsPopperConfig) {
// var 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.
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.
myPopover.show()
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.
myPopover.hide()
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.
myPopover.toggle()
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.
myPopover.dispose()
enable
Da a un elemento la capacidad de mostrar su popover. Los popovers están habilitados por defecto.
myPopover.enable()
disable
Elimina la capacidad de mostrar el popover de un elemento. El popover solo podrá mostrarse si se vuelve a habilitar.
myPopover.disable()
toggleEnabled
Conmuta la capacidad de mostrar u ocultar el popover de un elemento.
myPopover.toggleEnabled()
update
Actualiza la posición del popover de un elemento.
myPopover.update()
getInstance
Método estático que te permite obtener la instancia de popover asociada a un elemento del DOM
var exampleTriggerEl = document.getElementById('example')
var popover = bootstrap.Popover.getInstance(exampleTriggerEl) // Returns a Bootstrap popover instance
getOrCreateInstance
Método estático que te permite obtener la instancia de popover asociada a un elemento del DOM, o crear una nueva en caso de que no estuviera inicializada
var exampleTriggerEl = document.getElementById('example')
var popover = bootstrap.Popover.getOrCreateInstance(exampleTriggerEl) // Returns a Bootstrap popover instance
Eventos
| Tipo de evento | Descripción |
|---|---|
| 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). |
| 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. |
var myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', function () {
// do something...
})