Popovers
Documentación y ejemplos para agregar popovers de Bootstrap, como los que se encuentran en iOS, a cualquier elemento de tu sitio.
Resumen
Cosas que debes saber al usar el plugin de popover:
- Los popovers dependen de la biblioteca de terceros Popper para el posicionamiento. Debes incluir popper.min.js antes de
bootstrap.js, o usar unbootstrap.bundle.min.jsque contenga Popper. - Los popovers requieren el plugin de popover como dependencia.
- Los popovers son opt-in por razones de rendimiento, por lo que debes inicializarlos tú mismo.
- Los valores de
titleycontentcon 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 en un elemento contenedor (wrapper). - Cuando se activan desde enlaces que se extienden en varias líneas, los popovers se centrarán en el ancho total de los enlaces. 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 se pueden activar gracias a un elemento dentro de un shadow DOM.
Por defecto, este componente utiliza el sanitizador de contenido incorporado, el cual elimina cualquier elemento HTML que no esté explícitamente permitido. Consulta la sección del sanitizador en nuestra documentación de JavaScript para obtener más detalles.
El efecto de animación de este componente depende de la consulta de medios prefers-reduced-motion. Consulta la sección de movimiento reducido en 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 poder usarlos. 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))
Demostración en vivo
Utilizamos un JavaScript similar al fragmento de arriba para renderizar el siguiente popover en vivo. Los títulos se establecen a través de data-bs-title y el contenido del cuerpo se establece a través de data-bs-content.
Siéntete libre de usar tanto title como data-bs-title en tu HTML. Cuando se utiliza 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="Título del popover" data-bs-content="Y aquí hay un contenido increíble. Es muy atractivo. ¿Verdad?">Haz clic para alternar el popover</button> Cuatro direcciones
Hay cuatro opciones disponibles: arriba (top), derecha (right), abajo (bottom) e izquierda (left). Las direcciones se reflejan cuando se usa 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="Popover superior">
Popover arriba
</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 a la derecha
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Popover inferior">
Popover abajo
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Popover izquierdo">
Popover a la izquierda
</button> container personalizado
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. Esto es común en tablas responsivas, grupos de entrada y similares.
const popover = new bootstrap.Popover('.example-popover', {
container: 'body'
})
Otra situación en la que querrás establecer un container personalizado explícito son los popovers dentro de un diálogo modal, para asegurarte de que el popover en sí se agregue al modal. Esto es particularmente importante para los popovers que contienen interactive elements – modal dialogs will trap focus, so unless the popover is a child element of the modal, users won’t be able to focus or activate these interactive elements.
const popover = new bootstrap.Popover('.example-popover', {
container: '.modal-body'
})
Popovers personalizados
Agregado 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 usarla para anular algunas de las variables CSS locales.
.custom-popover {
--bs-popover-max-width: 200px;
--bs-popover-border-color: var(--bd-violet-bg);
--bs-popover-header-bg: var(--bd-violet-bg);
--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.">
Popover personalizado
</button> Descartar en el siguiente clic
Utiliza el activador focus para descartar los popovers al siguiente clic del usuario en un elemento que no sea el elemento alternador.
El descarte al siguiente clic requiere un HTML específico para un comportamiento correcto en diferentes navegadores y plataformas. Solo puedes usar elementos <a>, no <button>s, y debes incluir un 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?">Popover descartable</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 sobre ellos ni hacer clic para activar un popover (o tooltip). Como solución alternativa, querrás activar el popover desde un contenedor <div> o <span>, idealmente enfocado con el teclado usando tabindex="0".
Para los activadores 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 es posible que no esperen 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>Botón deshabilitado</button>
</span> CSS
Variables
Agregado en v5.2.0Como parte del enfoque evolutivo de las variables CSS de Bootstrap, los popovers ahora usan variables CSS locales en .popover para una personalización mejorada en tiempo real. Los valores de las variables CSS se establecen a través de Sass, por lo que la personalización de Sass también es 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 de Sass
$popover-font-size: $font-size-sm;
$popover-bg: var(--#{$prefix}body-bg);
$popover-max-width: 276px;
$popover-border-width: var(--#{$prefix}border-width);
$popover-border-color: var(--#{$prefix}border-color-translucent);
$popover-border-radius: var(--#{$prefix}border-radius-lg);
$popover-inner-border-radius: calc(#{$popover-border-radius} - #{$popover-border-width}); // stylelint-disable-line function-disallowed-list
$popover-box-shadow: var(--#{$prefix}box-shadow);
$popover-header-font-size: $font-size-base;
$popover-header-bg: var(--#{$prefix}secondary-bg);
$popover-header-color: $headings-color;
$popover-header-padding-y: .5rem;
$popover-header-padding-x: $spacer;
$popover-body-color: var(--#{$prefix}body-color);
$popover-body-padding-y: $spacer;
$popover-body-padding-x: $spacer;
$popover-arrow-width: 1rem;
$popover-arrow-height: .5rem;
Uso
Habilita los popovers a través de JavaScript:
const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)
Mantén los popovers accesibles para los usuarios de teclado y de tecnologías de asistencia agregándolos únicamente a elementos HTML que tradicionalmente son enfocables con el teclado e interactivos (como enlaces o controles de formulario). Si bien otros elementos HTML se pueden hacer enfocables agregando tabindex="0", esto puede crear paradas de tabulación 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 popovers en esta situación. Además, no confíes únicamente en hover como activador de tus popovers, ya que esto hará que sea imposible activarlos para los usuarios de teclado.
Evita agregar una cantidad excesiva de contenido en los popovers con la opción html. Una vez que se muestran los popovers, su contenido se vincula al elemento activador con el atributo aria-describedby, lo que hace que todo el contenido del popover se anuncie a los usuarios de tecnologías de asistencia como un flujo largo e ininterrumpido.
Los popovers no administran el orden del foco del teclado y su ubicación puede ser aleatoria en el DOM, así que ten cuidado al agregar elementos interactivos (como formularios o enlaces), ya que puede provocar un orden de foco ilógico o hacer que el contenido del popover sea completamente inalcanzable para los usuarios de teclado. En los casos en los que debas usar estos elementos, considera usar un diálogo modal en su lugar.
Opciones
Como las opciones se pueden pasar a través de atributos de datos 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 mayúsculas y minúsculas del nombre de la opción de “camelCase” a “kebab-case” al pasar las opciones a través de atributos de datos. 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 admiten un atributo de datos 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 de datos separados anularán los valores proporcionados en data-bs-config. Además, los atributos de datos existentes pueden albergar valores JSON como data-bs-delay='{"show":0,"hide":150}'.
El objeto de configuración final es el resultado fusionado de data-bs-config, data-bs- y el js object (objeto js) donde el último par clave-valor proporcionado anula a los demás.
Ten en cuenta que por razones de seguridad las opciones sanitize, sanitizeFn, y allowList no se pueden suministrar mediante atributos de datos.
| Nombre | Tipo | Predeterminado | Descripción |
|---|---|---|---|
allowList | object | Valor predeterminado | Un objeto que contiene etiquetas y atributos permitidos. Los que no estén explícitamente permitidos serán eliminados por el sanitizador de contenido. Ten precaución al agregar elementos a esta lista. Consulta la Hoja de trucos para la prevención de Cross Site Scripting de OWASP para obtener más información. |
animation | boolean | true | Aplica una transición de desvanecimiento CSS al popover. |
boundary | string, element | 'clippingParents' | Límite de restricción de desbordamiento (overflow constraint boundary) del popover (se aplica solo al modificador preventOverflow de Popper). De forma predeterminada, es 'clippingParents' y puede aceptar una referencia de HTMLElement (solo a través de JavaScript). Para obtener más información, consulta la documentación de detectOverflow de Popper. |
container | string, element, false | false | Agrega el popover a un elemento específico. Ejemplo: container: 'body'. Esta opción es particularmente útil ya que te permite colocar el popover en el flujo del documento cerca del elemento activador, lo que evitará que el popover se aleje del elemento activador durante un cambio de tamaño de la ventana. |
content | string, element, function | '' | El contenido de texto del popover. 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 | '' | Agrega clases al popover cuando se muestra. Ten en cuenta que estas clases se agregarán además de las clases especificadas en la plantilla. Para agregar varias clases, sepáralas con espacios: 'class-1 class-2'. También puedes pasar una función que debe devolver una sola cadena que contenga nombres de clases adicionales. |
delay | number, object | 0 | Retraso para mostrar y ocultar el popover (ms); no se aplica al tipo de activador manual. Si se suministra un número, el retraso se aplica tanto a ocultar como a mostrar. La estructura del objeto es: delay: { "show": 500, "hide": 100 }. |
fallbackPlacements | string, array | ['top', 'right', 'bottom', 'left'] | Define ubicaciones de respaldo (fallback placements) proporcionando una lista de ubicaciones en una matriz (en orden de preferencia). Para obtener más información, consulta la documentación de comportamiento de Popper. |
html | boolean | false | Permite HTML en el popover. Si es verdadero, las etiquetas HTML en el title del popover se renderizarán en el popover. Si es falso, se utilizará la propiedad innerText para insertar contenido en el DOM. Prefiere texto cuando manejes entradas generadas por el usuario para prevenir ataques XSS. |
offset | number, string, function | [0, 8] | Desplazamiento (offset) del popover relativo a su objetivo. Puedes pasar una cadena en los atributos de datos con valores separados por comas como: data-bs-offset="10,20". Cuando se utiliza una función para determinar el desplazamiento, se llama con un objeto que contiene la ubicación de popper, la referencia y los rectángulos de popper como su primer argumento. El nodo DOM del elemento activador se pasa como segundo argumento. La función debe devolver una matriz con dos números: desplazamiento lateral (skidding), distancia (distance). Para obtener más información, consulta la documentación de offset de Popper. |
placement | string, function | 'right' | 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 activador 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 la tuya propia. La función debe devolver un objeto de configuración para Popper. |
sanitize | boolean | true | Habilita la sanitización de contenido. Si es verdadero, las opciones template, content y title serán sanitizadas. Ten precaución al deshabilitar la sanitización de contenido. Consulta la Hoja de trucos para la prevención de Cross Site Scripting de OWASP para obtener más información. Las vulnerabilidades causadas únicamente por deshabilitar la sanitización de contenido no se consideran dentro del alcance del modelo de seguridad de Bootstrap. |
sanitizeFn | null, function | null | Proporciona una función alternativa de sanitización de contenido. Esto puede ser útil si prefieres utilizar una biblioteca 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 utiliza para aplicar también popovers a elementos DOM agregados dinámicamente (soporte para jQuery.on). Consulta este problema y un ejemplo informativo. Nota: el atributo title no debe usarse como selector. |
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 utilizar al crear el popover. El title del popover se inyectará en .popover-header. El content del popover se inyectará en .popover-body. .popover-arrow se convertirá en la flecha del popover. El elemento contenedor más externo debe tener la clase .popover y role="tooltip". |
title | string, element, function | '' | El título del popover. Si se proporciona una función, se llamará con su referencia this establecida en el elemento al que está adjunto el popover. |
trigger | string | 'click' | Cómo se activa el popover: click, hover, focus, manual. Puedes pasar múltiples activadores; sepáralas con un espacio. 'manual' indica que el popover se activará mediante programación a través de los métodos .popover('show'), .popover('hide') y .popover('toggle'); este valor no se puede combinar con ningún otro activador. 'hover' por sí solo dará como resultado popovers que no se pueden activar mediante el teclado, y solo debe usarse si existen métodos alternativos para transmitir la misma información para los usuarios de teclado. |
Atributos de datos para popovers individuales
Las opciones para popovers individuales también se pueden especificar mediante el uso de atributos de datos, como se explicó anteriormente.
Uso de función con popperConfig
const popover = new bootstrap.Popover(element, {
popperConfig(defaultBsPopperConfig) {
// const newPopperConfig = {...}
// use defaultBsPopperConfig if needed...
// return newPopperConfig
}
})
Métodos
Todos los métodos de la API son asíncronos e inician una transición. Devuelven el control al llamador tan pronto como se inicia la transición, pero antes de que termine. Además, se ignorará cualquier llamada a un método en un componente en transición. Más información en nuestra documentación de JavaScript.
| Método | Descripción |
|---|---|
disable | Elimina la capacidad de mostrar el popover de un elemento. El popover solo se podrá mostrar 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 activadores descendientes. |
enable | Le da al popover de un elemento la capacidad de mostrarse. Los popovers están habilitados de forma predeterminada. |
getInstance | Método estático que te permite obtener la instancia de popover asociada con un elemento DOM. |
getOrCreateInstance | Método estático que te permite obtener la instancia de popover asociada con un elemento DOM, o crear una nueva en caso de que no haya sido inicializada. |
hide | Oculta el popover de un elemento. Devuelve el control 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 | Ofrece una forma de cambiar el contenido del popover después de su inicialización. |
show | Revela el popover de un elemento. Devuelve el control 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 tienen longitud cero nunca se muestran. |
toggle | Alterna el popover de un elemento. Devuelve el control 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 | Alterna la capacidad de mostrar u ocultar el popover de un elemento. |
update | Actualiza la posición del popover de un elemento. |
// Ejemplo de getOrCreateInstance
const popover = bootstrap.Popover.getOrCreateInstance('#example') // Devuelve una instancia de popover de Bootstrap
// Ejemplo de setContent
popover.setContent({
'.popover-header': 'otro título',
'.popover-body': 'otro contenido'
})
El método setContent acepta un argumento object, donde cada propiedad clave es un selector string válido dentro de la plantilla del popover, y cada valor de propiedad relacionado puede ser string | element | function | null
Eventos
| Evento | Descripción |
|---|---|
hide.bs.popover | Este evento se dispara inmediatamente cuando se llama al método de instancia hide. |
hidden.bs.popover | Este evento se dispara cuando el popover ha terminado de ocultarse del 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 agregado 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 para el usuario (esperará a que se completen las transiciones CSS). |
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
// do something...
})