Saltar al contenido principal Saltar a la navegación de documentos
Check
in English

Popovers

Documentación y ejemplos para agregar popovers de Bootstrap, como los que se encuentran en iOS, a cualquier elemento de su sitio.

Visión general

Cosas que debe saber al usar el complemento popover:

  • Los popovers se basan en la biblioteca de terceros Popper para el posicionamiento. Debe incluir popper.min.js antes bootstrap.jso usar uno bootstrap.bundle.min.jsque contenga Popper.
  • Los popovers requieren el complemento popover como dependencia.
  • Los popovers son opcionales por motivos de rendimiento, por lo que debe inicializarlos usted mismo .
  • La longitud cero titley contentlos valores nunca mostrarán un popover.
  • Especifique container: 'body'para evitar problemas de representación 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 .disabledor disableddeben activarse en un elemento contenedor.
  • Cuando se activan desde anclas que se envuelven en varias líneas, los popovers se centrarán entre el ancho total de las anclas. Úselo .text-nowrapen su <a>s para evitar este comportamiento.
  • Los popovers deben ocultarse antes de que sus elementos correspondientes se eliminen del DOM.
  • Los popovers se pueden activar gracias a un elemento dentro de un shadow DOM.
De forma predeterminada, este componente utiliza el desinfectante de contenido incorporado, que elimina los elementos HTML que no están permitidos explícitamente. Consulte la sección de desinfectantes en nuestra documentación de JavaScript para obtener más detalles.
El efecto de animación de este componente depende de la prefers-reduced-motionconsulta de medios. Consulte 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 ventanas emergentes

Como se mencionó anteriormente, debe inicializar los popovers antes de poder usarlos. Una forma de inicializar todos los popovers en una página sería seleccionarlos por su data-bs-toggleatributo, 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 representar el siguiente popover en vivo. Los títulos se establecen mediante data-bs-titley el contenido del cuerpo se establece mediante data-bs-content.

Siéntase libre de usar titleo data-bs-titleen su HTML. Cuando titlese usa, Popper lo reemplazará automáticamente data-bs-titlecuando se represente el elemento.
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: superior, derecha, inferior e izquierda. Las direcciones se reflejan cuando se usa Bootstrap en RTL. Ajuste data-bs-placementpara 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>

Disfrazcontainer

Cuando tiene algunos estilos en un elemento principal que interfieren con una ventana emergente, querrá especificar un personalizado containerpara que el HTML de la ventana emergente aparezca dentro de ese elemento. Esto es común en tablas receptivas, grupos de entrada y similares.

const popover = new bootstrap.Popover('.example-popover', {
  container: 'body'
})

Otra situación en la que querrá establecer un personalizado explícito containerson las ventanas emergentes dentro de un cuadro de diálogo modal , para asegurarse de que la ventana emergente en sí se agregue al modal. Esto es especialmente importante para las ventanas emergentes que contienen elementos interactivos: los cuadros de diálogo modales atraparán el foco, por lo que, a menos que la ventana emergente sea un elemento secundario de la ventana modal, los usuarios no podrán enfocar ni activar estos elementos interactivos.

const popover = new bootstrap.Popover('.example-popover', {
  container: '.modal-body'
})

Ventanas emergentes personalizadas

Añadido en v5.2.0

Puede personalizar la apariencia de las ventanas emergentes utilizando variables CSS . Establecemos una clase personalizada con data-bs-custom-class="custom-popover"el alcance de nuestra apariencia personalizada y la usamos para anular 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;
}
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>

Descartar en el siguiente clic

Utilice el focusactivador para descartar popovers en el siguiente clic del usuario en un elemento diferente al elemento de alternancia.

Marcado específico requerido para descartar al siguiente clic

Para un comportamiento adecuado entre navegadores y plataformas, debe usar la <a>etiqueta, no la <button>etiqueta, y también debe incluir un tabindexatributo.

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 disabledatributo no son interactivos, lo que significa que los usuarios no pueden pasar el mouse sobre ellos ni hacer clic en ellos para activar una ventana emergente (o información sobre herramientas). Como solución alternativa, querrá activar la ventana emergente desde un envoltorio <div>o <span>, idealmente enfocable desde el teclado usando tabindex="0".

Para los activadores de ventanas emergentes deshabilitadas, también puede preferir data-bs-trigger="hover focus"que la ventana emergente aparezca como una respuesta visual inmediata a sus usuarios, ya que es posible que no esperen 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 de variables CSS en evolución de Bootstrap, los popovers ahora usan variables CSS locales .popoverpara mejorar la personalización en tiempo real. Los valores para las variables CSS se establecen a través de Sass, por lo que también se admite la personalización de Sass.

  --#{$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);
  

Sass variables

$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 ventanas emergentes a través de JavaScript:

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

Cómo hacer que los popovers funcionen para los usuarios de teclados y tecnología de asistencia

Para permitir que los usuarios del teclado activen sus ventanas emergentes, solo debe agregarlas a los elementos HTML que tradicionalmente se pueden enfocar con el teclado e interactivos (como enlaces o controles de formulario). Aunque los elementos HTML arbitrarios (como <span>s) se pueden enfocar agregando el tabindex="0"atributo, esto agregará tabulaciones potencialmente molestas y confusas en elementos no interactivos para usuarios de teclado, y la mayoría de las tecnologías de asistencia actualmente no anuncian el contenido de la ventana emergente en esta situación. . Además, no confíe únicamente en hoverel disparador de sus popovers, ya que esto hará que sea imposible que los usuarios del teclado los activen.

Si bien puede insertar HTML enriquecido y estructurado en popovers con la htmlopción, le recomendamos encarecidamente que evite agregar una cantidad excesiva de contenido. La forma en que los popovers funcionan actualmente es que, una vez que se muestran, su contenido está vinculado al elemento desencadenante con el aria-describedbyatributo. Como resultado, la totalidad del contenido de la ventana emergente se anunciará a los usuarios de tecnología de asistencia como una secuencia larga e ininterrumpida.

Además, aunque también es posible incluir controles interactivos (como elementos de formulario o enlaces) en su ventana emergente (agregando estos elementos a los allowListatributos y etiquetas permitidos), tenga en cuenta que actualmente la ventana emergente no administra el orden de enfoque del teclado. Cuando un usuario del teclado abre una ventana emergente, el enfoque permanece en el elemento activador y, como la ventana emergente generalmente no sigue inmediatamente al activador en la estructura del documento, no hay garantía de que avanzar/presionarTABmoverá a un usuario del teclado al propio popover. En resumen, es probable que simplemente agregar controles interactivos a una ventana emergente haga que estos controles sean inalcanzables o inutilizables para los usuarios de teclados y usuarios de tecnologías de asistencia, o al menos generar un orden de enfoque general ilógico. En estos casos, considere usar un diálogo modal en su lugar.

Opciones

Como las opciones se pueden pasar a través de atributos de datos o JavaScript, puede agregar un nombre de opción a data-bs-, como en data-bs-animation="{value}". Asegúrese de cambiar el tipo de caso del nombre de la opción de " camelCase " a " kebab-case " al pasar las opciones a través de atributos de datos. Por ejemplo, use 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 reservados experimentaldata-bs-config que puede albergar una configuración de componente simple como una cadena JSON. Cuando un elemento tiene atributos data-bs-config='{"delay":0, "title":123}'y , el valor final será y los atributos de datos separados anularán los valores dados en . Además, los atributos de datos existentes pueden albergar valores JSON como .data-bs-title="456"title456data-bs-configdata-bs-delay='{"show":0,"hide":150}'

Tenga en cuenta que, por motivos de seguridad, las sanitizeopciones sanitizeFn, y allowListno se pueden proporcionar mediante atributos de datos.
Nombre Escribe Defecto Descripción
allowList objeto Valor por defecto Objeto que contiene atributos y etiquetas permitidos.
animation booleano true Aplique una transición de fundido CSS al popover.
boundary cadena, elemento 'clippingParents' Límite de restricción de desbordamiento del popover (se aplica solo al modificador preventOverflow de Popper). De forma predeterminada, es 'clippingParents'y puede aceptar una referencia HTMLElement (solo a través de JavaScript). Para obtener más información, consulte la documentación de detectOverflow de Popper .
container cadena, elemento, falso false Agrega el popover a un elemento específico. Ejemplo: container: 'body'. Esta opción es especialmente útil porque le permite colocar la ventana emergente en el flujo del documento cerca del elemento de activación, lo que evitará que la ventana emergente se aleje flotando del elemento de activación durante el cambio de tamaño de la ventana.
content cadena, elemento, función '' Valor de contenido predeterminado si el data-bs-contentatributo no está presente. Si se proporciona una función, se llamará con su thisreferencia establecida en el elemento al que se adjunta el popover.
customClass cadena, función '' Agregue clases a la ventana emergente cuando se muestre. Tenga en cuenta que estas clases se agregarán además de las clases especificadas en la plantilla. Para agregar varias clases, sepárelas con espacios: 'class-1 class-2'. También puede pasar una función que debería devolver una sola cadena que contenga nombres de clases adicionales.
delay número, objeto 0 Retrasar la visualización y ocultación de la ventana emergente (ms): no se aplica al tipo de activación manual. Si se proporciona un número, se aplica un retraso tanto para ocultar como para mostrar. La estructura del objeto es: delay: { "show": 500, "hide": 100 }.
fallbackPlacements cadena, matriz ['top', 'right', 'bottom', 'left'] Defina ubicaciones de respaldo proporcionando una lista de ubicaciones en matriz (en orden de preferencia). Para obtener más información, consulte los documentos de comportamiento de Popper .
html booleano false Permitir HTML en la ventana emergente. Si es verdadero, las etiquetas HTML en los popover titlese representarán en el popover. Si es falso, innerTextla propiedad se usará para insertar contenido en el DOM. Use texto si le preocupan los ataques XSS.
offset número, cadena, función [0, 0] Desplazamiento del popover relativo a su destino. Puede pasar una cadena en atributos de datos 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 ubicación del popper, la referencia y los rects del popper como su primer argumento. El nodo DOM del elemento desencadenante se pasa como segundo argumento. La función debe devolver una matriz con dos números: deslizamiento , distancia . Para obtener más información, consulte los documentos de compensación de Popper .
placement cadena, función 'top' Cómo colocar el popover: automático, arriba, abajo, izquierda, derecha. Cuando autose especifica, reorientará dinámicamente el popover. Cuando se usa una función para determinar la ubicación, se llama con el nodo DOM emergente como primer argumento y el nodo DOM del elemento desencadenante como segundo. El thiscontexto se establece en la instancia de popover.
popperConfig nulo, objeto, función null Para cambiar la configuración predeterminada de Popper de Bootstrap, consulte Configuración de Popper . Cuando se usa una función para crear la configuración Popper, se llama con un objeto que contiene la configuración Popper predeterminada de Bootstrap. Le ayuda a usar y fusionar el valor predeterminado con su propia configuración. La función debe devolver un objeto de configuración para Popper.
sanitize booleano true Activa o desactiva la desinfección. Si está activado 'template', 'content'y 'title'las opciones se desinfectarán.
sanitizeFn nulo, función null Aquí puede proporcionar su propia función de desinfección. Esto puede ser útil si prefiere usar una biblioteca dedicada para realizar la desinfección.
selector cadena, falso false Si se proporciona un selector, los objetos emergentes se delegarán a los destinos especificados. En la práctica, esto también se usa para aplicar popovers a elementos DOM agregados dinámicamente ( jQuery.onsoporte). Consulte este número y un ejemplo informativo .
template cuerda '<div class="popover" role="popover"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' HTML base para usar al crear el popover. Los popover titlese inyectarán en el archivo .popover-inner. .popover-arrowse convertirá en la flecha del popover. El elemento contenedor más externo debe tener la .popoverclase y role="popover".
title cadena, elemento, función '' Valor de título predeterminado si titleel atributo no está presente. Si se proporciona una función, se llamará con su thisreferencia establecida en el elemento al que se adjunta el popover.
trigger cuerda 'hover focus' Cómo se activa el popover: hacer clic, desplazar el cursor, enfocar, manual. Puede pasar varios disparadores; sepáralos 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 disparador. 'hover'por sí solo dará como resultado ventanas emergentes que no se pueden activar a través del teclado, y solo se deben usar si existen métodos alternativos para transmitir la misma información a los usuarios del teclado.

Atributos de datos para ventanas emergentes individuales

Las opciones para ventanas emergentes individuales se pueden especificar alternativamente mediante el uso de atributos de datos, como se explicó anteriormente.

Uso de la función conpopperConfig

const popover = new bootstrap.Popover(element, {
  popperConfig(defaultBsPopperConfig) {
    // const newPopperConfig = {...}
    // use defaultBsPopperConfig if needed...
    // return newPopperConfig
  }
})

Métodos

Transiciones y métodos asíncronos

Todos los métodos de API son asíncronos e inician una transición . Vuelven a la persona que llama tan pronto como se inicia la transición, pero antes de que finalice . Además, se ignorará una llamada de método en un componente en transición .

Consulte nuestra documentación de JavaScript para obtener más información .

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 selectoropción ) no se pueden destruir individualmente en elementos desencadenantes descendientes.
enable Le da al popover de un elemento la capacidad de mostrarse. Los popovers están habilitados de manera predeterminada.
getInstance Método estático que le permite obtener la instancia de popover asociada con un elemento DOM.
getOrCreateInstance Método estático que le permite obtener la instancia de popover asociada con un elemento DOM, o crear una nueva en caso de que no se haya inicializado.
hide Oculta el popover de un elemento. Vuelve a la persona que llama antes de que se haya ocultado el popover (es decir, antes de hidden.bs.popoverque ocurra el evento). Esto se considera una activación "manual" del popover.
setContent Brinda una forma de cambiar el contenido del popover después de su inicialización.
show Revela el popover de un elemento. Vuelve a la persona que llama antes de que se haya mostrado realmente el popover (es decir, antes de shown.bs.popoverque ocurra el evento). 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 Alterna el popover de un elemento. Vuelve a la persona que llama antes de que se muestre u oculte el popover (es decir, antes de que ocurra el evento shown.bs.popovero ). hidden.bs.popoverEsto se considera una activación "manual" del popover.
toggleEnabled Alterna la capacidad de mostrar u ocultar la ventana emergente 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'
})
El setContentmétodo acepta un objectargumento, donde cada clave de propiedad es un stringselector válido dentro de la plantilla emergente, y cada valor de propiedad relacionado puede ser string| element| function| null

Eventos

Evento Descripción
hide.bs.popover Este evento se activa inmediatamente cuando hidese llama al método de instancia.
hidden.bs.popover Este evento se activa cuando el popover ha terminado de ocultarse para el usuario (esperará a que se completen las transiciones de CSS).
inserted.bs.popover Este evento se activa después del show.bs.popoverevento cuando la plantilla de ventana emergente se ha agregado al DOM.
show.bs.popover Este evento se activa inmediatamente cuando showse llama al método de instancia.
shown.bs.popover Este evento se activa cuando el popover se hace visible para el usuario (esperará a que se completen las transiciones de CSS).
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
  // do something...
})