Saltar al contingut principal Saltar a la navegació de documents
Check
in English

Popovers

Documentació i exemples per afegir finestres emergents Bootstrap, com les que es troben a iOS, a qualsevol element del vostre lloc.

Visió general

Coses a saber quan s'utilitza el connector popover:

  • Els popovers depenen de la biblioteca de tercers Popper per al posicionament. Heu d'incloure popper.min.js abans bootstrap.jso utilitzar-ne un bootstrap.bundle.min.jsque contingui Popper.
  • Els popovers requereixen el connector popover com a dependència.
  • Els popovers estan activats per raons de rendiment, de manera que els heu d'inicialitzar vosaltres mateixos .
  • La longitud zero titlei contentels valors mai no mostraran un popover.
  • Especifiqueu container: 'body'per evitar problemes de renderització en components més complexos (com els nostres grups d'entrada, grups de botons, etc.).
  • No funcionarà activar popovers en elements ocults.
  • Els popovers per .disabledo disabledelements s'han d'activar en un element d'embolcall.
  • Quan s'activa des d'ancoratges que s'emboliquen a través de diverses línies, els popovers es centraran entre l'amplada total dels ancoratges. Utilitzeu .text-nowrap-lo <a>per evitar aquest comportament.
  • Els popovers s'han d'amagar abans que els seus elements corresponents s'hagin eliminat del DOM.
  • Els popovers es poden activar gràcies a un element dins d'un DOM ombra.
De manera predeterminada, aquest component utilitza el desinfectador de contingut integrat, que elimina tots els elements HTML que no estan permesos explícitament. Consulteu la secció desinfectant de la nostra documentació de JavaScript per obtenir més detalls.
L'efecte d'animació d'aquest component depèn de la prefers-reduced-motionconsulta de mitjans. Consulteu la secció de moviment reduït de la nostra documentació d'accessibilitat .

Segueix llegint per veure com funcionen els popovers amb alguns exemples.

Exemples

Activa les finestres emergents

Com s'ha esmentat anteriorment, heu d'inicialitzar les finestres emergents abans que es puguin utilitzar. Una manera d'inicialitzar totes les finestres emergents d'una pàgina seria seleccionar-les pel seu data-bs-toggleatribut, així:

const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))

Demo en directe

Utilitzem JavaScript semblant al fragment de més amunt per representar la següent pantalla emergent en directe. Els títols s'estableixen mitjançant data-bs-titlei el contingut del cos s'estableix mitjançant data-bs-content.

No dubteu a utilitzar qualsevol titleo bé data-bs-titleal vostre HTML. Quan titles'utilitza, Popper el substituirà automàticament per data-bs-titlequan es renderitzi l'element.
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>

Quatre direccions

Hi ha quatre opcions disponibles: superior, dreta, inferior i esquerra. Les indicacions es reflecteixen quan s'utilitza Bootstrap a RTL. Estableix data-bs-placementper canviar la direcció.

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>

Personalitzatcontainer

Quan tingueu alguns estils en un element pare que interfereixen amb un popover, voldreu especificar un personalitzat containerperquè l'HTML del popover aparegui dins d'aquest element. Això és comú en taules sensibles, grups d'entrada i similars.

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

Una altra situació en què voldreu establir un personalitzat explícit containersón les finestres emergents dins d'un diàleg modal , per assegurar-vos que la finestra emergent s'adjunta al modal. Això és especialment important per a les finestres emergents que contenen elements interactius: els diàlegs modals atraparan el focus, de manera que tret que el popover sigui un element secundari del modal, els usuaris no podran enfocar ni activar aquests elements interactius.

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

Popovers personalitzats

Afegit a la v5.2.0

Podeu personalitzar l'aspecte de les finestres emergents mitjançant variables CSS . Vam establir una classe personalitzada amb data-bs-custom-class="custom-popover"per abastar la nostra aparença personalitzada i la fem servir per anul·lar algunes de les variables CSS locals.

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

Omet al següent clic

Utilitzeu el focusdisparador per descartar les finestres emergents al següent clic de l'usuari en un element diferent de l'element de commutació.

Es requereix un etiquetatge específic per a descartar el clic següent

Per a un comportament adequat entre navegadors i plataformes, heu d'utilitzar l' <a>etiqueta, no l' <button>etiqueta, i també heu d'incloure un tabindexatribut.

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'
})

Elements inhabilitats

Els elements amb l' disabledatribut no són interactius, és a dir, els usuaris no poden passar-hi el cursor ni fer-hi clic per activar una finestra emergent (o informació sobre eines). Com a solució alternativa, voldreu activar el popover des d'un embolcall <div>o <span>, idealment enfocat al teclat amb tabindex="0".

Per als activadors de popover desactivats, també podeu preferir data-bs-trigger="hover focus"que el popover aparegui com a comentari visual immediat als vostres usuaris, ja que potser no esperen fer clic en un element desactivat.

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

Les variables

Afegit a la v5.2.0

Com a part de l'evolució de l'enfocament de variables CSS de Bootstrap, els popovers ara utilitzen variables CSS locals .popoverper a una personalització millorada en temps real. Els valors de les variables CSS s'estableixen mitjançant Sass, de manera que la personalització de Sass encara és 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;

Ús

Activa les finestres emergents mitjançant JavaScript:

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

Fer que les finestres emergents funcionin per als usuaris de teclat i tecnologia d'assistència

Per permetre que els usuaris del teclat activin les vostres finestres emergents, només hauríeu d'afegir-les als elements HTML que tradicionalment es poden centrar en el teclat i interactius (com ara enllaços o controls de formulari). Tot i que els elements HTML arbitraris (com ara <span>s) es poden enfocar afegint l' tabindex="0"atribut, això afegirà tabulacions potencialment molestes i confuses en elements no interactius per als usuaris del teclat, i la majoria de les tecnologies d'assistència actualment no anuncien el contingut del popover en aquesta situació. . A més, no us confieu únicament hovercom a activador dels vostres popovers, ja que això els farà impossibles d'activar per als usuaris del teclat.

Tot i que podeu inserir HTML ric i estructurat a les finestres emergents amb l' htmlopció, us recomanem fermament que eviteu afegir una quantitat excessiva de contingut. La manera com funcionen actualment les finestres emergents és que, un cop es mostren, el seu contingut està lligat a l'element activador amb l' aria-describedbyatribut. Com a resultat, la totalitat del contingut del popover s'anunciarà als usuaris de tecnologia d'assistència com un flux llarg i ininterromput.

A més, tot i que també és possible incloure controls interactius (com ara elements de formulari o enllaços) a la finestra emergent (afegiu aquests elements a les allowListetiquetes i atributs permesos), tingueu en compte que actualment la finestra emergent no gestiona l'ordre de focus del teclat. Quan un usuari de teclat obre una finestra emergent, el focus es manté en l'element activador, i com que la finestra emergent normalment no segueix immediatament l'activador a l'estructura del document, no hi ha cap garantia que s'avança/premTABmourà un usuari del teclat a la finestra emergent. En resum, només afegir controls interactius a un popover és probable que aquests controls siguin inabastables/inutilitzables per als usuaris del teclat i els usuaris de tecnologies d'assistència, o, si més no, un ordre d'enfocament global il·lògic. En aquests casos, considereu utilitzar un diàleg modal.

Opcions

Com que les opcions es poden passar mitjançant atributs de dades o JavaScript, podeu afegir un nom d'opció a data-bs-, com a data-bs-animation="{value}". Assegureu-vos de canviar el tipus de cas del nom de l'opció de " camelCase " a " kebab-case " quan passeu les opcions mitjançant atributs de dades. Per exemple, utilitzeu data-bs-custom-class="beautifier"en comptes de data-bs-customClass="beautifier".

A partir de Bootstrap 5.2.0, tots els components admeten un atribut de dades reservades experimentalsdata-bs-config que pot albergar una configuració senzilla de components com a cadena JSON. Quan un element té data-bs-config='{"delay":0, "title":123}'i data-bs-title="456"atributs, el titlevalor final serà 456i els atributs de dades independents substituiran els valors donats a data-bs-config. A més, els atributs de dades existents poden albergar valors JSON com data-bs-delay='{"show":0,"hide":150}'.

Tingueu en compte que, per motius de seguretat, les opcions sanitize, sanitizeFn, i allowListno es poden proporcionar amb atributs de dades.
Nom Tipus Per defecte Descripció
allowList objecte Valor per defecte Objecte que conté atributs i etiquetes permesos.
animation booleà true Apliqueu una transició d'esvaïment CSS al popover.
boundary corda, element 'clippingParents' Límit de restricció de desbordament del popover (només s'aplica al modificador preventOverflow de Popper). De manera predeterminada, és 'clippingParents'i pot acceptar una referència HTMLElement (només mitjançant JavaScript). Per obtenir més informació, consulteu els documents detectOverflow de Popper .
container cadena, element, fals false Afegeix la finestra emergent a un element específic. Exemple: container: 'body'. Aquesta opció és especialment útil perquè us permet situar el popover en el flux del document a prop de l'element activador, cosa que evitarà que el popover surti lluny de l'element activador durant un canvi de mida de la finestra.
content cadena, element, funció '' Valor de contingut predeterminat si data-bs-contentl'atribut no és present. Si es dóna una funció, s'anomenarà amb la seva thisreferència establerta a l'element al qual està connectat el popover.
customClass cadena, funció '' Afegiu classes a la finestra emergent quan es mostri. Tingueu en compte que aquestes classes s'afegiran a més de les classes especificades a la plantilla. Per afegir diverses classes, separeu-les amb espais: 'class-1 class-2'. També podeu passar una funció que hauria de retornar una única cadena que contingui noms de classe addicionals.
delay nombre, objecte 0 Retard per mostrar i amagar la finestra emergent (ms): no s'aplica al tipus d'activador manual. Si es proporciona un número, s'aplica un retard tant per ocultar com per mostrar. L'estructura de l'objecte és: delay: { "show": 500, "hide": 100 }.
fallbackPlacements cadena, matriu ['top', 'right', 'bottom', 'left'] Definiu ubicacions alternatives proporcionant una llista d'ubicacions en matriu (per ordre de preferència). Per obtenir més informació, consulteu els documents de comportament de Popper .
html booleà false Permet HTML a la finestra emergent. Si és cert, les etiquetes HTML de la finestra emergent es titlemostraran a la finestra emergent. Si és fals, innerTextla propietat s'utilitzarà per inserir contingut al DOM. Utilitzeu text si us preocupen els atacs XSS.
offset nombre, cadena, funció [0, 0] Desplaçament del popover en relació amb el seu objectiu. Podeu passar una cadena en atributs de dades amb valors separats per comes com: data-bs-offset="10,20". Quan s'utilitza una funció per determinar el desplaçament, s'anomena amb un objecte que conté la ubicació del popper, la referència i rectes del popper com a primer argument. El node DOM de l'element desencadenant es passa com a segon argument. La funció ha de retornar una matriu amb dos números: skidding , distance . Per obtenir més informació, consulteu els documents d'offset de Popper .
placement cadena, funció 'top' Com col·locar el popover: automàtic, superior, inferior, esquerre, dret. Quan autos'especifica, reorientarà dinàmicament el popover. Quan s'utilitza una funció per determinar la ubicació, es crida amb el node DOM emergent com a primer argument i el node DOM de l'element activador com a segon. El thiscontext s'estableix a la instància emergent.
popperConfig nul, objecte, funció null Per canviar la configuració de Popper per defecte de Bootstrap, vegeu la configuració de Popper . Quan s'utilitza una funció per crear la configuració de Popper, s'anomena amb un objecte que conté la configuració de Popper per defecte de Bootstrap. Us ajuda a utilitzar i combinar el valor predeterminat amb la vostra pròpia configuració. La funció ha de retornar un objecte de configuració per a Popper.
sanitize booleà true Activa o desactiva la desinfecció. Si està activat 'template', 'content'i 'title'les opcions es desinfectaran.
sanitizeFn nul·la, funció null Aquí podeu proporcionar la vostra pròpia funció de desinfecció. Això pot ser útil si preferiu utilitzar una biblioteca dedicada per realitzar la desinfecció.
selector corda, fals false Si es proporciona un selector, els objectes emergents es delegaran als objectius especificats. A la pràctica, això també s'utilitza per aplicar popovers als elements DOM afegits dinàmicament ( jQuery.onsuport). Vegeu aquest problema i un exemple informatiu .
template corda '<div class="popover" role="popover"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' HTML base per utilitzar quan es crea el popover. Els popover's titles'injectaran al .popover-inner. .popover-arrowes convertirà en la fletxa del popover. L'element d'embolcall més extern hauria de tenir la .popoverclasse i role="popover".
title cadena, element, funció '' Valor del títol predeterminat si titlel'atribut no és present. Si es dóna una funció, s'anomenarà amb la seva thisreferència establerta a l'element al qual està connectat el popover.
trigger corda 'hover focus' Com s'activa el popover: clic, passa el cursor, focus, manual. Podeu passar múltiples activadors; separeu-los amb un espai. 'manual'indica que el popover s'activarà de manera programàtica mitjançant els mètodes i .popover('show'); aquest valor no es pot combinar amb cap altre activador. per si sol donarà lloc a popovers que no es poden activar mitjançant el teclat i només s'han d'utilitzar si hi ha mètodes alternatius per transmetre la mateixa informació als usuaris del teclat..popover('hide').popover('toggle')'hover'

Atributs de dades per a popovers individuals

Les opcions per a popovers individuals es poden especificar alternativament mitjançant l'ús d'atributs de dades, tal com s'ha explicat anteriorment.

Utilitzant la funció ambpopperConfig

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

Mètodes

Mètodes asíncrons i transicions

Tots els mètodes de l'API són asíncrons i comencen una transició . Tornen a la persona que truca tan bon punt s'inicia la transició però abans que acabi . A més, s'ignorarà una trucada de mètode en un component en transició .

Consulteu la nostra documentació de JavaScript per obtenir més informació .

Mètode Descripció
disable Elimina la possibilitat que es mostri la finestra emergent d'un element. La finestra emergent només es podrà mostrar si es torna a habilitar.
dispose Amaga i destrueix la finestra emergent d'un element (elimina les dades emmagatzemades a l'element DOM). Els popovers que utilitzen la delegació (que es creen amb l' selectoropció ) no es poden destruir individualment en elements activadors descendents.
enable Ofereix la possibilitat de mostrar-se al popover d'un element. Les finestres emergents estan habilitades de manera predeterminada.
getInstance Mètode estàtic que us permet obtenir la instància emergent associada a un element DOM.
getOrCreateInstance Mètode estàtic que us permet obtenir la instància emergent associada a un element DOM o crear-ne una de nova en cas que no s'hagi inicialitzat.
hide Amaga la finestra emergent d'un element. Torna a la persona que truca abans que el popover s'hagi amagat (és a dir, abans hidden.bs.popoverque es produeixi l'esdeveniment). Això es considera una activació "manual" del popover.
setContent Ofereix una manera de canviar el contingut de la finestra emergent després de la seva inicialització.
show Revela el popover d'un element. Torna a la persona que truca abans que s'hagi mostrat realment el popover (és a dir, abans shown.bs.popoverque es produeixi l'esdeveniment). Això es considera una activació "manual" del popover. Les finestres emergents el títol i el contingut dels quals són de longitud zero mai es mostren.
toggle Activa o desactiva la finestra emergent d'un element. Torna a la persona que truca abans que el popover s'hagi mostrat o amagat (és a dir, abans que es produeixi l'esdeveniment shown.bs.popovero ). hidden.bs.popoverAixò es considera una activació "manual" del popover.
toggleEnabled Activa o desactiva la possibilitat de mostrar o amagar la finestra emergent d'un element.
update Actualitza la posició de la finestra emergent d'un element.
// 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ètode accepta un objectargument, on cada clau de propietat és un stringselector vàlid dins de la plantilla popover, i cada valor de propietat relacionat pot ser string| element| function| null

Esdeveniments

Esdeveniment Descripció
hide.bs.popover Aquest esdeveniment s'activa immediatament quan hides'ha cridat el mètode d'instància.
hidden.bs.popover Aquest esdeveniment s'activa quan la finestra emergent s'ha acabat d'ocultar per a l'usuari (esperarà que finalitzin les transicions CSS).
inserted.bs.popover Aquest esdeveniment s'activa després de l' show.bs.popoveresdeveniment quan s'ha afegit la plantilla popover al DOM.
show.bs.popover Aquest esdeveniment s'activa immediatament quan showes crida al mètode d'instància.
shown.bs.popover Aquest esdeveniment s'activa quan la finestra emergent s'ha fet visible per a l'usuari (esperarà que finalitzin les transicions CSS).
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
  // do something...
})