Saltar al contenido principal Saltar a la navegación de la documentación

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 que 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 title y content de 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 .disabled o disabled deben 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-nowrap en 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.

Por defecto, este componente usa el sanitizador de contenido integrado, que elimina cualquier elemento HTML que no esté explícitamente permitido. Consulta la sección del sanitizador en nuestra documentación de JavaScript para más detalles.

El efecto de animación de este componente depende de la media query 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))

Demostración 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.

Puedes usar 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.

html
<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.

html
<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>

container 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.0

Puedes 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(--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;
}
html
<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 trigger focus para cerrar los popovers en el siguiente clic del usuario en un elemento distinto al elemento de alternancia.

Cerrar al siguiente clic requiere HTML específico para un comportamiento correcto entre navegadores y plataformas. Solo puedes usar elementos <a>, no <button>s, y debes incluir un tabindex.

html
<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.

html
<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.0

Como 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:                        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

Habilitar popovers vía JavaScript:

const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)

Mantén los popovers accesibles para usuarios de teclado y tecnologías de asistencia añadiéndolos solo a elementos HTML que tradicionalmente son enfocables por teclado e interactivos (como enlaces o controles de formulario). Aunque otros elementos HTML pueden hacerse enfocables añadiendo tabindex="0", esto puede crear paradas de tabulación molestas y confusas en elementos no interactivos para usuarios de teclado, y la mayoría de las tecnologías de asistencia actualmente no anuncian los popovers en esta situación. Además, no confíes únicamente en hover como trigger para tus popovers, ya que esto hará que sea imposible activarlos para usuarios de teclado.

Evita añadir una cantidad excesiva de contenido en los popovers con la opción html. Una vez que se muestran los popovers, su contenido está vinculado al elemento trigger con el atributo aria-describedby, haciendo que todo el contenido del popover sea anunciado a los usuarios de tecnologías de asistencia como un flujo largo e ininterrumpido.

Los popovers no gestionan el orden de foco del teclado, y su ubicación puede ser aleatoria en el DOM, así que ten cuidado al añadir elementos interactivos (como formularios o enlaces), ya que puede llevar a un orden de foco ilógico o hacer que el contenido del popover sea completamente inalcanzable para usuarios de teclado. En los casos en que debas usar estos elementos, 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}'.

El objeto de configuración final es el resultado de combinar data-bs-config, data-bs-, y el objeto js, donde el último par clave-valor dado sobrescribe a los demás.

Ten en cuenta que por razones de seguridad las opciones sanitize, sanitizeFn, y allowList no se pueden proporcionar usando atributos data.

Nombre Tipo Predeterminado Descripción
allowList object Valor por defecto An object containing allowed tags and attributes. Those not explicitly allowed will be removed by el sanitizador de contenido.
Ten cuidado al añadir a esta lista. Consulta la Hoja de referencia de prevención de Cross Site Scripting de OWASP para más información.
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 '' 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 '' 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. Prefiere texto cuando trabajes con entrada generada por el usuario para prevenir ataques XSS.
offset number, string, function [0, 8] 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 '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 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 Enable sanitización de contenido. If true, the template, content and title options will be sanitized.
Ten cuidado al deshabilitar la sanitización de contenido. Consulta la Hoja de referencia de prevención de Cross Site Scripting de OWASP para 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 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="tooltip"><div class="popover-arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>' HTML base a usar al crear el popover. El title del popover se inyectará en el .popover-header. El content del popover se inyectará en el .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 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 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. Vuelven al llamador tan pronto como la transición comienza, pero antes de que termine. Además, una llamada a un método en un componente en transición será ignorada. Obté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 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
popover.setContent({
  '.popover-header': 'another title',
  '.popover-body': 'another content'
})

El método 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 | null

Eventos

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...
})
Traducción mantenida por Esdocu. Visita esdocu.com para ver más documentaciones traducidas.