Modal
Gebruik de JavaScript-modal-plugin van Bootstrap om dialoogvensters aan je site toe te voegen voor lightboxen, gebruikersmeldingen of volledig eigen content.
Hoe het werkt
Lees het volgende voordat je met het modal-component van Bootstrap aan de slag gaat, want onze menu-opties zijn recent gewijzigd.
- Modals zijn gebouwd met HTML, CSS en JavaScript. Ze worden boven al het andere in het document geplaatst en halen het scrollen weg bij de
<body>, zodat de modal-content in plaats daarvan scrollt. - Klikken op de "backdrop" van de modal sluit de modal automatisch.
- Bootstrap ondersteunt maar één modal-venster tegelijk. Geneste modals worden niet ondersteund, omdat wij ze een slechte gebruikerservaring vinden.
- Modals gebruiken
position: fixed, wat qua weergave soms wat eigenzinnig kan zijn. Plaats je modal-HTML waar mogelijk op het hoogste niveau om mogelijke interferentie van andere elementen te voorkomen. Je loopt waarschijnlijk tegen problemen aan wanneer je een.modalin een ander fixed element nest. - Ook vanwege
position: fixedzijn er een aantal kanttekeningen bij het gebruik van modals op mobiele apparaten. Zie onze documentatie over browserondersteuning voor details. - Vanwege de manier waarop HTML5 zijn semantiek definieert, heeft het HTML-attribuut
autofocusgeen effect in Bootstrap-modals. Gebruik wat eigen JavaScript om hetzelfde effect te bereiken:
const myModal = document.getElementById('myModal')
const myInput = document.getElementById('myInput')
myModal.addEventListener('shown.bs.modal', () => {
myInput.focus()
})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 voor demo's en gebruiksrichtlijnen.
Voorbeelden
Modal-componenten
Hieronder staat een statisch modal-voorbeeld (dat wil zeggen dat de position en display overschreven zijn). Meegenomen zijn de modal-kop, de modal-body (verplicht voor padding) en de modal-voettekst (optioneel). We vragen je om waar mogelijk modal-koppen met sluitacties op te nemen, of anders een expliciete sluitactie te bieden.
<div class="modal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal-titel</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Sluiten"></button>
</div>
<div class="modal-body">
<p>Hier komt de tekst van de modal-body.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Sluiten</button>
<button type="button" class="btn btn-primary">Wijzigingen opslaan</button>
</div>
</div>
</div>
</div>In het statische voorbeeld hierboven gebruiken we <h5>, om problemen met de kophiërarchie op de documentatiepagina te voorkomen. Structureel gezien vormt een modal-dialoogvenster echter zijn eigen aparte document/context, dus zou de .modal-title idealiter een <h1> moeten zijn. Zo nodig kun je de lettergrootte-utilities gebruiken om het uiterlijk van de kop te bepalen. Alle volgende live voorbeelden gebruiken deze aanpak.
Live demo
Schakel een werkende modal-demo in door op de knop hieronder te klikken. Hij schuift omlaag en faadt in vanaf de bovenkant van de pagina.
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
Demo-modal openen
</button>
<!-- Modal -->
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Modal-titel</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Sluiten"></button>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Sluiten</button>
<button type="button" class="btn btn-primary">Wijzigingen opslaan</button>
</div>
</div>
</div>
</div>Statische backdrop
Wanneer de backdrop op static staat, sluit de modal niet wanneer je erbuiten klikt. Klik op de knop hieronder om het te proberen.
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#staticBackdrop">
Modal met statische backdrop openen
</button>
<!-- Modal -->
<div class="modal fade" id="staticBackdrop" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="staticBackdropLabel">Modal-titel</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Sluiten"></button>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Sluiten</button>
<button type="button" class="btn btn-primary">Begrepen</button>
</div>
</div>
</div>
</div>Lange content scrollen
Wanneer modals te lang worden voor de viewport of het apparaat van de gebruiker, scrollen ze los van de pagina zelf. Probeer de demo hieronder om te zien wat we bedoelen.
Je kunt ook een scrollbare modal maken waarin de modal-body scrollt, door .modal-dialog-scrollable aan .modal-dialog toe te voegen.
<!-- Scrollable modal -->
<div class="modal-dialog modal-dialog-scrollable">
...
</div>Verticaal gecentreerd
Voeg .modal-dialog-centered aan .modal-dialog toe om de modal verticaal te centreren.
<!-- Vertically centered modal -->
<div class="modal-dialog modal-dialog-centered">
...
</div>
<!-- Vertically centered scrollable modal -->
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
...
</div>Tooltips en popovers
Tooltips en popovers kunnen naar behoefte binnen modals worden geplaatst. Wanneer modals gesloten worden, worden eventuele tooltips en popovers erin automatisch ook gesloten.
<div class="modal-body">
<h2 class="fs-5">Popover in een modal</h2>
<p>Deze <a href="#" role="button" class="btn btn-secondary" data-bs-toggle="popover" title="Popover-titel" data-bs-content="De inhoud van de popover-body wordt in dit attribuut ingesteld.">knop</a> activeert bij klikken een popover.</p>
<hr>
<h2 class="fs-5">Tooltips in een modal</h2>
<p><a href="#" data-bs-toggle="tooltip" title="Tooltip">Deze link</a> en <a href="#" data-bs-toggle="tooltip" title="Tooltip">die link</a> hebben tooltips bij hover.</p>
</div>Het grid gebruiken
Gebruik het grid-systeem van Bootstrap binnen een modal door .container-fluid in de .modal-body te nesten. Gebruik daarna gewoon de normale grid-systeemklassen, net als elders.
<div class="modal-body">
<div class="container-fluid">
<div class="row">
<div class="col-md-4">.col-md-4</div>
<div class="col-md-4 ms-auto">.col-md-4 .ms-auto</div>
</div>
<div class="row">
<div class="col-md-3 ms-auto">.col-md-3 .ms-auto</div>
<div class="col-md-2 ms-auto">.col-md-2 .ms-auto</div>
</div>
<div class="row">
<div class="col-md-6 ms-auto">.col-md-6 .ms-auto</div>
</div>
<div class="row">
<div class="col-sm-9">
Niveau 1: .col-sm-9
<div class="row">
<div class="col-8 col-sm-6">
Niveau 2: .col-8 .col-sm-6
</div>
<div class="col-4 col-sm-6">
Niveau 2: .col-4 .col-sm-6
</div>
</div>
</div>
</div>
</div>
</div>Variërende modal-content
Heb je een reeks knoppen die allemaal dezelfde modal openen met licht afwijkende inhoud? Gebruik event.relatedTarget en HTML-data-bs-*-attributen om de inhoud van de modal te variëren op basis van welke knop er is aangeklikt.
Hieronder staat een live demo, gevolgd door voorbeeld-HTML en -JavaScript. Voor meer informatie: lees de documentatie over modal-gebeurtenissen voor details over relatedTarget.
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@mdo">Modal openen voor @mdo</button>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@fat">Modal openen voor @fat</button>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@getbootstrap">Modal openen voor @getbootstrap</button>
<div class="modal fade" id="exampleModal" tabindex="-1" aria-labelledby="exampleModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Nieuw bericht</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Sluiten"></button>
</div>
<div class="modal-body">
<form>
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Ontvanger:</label>
<input type="text" class="form-control" id="recipient-name">
</div>
<div class="mb-3">
<label for="message-text" class="col-form-label">Bericht:</label>
<textarea class="form-control" id="message-text"></textarea>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Sluiten</button>
<button type="button" class="btn btn-primary">Bericht versturen</button>
</div>
</div>
</div>
</div>const exampleModal = document.getElementById('exampleModal')
exampleModal.addEventListener('show.bs.modal', event => {
// Knop die de modal heeft geopend
const button = event.relatedTarget
// Haal informatie uit data-bs-*-attributen
const recipient = button.getAttribute('data-bs-whatever')
// Zo nodig kun je hier een AJAX-verzoek starten
// en het bijwerken in een callback doen.
//
// Werk de inhoud van de modal bij.
const modalTitle = exampleModal.querySelector('.modal-title')
const modalBodyInput = exampleModal.querySelector('.modal-body input')
modalTitle.textContent = `Nieuw bericht aan ${recipient}`
modalBodyInput.value = recipient
})Wisselen tussen modals
Wissel tussen meerdere modals met een slimme plaatsing van de attributen data-bs-target en data-bs-toggle. Zo kun je bijvoorbeeld vanuit een al geopende inlog-modal een modal voor wachtwoordherstel openen. Let op: meerdere modals kunnen niet tegelijk open zijn — deze methode wisselt simpelweg tussen twee losse modals.
<div class="modal fade" id="exampleModalToggle" aria-hidden="true" aria-labelledby="exampleModalToggleLabel" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalToggleLabel">Modal 1</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Sluiten"></button>
</div>
<div class="modal-body">
Toon met de knop hieronder een tweede modal en verberg deze.
</div>
<div class="modal-footer">
<button class="btn btn-primary" data-bs-target="#exampleModalToggle2" data-bs-toggle="modal">Tweede modal openen</button>
</div>
</div>
</div>
</div>
<div class="modal fade" id="exampleModalToggle2" aria-hidden="true" aria-labelledby="exampleModalToggleLabel2" tabindex="-1">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalToggleLabel2">Modal 2</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Sluiten"></button>
</div>
<div class="modal-body">
Verberg deze modal met de knop hieronder en toon de eerste.
</div>
<div class="modal-footer">
<button class="btn btn-primary" data-bs-target="#exampleModalToggle" data-bs-toggle="modal">Terug naar de eerste</button>
</div>
</div>
</div>
</div>
<a class="btn btn-primary" data-bs-toggle="modal" href="#exampleModalToggle" role="button">Eerste modal openen</a>Animatie wijzigen
De variabele $modal-fade-transform bepaalt de transform-status van .modal-dialog vóór de fade-in-animatie van de modal; de variabele $modal-show-transform bepaalt de transform van .modal-dialog aan het eind van de fade-in-animatie.
Wil je bijvoorbeeld een inzoom-animatie, dan kun je $modal-fade-transform: scale(.8) instellen.
Animatie verwijderen
Wil je modals die gewoon verschijnen in plaats van infaden, verwijder dan de klasse .fade uit je modal-markup.
<div class="modal" tabindex="-1" aria-labelledby="..." aria-hidden="true">
...
</div>Dynamische hoogtes
Verandert de hoogte van een modal terwijl die open is, roep dan myModal.handleUpdate() aan om de positie van de modal opnieuw af te stemmen, voor het geval er een scrollbalk verschijnt.
Toegankelijkheid
Voeg aria-labelledby="..." toe aan .modal, verwijzend naar de modal-titel. Daarnaast kun je met aria-describedby op .modal een beschrijving van je modal-dialoogvenster meegeven. Let op: je hoeft role="dialog" niet toe te voegen, omdat wij dat al via JavaScript doen.
YouTube-video's insluiten
Het insluiten van YouTube-video's in modals vereist extra JavaScript die niet in Bootstrap zit, om onder meer het afspelen automatisch te stoppen. Zie deze nuttige Stack Overflow-post voor meer informatie.
Optionele formaten
Modals hebben drie optionele formaten, beschikbaar via modifier-klassen die op een .modal-dialog geplaatst worden. Deze formaten treden bij bepaalde breakpoints in werking om horizontale scrollbalken op smallere viewports te voorkomen.
| Formaat | Klasse | Max-width van de modal |
|---|---|---|
| Small | .modal-sm |
300px |
| Standaard | Geen | 500px |
| Large | .modal-lg |
800px |
| Extra large | .modal-xl |
1140px |
Onze standaardmodal zonder modifier-klasse vormt het "medium" modal-formaat.
<div class="modal-dialog modal-xl">...</div>
<div class="modal-dialog modal-lg">...</div>
<div class="modal-dialog modal-sm">...</div>Schermvullende modal
Nog een override is de mogelijkheid om een modal te openen die de hele viewport van de gebruiker vult, beschikbaar via modifier-klassen die op een .modal-dialog geplaatst worden.
| Klasse | Beschikbaarheid |
|---|---|
.modal-fullscreen |
Altijd |
.modal-fullscreen-sm-down |
576px |
.modal-fullscreen-md-down |
768px |
.modal-fullscreen-lg-down |
992px |
.modal-fullscreen-xl-down |
1200px |
.modal-fullscreen-xxl-down |
1400px |
<!-- Full screen modal -->
<div class="modal-dialog modal-fullscreen-sm-down">
...
</div>CSS
Variabelen
Nieuw in v5.2.0
Als onderdeel van Bootstraps groeiende aanpak met CSS-variabelen gebruiken modals nu lokale CSS-variabelen op .modal en .modal-backdrop, 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/_modal.scss in de Bootstrap-broncode.
Standaardwaarden: zie scss/_modal.scss in de Bootstrap-broncode.
Sass-variabelen
Standaardwaarden: zie scss/_variables.scss in de Bootstrap-broncode.
Loop
Responsieve schermvullende modals worden gegenereerd via de $breakpoints-map en een loop in scss/_modal.scss.
Standaardwaarden: zie scss/_modal.scss in de Bootstrap-broncode.
Gebruik
De modal-plugin schakelt je verborgen content op aanvraag, via data-attributen of JavaScript. Hij overschrijft ook het standaard scrollgedrag en genereert een .modal-backdrop als klikgebied om getoonde modals te sluiten wanneer je buiten de modal klikt.
Via data-attributen
Schakelen
Activeer een modal zonder JavaScript te schrijven. Zet data-bs-toggle="modal" op een bedieningselement, zoals een knop, samen met een data-bs-target="#foo" of href="#foo" om een specifieke modal te schakelen.
<button type="button" data-bs-toggle="modal" data-bs-target="#myModal">Modal openen</button>Sluiten
Klik-om-te-sluiten werkt automatisch via de dismiss data-API, zonder dat je zelf JavaScript hoeft te initialiseren. Gebruik het attribuut data-bs-dismiss="modal" op een knop binnen het component om het te sluiten.
Hoewel beide manieren om een modal te sluiten worden ondersteund, moet je bedenken dat sluiten van buiten een modal niet overeenkomt met het dialog- (modal-)patroon van de ARIA Authoring Practices Guide. Doe dit op eigen risico.
Via JavaScript
Maak een modal met één regel JavaScript:
const myModal = new bootstrap.Modal(document.getElementById('myModal'), options)
// of
const myModalAlternative = new bootstrap.Modal('#myModal', options)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.
| Naam | Type | Standaard | Omschrijving |
|---|---|---|---|
backdrop |
boolean, 'static' |
true |
Voegt een modal-backdrop-element toe. Of geef static op voor een backdrop die de modal bij klikken niet sluit. |
focus |
boolean | true |
Zet de focus bij initialisatie op de modal. |
keyboard |
boolean | true |
Sluit de modal wanneer op de Escape-toets wordt gedrukt. |
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.
Opties meegeven
Activeert je content als modal. Accepteert een optioneel options-object.
const myModal = new bootstrap.Modal('#myModal', {
keyboard: false
})| Methode | Omschrijving |
|---|---|
dispose |
Vernietigt de modal van een element. (Verwijdert opgeslagen gegevens van het DOM-element) |
getInstance |
Statische methode waarmee je de modal-instantie kunt ophalen die bij een DOM-element hoort. |
getOrCreateInstance |
Statische methode waarmee je de modal-instantie kunt ophalen die bij een DOM-element hoort, of een nieuwe kunt aanmaken als die nog niet was geïnitialiseerd. |
handleUpdate |
Stemt de positie van de modal handmatig opnieuw af als de hoogte van een modal verandert terwijl die open is (bijv. als er een scrollbalk verschijnt). |
hide |
Verbergt een modal handmatig. Keert terug naar de aanroeper voordat de modal daadwerkelijk verborgen is (dus vóór de gebeurtenis hidden.bs.modal). |
show |
Opent een modal handmatig. Keert terug naar de aanroeper voordat de modal daadwerkelijk getoond is (dus vóór de gebeurtenis shown.bs.modal). Je kunt ook een DOM-element als argument meegeven dat in de modal-gebeurtenissen ontvangen kan worden (als de eigenschap relatedTarget). (Bijv. const modalToggle = document.getElementById('toggleMyModal'); myModal.show(modalToggle).) |
toggle |
Schakelt een modal handmatig. Keert terug naar de aanroeper voordat de modal daadwerkelijk getoond of verborgen is (dus vóór de gebeurtenis shown.bs.modal of hidden.bs.modal). |
Gebeurtenissen
De modal-klasse van Bootstrap stelt een aantal gebeurtenissen beschikbaar om op de modal-functionaliteit in te haken. Alle modal-gebeurtenissen worden op de modal zelf afgevuurd (dus op de <div class="modal">).
| Gebeurtenis | Omschrijving |
|---|---|
hide.bs.modal |
Deze gebeurtenis wordt direct afgevuurd wanneer de instantiemethode hide is aangeroepen. |
hidden.bs.modal |
Deze gebeurtenis wordt afgevuurd wanneer de modal volledig voor de gebruiker verborgen is (wacht tot de CSS-transities voltooid zijn). |
hidePrevented.bs.modal |
Deze gebeurtenis wordt afgevuurd wanneer de modal getoond wordt, zijn backdrop static is en er buiten de modal wordt geklikt. De gebeurtenis wordt ook afgevuurd wanneer op de Escape-toets wordt gedrukt terwijl de optie keyboard op false staat. |
show.bs.modal |
Deze gebeurtenis wordt direct afgevuurd wanneer de instantiemethode show wordt aangeroepen. Wordt die door een klik veroorzaakt, dan is het aangeklikte element beschikbaar als de eigenschap relatedTarget van de gebeurtenis. |
shown.bs.modal |
Deze gebeurtenis wordt afgevuurd wanneer de modal zichtbaar is gemaakt voor de gebruiker (wacht tot de CSS-transities voltooid zijn). Wordt die door een klik veroorzaakt, dan is het aangeklikte element beschikbaar als de eigenschap relatedTarget van de gebeurtenis. |
const myModalEl = document.getElementById('myModal')
myModalEl.addEventListener('hidden.bs.modal', event => {
// doe iets...
})