Naar de inhoud
Gratis naslagwerk over HTML
HTML leren en naslaan
Bootstrap 5.2 / Componenten

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.js opnemen, of één bootstrap.bundle.min.js gebruiken 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- en content-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- of disabled-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-nowrap op 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.
Let op

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.

Let op

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:

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

Let op

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.

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

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

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

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

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

Gevaar

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.

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

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

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

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

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

Data-attributen voor afzonderlijke popovers

Opties voor afzonderlijke popovers kun je, zoals hierboven uitgelegd, ook via data-attributen opgeven.

Een functie gebruiken met popperConfig

JS
const popover = new bootstrap.Popover(element, {
  popperConfig(defaultBsPopperConfig) {
    // const newPopperConfig = {...}
    // gebruik defaultBsPopperConfig indien nodig...
    // return newPopperConfig
  }
})

Methodes

Gevaar

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.
JS
// 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'
})
Let op

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).
JS
const myPopoverTrigger = document.getElementById('myPopover')
myPopoverTrigger.addEventListener('hidden.bs.popover', () => {
  // doe iets...
})