Popovers
Documentatie en voorbeelden voor het toevoegen van Bootstrap-popovers, zoals je die in iOS vindt, aan elk element op je site.
Overzicht
Dingen om te weten bij het gebruik van de popover-plugin:
- Popovers leunen voor de positionering op de externe bibliotheek Popper. Je moet popper.min.js vóór
bootstrap.jsopnemen, of éénbootstrap.bundle.min.jsgebruiken waarin Popper zit. - Popovers hebben de popover-plugin als afhankelijkheid nodig.
- Popovers zijn om prestatieredenen opt-in, dus je moet ze zelf initialiseren.
- Bij
title- encontent-waarden van lengte nul verschijnt er nooit een popover. - Geef
container: 'body'op om weergaveproblemen in complexere componenten (zoals onze input groups, button groups enz.) te voorkomen. - Popovers activeren op verborgen elementen werkt niet.
- Popovers voor
.disabled- ofdisabled-elementen moeten via een omhullend element worden geactiveerd. - Wanneer ze vanuit ankers worden geactiveerd die over meerdere regels lopen, worden popovers gecentreerd ten opzichte van de totale breedte van de ankers. Gebruik
.text-nowrapop je<a>s om dat gedrag te voorkomen. - Popovers moeten verborgen zijn voordat de bijbehorende elementen uit de DOM worden verwijderd.
- Popovers kunnen worden geactiveerd door een element binnen een shadow DOM.
Bootstraps JavaScript reinigt HTML die via opties binnenkomt (bijvoorbeeld de inhoud van een tooltip of popover) met een ingebouwde sanitizer, om het risico op XSS te beperken.
Animaties en overgangen houden rekening met de instelling prefers-reduced-motion. Heeft een bezoeker in het besturingssysteem om minder beweging gevraagd, dan vallen overgangen weg.
Lees verder om met een paar voorbeelden te zien hoe popovers werken.
Voorbeelden
Popovers inschakelen
Zoals hierboven vermeld moet je popovers initialiseren voordat je ze kunt gebruiken. Eén manier om alle popovers op een pagina te initialiseren is ze via hun data-bs-toggle-attribuut te selecteren, zoals hier:
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))Live demo
We gebruiken JavaScript die lijkt op het fragment hierboven om de volgende live popover weer te geven. Titels stel je in via data-bs-title en de inhoud via data-bs-content.
Gebruik voor dit component altijd data-bs-title in plaats van het gewone title-attribuut: sommige HTML-elementen tonen anders zowel de eigen native tooltip als die van Bootstrap.
<button type="button" class="btn btn-lg btn-danger" data-bs-toggle="popover" data-bs-title="Popover-titel" data-bs-content="En hier staat geweldige content. Heel boeiend. Toch?">Klik om de popover te schakelen</button>Vier richtingen
Er zijn vier opties beschikbaar: boven, rechts, onder en links. De richtingen worden gespiegeld wanneer je Bootstrap in RTL gebruikt. Stel data-bs-placement in om de richting te wijzigen.
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="top" data-bs-content="Popover bovenaan">
Popover bovenaan
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="right" data-bs-content="Popover rechts">
Popover rechts
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="bottom" data-bs-content="Popover onderaan">
Popover onderaan
</button>
<button type="button" class="btn btn-secondary" data-bs-container="body" data-bs-toggle="popover" data-bs-placement="left" data-bs-content="Popover links">
Popover links
</button>Eigen container
Wanneer een bovenliggend element stijlen heeft die een popover in de weg zitten, geef je een eigen container op zodat de HTML van de popover binnen dat element verschijnt. Dat komt vaak voor bij responsieve tabellen, input groups en dergelijke.
const popover = new bootstrap.Popover('.example-popover', {
container: 'body'
})Een andere situatie waarin je een expliciete eigen container wilt instellen, zijn popovers binnen een modal-dialoogvenster, om te zorgen dat de popover zelf aan de modal wordt toegevoegd. Dat is vooral belangrijk voor popovers met interactieve elementen: modal-dialoogvensters houden de focus vast, dus tenzij de popover een kindelement van de modal is, kunnen gebruikers die interactieve elementen niet focussen of activeren.
const popover = new bootstrap.Popover('.example-popover', {
container: '.modal-body'
})Eigen popovers
Nieuw in v5.2.0
Je kunt het uiterlijk van popovers aanpassen met CSS-variabelen. We stellen een eigen klasse in met data-bs-custom-class="custom-popover" om ons aangepaste uiterlijk af te bakenen, en gebruiken die om een aantal lokale CSS-variabelen te overschrijven.
Standaardwaarden: zie site/assets/scss/_component-examples.scss in de Bootstrap-broncode.
<button type="button" class="btn btn-secondary"
data-bs-toggle="popover" data-bs-placement="right"
data-bs-custom-class="custom-popover"
data-bs-title="Eigen popover"
data-bs-content="Deze popover is via CSS-variabelen van een thema voorzien.">
Eigen popover
</button>Sluiten bij de volgende klik
Gebruik de trigger focus om popovers te sluiten zodra de gebruiker op een ander element klikt dan het toggle-element.
Specifieke markup vereist voor sluiten-bij-volgende-klik
Voor correct gedrag in alle browsers en op alle platforms moet je de <a>-tag gebruiken en niet de <button>-tag, en moet je ook een tabindex-attribuut opnemen.
<a tabindex="0" class="btn btn-lg btn-danger" role="button" data-bs-toggle="popover" data-bs-trigger="focus" data-bs-title="Sluitbare popover" data-bs-content="En hier staat geweldige content. Heel boeiend. Toch?">Sluitbare popover</a>const popover = new bootstrap.Popover('.popover-dismiss', {
trigger: 'focus'
})Uitgeschakelde elementen
Elementen met het disabled-attribuut zijn niet interactief, wat betekent dat gebruikers er niet overheen kunnen hoveren of erop kunnen klikken om een popover (of tooltip) te activeren. Als tijdelijke oplossing activeer je de popover vanuit een omhullende <div> of <span>, idealiter met tabindex="0" focusbaar gemaakt met het toetsenbord.
Bij uitgeschakelde popover-triggers geef je mogelijk ook de voorkeur aan data-bs-trigger="hover focus", zodat de popover als directe visuele feedback verschijnt; gebruikers verwachten immers niet dat ze op een uitgeschakeld element moeten klikken.
<span class="d-inline-block" tabindex="0" data-bs-toggle="popover" data-bs-trigger="hover focus" data-bs-content="Uitgeschakelde popover">
<button class="btn btn-primary" type="button" disabled>Uitgeschakelde knop</button>
</span>CSS
Variabelen
Nieuw in v5.2.0
Als onderdeel van Bootstraps groeiende aanpak met CSS-variabelen gebruiken popovers nu lokale CSS-variabelen op .popover, voor betere aanpassingen in realtime. De waarden voor de CSS-variabelen worden via Sass ingesteld, dus aanpassen via Sass wordt nog steeds ondersteund.
Standaardwaarden: zie scss/_popover.scss in de Bootstrap-broncode.
Sass-variabelen
Standaardwaarden: zie scss/_variables.scss in de Bootstrap-broncode.
Gebruik
Schakel popovers in via JavaScript:
const exampleEl = document.getElementById('example')
const popover = new bootstrap.Popover(exampleEl, options)Popovers laten werken voor gebruikers van toetsenbord en hulptechnologie
Om toetsenbordgebruikers je popovers te laten activeren, voeg je ze alleen toe aan HTML-elementen die van oudsher met het toetsenbord te focussen en interactief zijn (zoals links of formulierbesturingselementen). Hoewel willekeurige HTML-elementen (zoals <span>s) focusbaar gemaakt kunnen worden door het attribuut tabindex="0" toe te voegen, levert dat mogelijk irritante en verwarrende tabstops op niet-interactieve elementen op voor toetsenbordgebruikers, en de meeste hulptechnologieën kondigen de inhoud van de popover in die situatie momenteel niet aan. Vertrouw daarnaast niet uitsluitend op hover als trigger voor je popovers, want daarmee worden ze onbereikbaar voor toetsenbordgebruikers.
Hoewel je met de optie html rijke, gestructureerde HTML in popovers kunt zetten, raden we sterk af om er buitensporig veel content aan toe te voegen. Popovers werken momenteel zo dat hun content, zodra die getoond wordt, met het attribuut aria-describedby aan het trigger-element gekoppeld is. Daardoor wordt de volledige inhoud van de popover aan gebruikers van hulptechnologie voorgelezen als één lange, ononderbroken stroom.
Hoewel het bovendien mogelijk is om ook interactieve bedieningselementen (zoals formulierelementen of links) in je popover op te nemen (door die elementen aan de allowList met toegestane attributen en tags toe te voegen), moet je weten dat de popover de volgorde van toetsenbordfocus momenteel niet beheert. Wanneer een toetsenbordgebruiker een popover opent, blijft de focus op het trigger-element, en omdat de popover in de documentstructuur meestal niet direct op de trigger volgt, is er geen garantie dat vooruit navigeren met TAB de gebruiker in de popover zelf brengt. Kortom: interactieve bedieningselementen zomaar aan een popover toevoegen maakt ze waarschijnlijk onbereikbaar of onbruikbaar voor toetsenbordgebruikers en gebruikers van hulptechnologie, of levert op zijn minst een onlogische focusvolgorde op. Overweeg in die gevallen liever een modal-dialoogvenster.
Opties
De meeste plugins kun je aanzetten zonder JavaScript te schrijven, puur met een data-bs-*-attribuut als trigger. Al deze data-attributen zijn genamespaced met bs-, zodat ze niet botsen met andere scripts.
Let op: om veiligheidsredenen kunnen de opties sanitize, sanitizeFn en allowList niet via data-attributen worden meegegeven.
| Naam | Type | Standaard | Omschrijving |
|---|---|---|---|
allowList |
object | Standaardwaarde | Object met toegestane attributen en tags. |
animation |
boolean | true |
Past een CSS-fade-transitie op de popover toe. |
boundary |
string, element | 'clippingParents' |
Overflow-begrenzing van de popover (geldt alleen voor Poppers preventOverflow-modifier). Standaard is dat 'clippingParents'; het kan een verwijzing naar een HTMLElement accepteren (alleen via JavaScript). Zie voor meer informatie Poppers detectOverflow-documentatie. |
container |
string, element, false | false |
Voegt de popover aan een specifiek element toe. Voorbeeld: container: 'body'. Deze optie is vooral handig omdat je de popover daarmee in de flow van het document dicht bij het trigger-element kunt positioneren — wat voorkomt dat de popover bij het vergroten of verkleinen van het venster van het trigger-element wegdrijft. |
content |
string, element, function | '' |
Standaard content-waarde als het attribuut data-bs-content ontbreekt. Bij een functie wordt die aangeroepen met de this-referentie gezet op het element waaraan de popover is gekoppeld. |
customClass |
string, function | '' |
Voegt klassen aan de popover toe wanneer die getoond wordt. Let op: die klassen komen bovenop eventuele klassen in de template. Wil je meerdere klassen toevoegen, scheid ze dan met spaties: 'class-1 class-2'. Je kunt ook een functie meegeven die één string met extra klassenamen teruggeeft. |
delay |
number, object | 0 |
Vertraagt het tonen en verbergen van de popover (ms) — geldt niet voor het handmatige triggertype. Bij een getal wordt de vertraging op zowel verbergen als tonen toegepast. De objectstructuur is: delay: { "show": 500, "hide": 100 }. |
fallbackPlacements |
string, array | ['top', 'right', 'bottom', 'left'] |
Definieer terugvalplaatsingen door een lijst met plaatsingen in een array op te geven (in volgorde van voorkeur). Zie voor meer informatie Poppers gedragsdocumentatie. |
html |
boolean | false |
Staat HTML in de popover toe. Bij true worden HTML-tags in de title van de popover in de popover weergegeven. Bij false wordt de eigenschap innerText gebruikt om content in de DOM te zetten. Gebruik tekst als je je zorgen maakt over XSS-aanvallen. |
offset |
number, string, function | [0, 0] |
Offset van de popover ten opzichte van zijn doel. Je kunt in data-attributen een string met door komma's gescheiden waarden meegeven, zoals data-bs-offset="10,20". Wanneer een functie de offset bepaalt, wordt die aangeroepen met als eerste argument een object met de popper-plaatsing, de referentie en de popper-rects. De DOM-node van het trigger-element wordt als tweede argument meegegeven. De functie moet een array met twee getallen teruggeven: skidding, distance. Zie voor meer informatie Poppers offset-documentatie. |
placement |
string, function | 'top' |
Hoe de popover gepositioneerd wordt: auto, top, bottom, left, right. Bij auto wordt de popover dynamisch geheroriënteerd. Wanneer een functie de plaatsing bepaalt, wordt die aangeroepen met de DOM-node van de popover als eerste argument en de DOM-node van het trigger-element als tweede. De this-context wordt op de popover-instantie gezet. |
popperConfig |
null, object, function | null |
Zie Poppers configuratie om de standaard Popper-configuratie van Bootstrap te wijzigen. Wanneer een functie de Popper-configuratie maakt, wordt die aangeroepen met een object dat de standaard Popper-configuratie van Bootstrap bevat. Zo kun je die gebruiken en met je eigen configuratie samenvoegen. De functie moet een configuratieobject voor Popper teruggeven. |
sanitize |
boolean | true |
Schakelt de sanitatie in of uit. Als die actief is, worden de opties 'template', 'content' en 'title' gesaneerd. |
sanitizeFn |
null, function | null |
Hier kun je je eigen sanitize-functie meegeven. Dat kan handig zijn als je liever een speciale bibliotheek voor sanitatie gebruikt. |
selector |
string, false | false |
Wanneer er een selector is opgegeven, worden popover-objecten aan de opgegeven doelen gedelegeerd. In de praktijk gebruik je dit om popovers ook op dynamisch toegevoegde DOM-elementen toe te passen (jQuery.on-ondersteuning). Zie dit issue en een verhelderend voorbeeld. Let op: het title-attribuut mag niet als selector gebruikt worden. |
template |
string | '<div class="popover" role="popover"><div class="popover-arrow"></div><div class="popover-inner"></div></div>' |
Basis-HTML die gebruikt wordt bij het maken van de popover. De title van de popover wordt in de .popover-inner geïnjecteerd. .popover-arrow wordt het pijltje van de popover. Het buitenste omhullende element hoort de klasse .popover en role="popover" te hebben. |
title |
string, element, function | '' |
Standaard titelwaarde als het title-attribuut ontbreekt. Bij een functie wordt die aangeroepen met de this-referentie gezet op het element waaraan de popover is gekoppeld. |
trigger |
string | 'hover focus' |
Hoe de popover wordt geactiveerd: click, hover, focus, manual. Je kunt meerdere triggers meegeven; scheid ze met een spatie. 'manual' geeft aan dat de popover programmatisch wordt geactiveerd via de methodes .popover('show'), .popover('hide') en .popover('toggle'); deze waarde kan niet met een andere trigger worden gecombineerd. 'hover' op zichzelf levert popovers op die niet met het toetsenbord te activeren zijn, en zou alleen gebruikt moeten worden als er alternatieve manieren zijn om dezelfde informatie aan toetsenbordgebruikers over te brengen. |
Data-attributen voor afzonderlijke popovers
Opties voor afzonderlijke popovers kun je, zoals hierboven uitgelegd, ook via data-attributen opgeven.
Een functie gebruiken met popperConfig
const popover = new bootstrap.Popover(element, {
popperConfig(defaultBsPopperConfig) {
// const newPopperConfig = {...}
// gebruik defaultBsPopperConfig indien nodig...
// return newPopperConfig
}
})Methodes
Deze methode start een overgang. Roep hem niet opnieuw aan zolang de vorige nog bezig is: dat levert onverwacht gedrag op. Wacht op het bijbehorende gebeurtenis voordat je opnieuw aanroept.
| Methode | Omschrijving |
|---|---|
disable |
Zorgt dat de popover van een element niet meer getoond kan worden. De popover kan pas weer getoond worden als hij opnieuw wordt ingeschakeld. |
dispose |
Verbergt en vernietigt de popover van een element (verwijdert opgeslagen gegevens van het DOM-element). Popovers die delegatie gebruiken (aangemaakt met de optie selector) kunnen niet afzonderlijk op onderliggende trigger-elementen vernietigd worden. |
enable |
Zorgt dat de popover van een element getoond kan worden. Popovers zijn standaard ingeschakeld. |
getInstance |
Statische methode waarmee je de popover-instantie kunt ophalen die bij een DOM-element hoort. |
getOrCreateInstance |
Statische methode waarmee je de popover-instantie kunt ophalen die bij een DOM-element hoort, of een nieuwe kunt aanmaken als die nog niet was geïnitialiseerd. |
hide |
Verbergt de popover van een element. Keert terug naar de aanroeper voordat de popover daadwerkelijk verborgen is (dus vóór de gebeurtenis hidden.bs.popover). Dit geldt als "handmatig" activeren van de popover. |
setContent |
Biedt een manier om de content van de popover na initialisatie te wijzigen. |
show |
Toont de popover van een element. Keert terug naar de aanroeper voordat de popover daadwerkelijk getoond is (dus vóór de gebeurtenis shown.bs.popover). Dit geldt als "handmatig" activeren van de popover. Popovers waarvan zowel de titel als de content lengte nul hebben, worden nooit weergegeven. |
toggle |
Schakelt de popover van een element. Keert terug naar de aanroeper voordat de popover daadwerkelijk getoond of verborgen is (dus vóór de gebeurtenis shown.bs.popover of hidden.bs.popover). Dit geldt als "handmatig" activeren van de popover. |
toggleEnabled |
Schakelt of de popover van een element getoond of verborgen kan worden. |
update |
Werkt de positie van de popover van een element bij. |
// getOrCreateInstance-voorbeeld
const popover = bootstrap.Popover.getOrCreateInstance('#example') // Geeft een Bootstrap-popover-instantie terug
// setContent-voorbeeld
myPopover.setContent({
'.popover-header': 'een andere titel',
'.popover-body': 'andere content'
})De methode setContent accepteert een object-argument, waarbij elke property-sleutel een geldige string-selector binnen de popover-template is, en elke bijbehorende property-waarde string | element | function | null kan zijn.
Gebeurtenissen
| Gebeurtenis | Omschrijving |
|---|---|
hide.bs.popover |
Deze gebeurtenis wordt direct afgevuurd wanneer de instantiemethode hide is aangeroepen. |
hidden.bs.popover |
Deze gebeurtenis wordt afgevuurd wanneer de popover volledig voor de gebruiker verborgen is (wacht tot de CSS-transities voltooid zijn). |
inserted.bs.popover |
Deze gebeurtenis wordt na de gebeurtenis show.bs.popover afgevuurd, wanneer de popover-template aan de DOM is toegevoegd. |
show.bs.popover |
Deze gebeurtenis wordt direct afgevuurd wanneer de instantiemethode show wordt aangeroepen. |
shown.bs.popover |
Deze gebeurtenis wordt afgevuurd wanneer de popover zichtbaar is gemaakt voor de gebruiker (wacht tot de CSS-transities voltooid zijn). |
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
// doe iets...
})