Modal
Brug Bootstraps JavaScript modal plugin til at tilføje dialogbokse til dit websted til lysbokse, brugermeddelelser eller helt tilpasset indhold.
Hvordan det virker
Før du går i gang med Bootstraps modale komponent, skal du sørge for at læse følgende, da vores menuindstillinger for nylig er ændret.
- Modaler er bygget med HTML, CSS og JavaScript. De er placeret over alt andet i dokumentet og fjerner rulle fra dokumentet,
<body>
så modalt indhold ruller i stedet. - Ved at klikke på den modale "baggrund" lukkes modalen automatisk.
- Bootstrap understøtter kun ét modalt vindue ad gangen. Indlejrede modaler understøttes ikke, da vi mener, at de er dårlige brugeroplevelser.
- Modaler bruger
position: fixed
, som nogle gange kan være lidt speciel med hensyn til gengivelsen. Når det er muligt, skal du placere din modale HTML på øverste niveau for at undgå potentiel interferens fra andre elementer. Du vil sandsynligvis løbe ind i problemer, når du indlejrer en.modal
i et andet fast element. - Endnu en gang, grundet
position: fixed
, er der nogle forbehold med at bruge modaler på mobile enheder. Se vores browsersupportdokumenter for detaljer. - På grund af hvordan HTML5 definerer sin semantik, har
autofocus
HTML-attributten ingen effekt i Bootstrap-modaler. For at opnå den samme effekt skal du bruge noget tilpasset JavaScript:
const myModal = document.getElementById('myModal')
const myInput = document.getElementById('myInput')
myModal.addEventListener('shown.bs.modal', () => {
myInput.focus()
})
prefers-reduced-motion
medieforespørgslen. Se afsnittet om
reduceret bevægelse i vores tilgængelighedsdokumentation .
Fortsæt med at læse for demoer og retningslinjer for brug.
Eksempler
Modale komponenter
Nedenfor er et statisk modalt eksempel (hvilket betyder, at det er position
og display
er blevet tilsidesat). Inkluderet er modal sidehoved, modal tekst (påkrævet for padding
) og modal sidefod (valgfrit). Vi beder dig om at inkludere modale overskrifter med afvisningshandlinger, når det er muligt, eller angive en anden eksplicit afvisningshandling.
<div class="modal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Modal body text goes here.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
Live demo
Skift en fungerende modal demo ved at klikke på knappen nedenfor. Det vil glide ned og fade ind fra toppen af siden.
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal">
Launch demo modal
</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">
<h5 class="modal-title" id="exampleModalLabel">Modal title</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
Statisk baggrund
Når baggrund er indstillet til statisk, lukker modalen ikke, når der klikkes uden for den. Klik på knappen nedenfor for at prøve det.
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#staticBackdrop">
Launch static backdrop modal
</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">
<h5 class="modal-title" id="staticBackdropLabel">Modal title</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
...
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Understood</button>
</div>
</div>
</div>
</div>
Rulle langt indhold
Når modalerne bliver for lange til brugerens viewport eller enhed, ruller de uafhængigt af selve siden. Prøv demoen nedenfor for at se, hvad vi mener.
Du kan også oprette en scrollbar modal, der tillader scroll modal body ved at tilføje .modal-dialog-scrollable
til .modal-dialog
.
<!-- Scrollable modal -->
<div class="modal-dialog modal-dialog-scrollable">
...
</div>
Lodret centreret
Tilføj .modal-dialog-centered
til .modal-dialog
for at centrere modalen lodret.
<!-- 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>
Værktøjstip og popovers
Værktøjstip og popovers kan placeres i modaler efter behov. Når modalerne er lukket, afvises alle værktøjstip og popovers indeni også automatisk.
<div class="modal-body">
<h5>Popover in a modal</h5>
<p>This <a href="#" role="button" class="btn btn-secondary" data-bs-toggle="popover" title="Popover title" data-bs-content="Popover body content is set in this attribute.">button</a> triggers a popover on click.</p>
<hr>
<h5>Tooltips in a modal</h5>
<p><a href="#" data-bs-toggle="tooltip" title="Tooltip">This link</a> and <a href="#" data-bs-toggle="tooltip" title="Tooltip">that link</a> have tooltips on hover.</p>
</div>
Brug af gitteret
Udnyt Bootstrap-gittersystemet i en modal ved at indlejre .container-fluid
i .modal-body
. Brug derefter de normale netsystemklasser, som du ville andre steder.
<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">
Level 1: .col-sm-9
<div class="row">
<div class="col-8 col-sm-6">
Level 2: .col-8 .col-sm-6
</div>
<div class="col-4 col-sm-6">
Level 2: .col-4 .col-sm-6
</div>
</div>
</div>
</div>
</div>
</div>
Varierende modalt indhold
Har du en masse knapper, der alle udløser den samme modal med lidt forskelligt indhold? Brug event.relatedTarget
og HTML- data-bs-*
attributter til at variere indholdet af modalen afhængigt af hvilken knap der blev klikket på.
Nedenfor er en live demo efterfulgt af eksempel HTML og JavaScript. For mere information, læs dokumentet om modale begivenheder for detaljer om relatedTarget
.
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@mdo">Open modal for @mdo</button>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@fat">Open modal for @fat</button>
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#exampleModal" data-bs-whatever="@getbootstrap">Open modal for @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">
<h5 class="modal-title" id="exampleModalLabel">New message</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form>
<div class="mb-3">
<label for="recipient-name" class="col-form-label">Recipient:</label>
<input type="text" class="form-control" id="recipient-name">
</div>
<div class="mb-3">
<label for="message-text" class="col-form-label">Message:</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">Close</button>
<button type="button" class="btn btn-primary">Send message</button>
</div>
</div>
</div>
</div>
const exampleModal = document.getElementById('exampleModal')
exampleModal.addEventListener('show.bs.modal', event => {
// Button that triggered the modal
const button = event.relatedTarget
// Extract info from data-bs-* attributes
const recipient = button.getAttribute('data-bs-whatever')
// If necessary, you could initiate an AJAX request here
// and then do the updating in a callback.
//
// Update the modal's content.
const modalTitle = exampleModal.querySelector('.modal-title')
const modalBodyInput = exampleModal.querySelector('.modal-body input')
modalTitle.textContent = `New message to ${recipient}`
modalBodyInput.value = recipient
})
Skift mellem modaler
Skift mellem flere modaler med en smart placering af attributterne data-bs-target
og . data-bs-toggle
For eksempel kan du skifte en modal til nulstilling af adgangskode fra en allerede åben login-modal. Bemærk venligst, at flere modaler ikke kan være åbne på samme tid - denne metode skifter blot mellem to separate modaler.
<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">
<h5 class="modal-title" id="exampleModalToggleLabel">Modal 1</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Show a second modal and hide this one with the button below.
</div>
<div class="modal-footer">
<button class="btn btn-primary" data-bs-target="#exampleModalToggle2" data-bs-toggle="modal">Open second modal</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">
<h5 class="modal-title" id="exampleModalToggleLabel2">Modal 2</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
Hide this modal and show the first with the button below.
</div>
<div class="modal-footer">
<button class="btn btn-primary" data-bs-target="#exampleModalToggle" data-bs-toggle="modal">Back to first</button>
</div>
</div>
</div>
</div>
<a class="btn btn-primary" data-bs-toggle="modal" href="#exampleModalToggle" role="button">Open first modal</a>
Skift animation
$modal-fade-transform
Variablen bestemmer transformationstilstanden før den .modal-dialog
modale fade-in-animation, $modal-show-transform
variablen bestemmer transformationen af .modal-dialog
i slutningen af den modale fade-in-animation.
Ønsker du f.eks. en zoom-ind-animation, kan du indstille $modal-fade-transform: scale(.8)
.
Fjern animation
For modaler, der blot vises i stedet for at falme ind for at se, skal du fjerne .fade
klassen fra din modale markup.
<div class="modal" tabindex="-1" aria-labelledby="..." aria-hidden="true">
...
</div>
Dynamiske højder
Hvis højden på en modal ændres, mens den er åben, skal du ringe myModal.handleUpdate()
for at justere modalens position, hvis der vises en rullepanel.
Tilgængelighed
Sørg for at tilføje aria-labelledby="..."
, med henvisning til den modale titel, til .modal
. Derudover kan du give en beskrivelse af din modale dialog med aria-describedby
på .modal
. Bemærk, at du ikke behøver at tilføje, role="dialog"
da vi allerede tilføjer det via JavaScript.
Indlejring af YouTube-videoer
Indlejring af YouTube-videoer i modaler kræver yderligere JavaScript, der ikke er i Bootstrap for automatisk at stoppe afspilning og mere. Se dette nyttige Stack Overflow-indlæg for mere information.
Valgfri størrelser
Modaler har tre valgfrie størrelser, tilgængelige via modifikationsklasser til at blive placeret på en .modal-dialog
. Disse størrelser slår ind ved bestemte brudpunkter for at undgå vandrette rullebjælker på smallere visningsporte.
Størrelse | Klasse | Modal max-bredde |
---|---|---|
Lille | .modal-sm |
300px |
Standard | Ingen | 500px |
Stor | .modal-lg |
800px |
Ekstra stor | .modal-xl |
1140px |
Vores standard modal uden modifikator klasse udgør "medium" størrelse modal.
<div class="modal-dialog modal-xl">...</div>
<div class="modal-dialog modal-lg">...</div>
<div class="modal-dialog modal-sm">...</div>
Modal i fuld skærm
En anden tilsidesættelse er muligheden for at poppe en modal op, der dækker brugervisningsporten, tilgængelig via modifikatorklasser, der er placeret på en .modal-dialog
.
Klasse | Tilgængelighed | |
---|---|---|
.modal-fullscreen |
Altid | |
.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
Variabler
Tilføjet i v5.2.0Som en del af Bootstraps udviklende CSS-variabletilgang bruger modaler nu lokale CSS-variabler på .modal
og .modal-backdrop
til forbedret realtidstilpasning. Værdier for CSS-variablerne indstilles via Sass, så Sass-tilpasning understøttes også stadig.
--#{$prefix}modal-zindex: #{$zindex-modal};
--#{$prefix}modal-width: #{$modal-md};
--#{$prefix}modal-padding: #{$modal-inner-padding};
--#{$prefix}modal-margin: #{$modal-dialog-margin};
--#{$prefix}modal-color: #{$modal-content-color};
--#{$prefix}modal-bg: #{$modal-content-bg};
--#{$prefix}modal-border-color: #{$modal-content-border-color};
--#{$prefix}modal-border-width: #{$modal-content-border-width};
--#{$prefix}modal-border-radius: #{$modal-content-border-radius};
--#{$prefix}modal-box-shadow: #{$modal-content-box-shadow-xs};
--#{$prefix}modal-inner-border-radius: #{$modal-content-inner-border-radius};
--#{$prefix}modal-header-padding-x: #{$modal-header-padding-x};
--#{$prefix}modal-header-padding-y: #{$modal-header-padding-y};
--#{$prefix}modal-header-padding: #{$modal-header-padding}; // Todo in v6: Split this padding into x and y
--#{$prefix}modal-header-border-color: #{$modal-header-border-color};
--#{$prefix}modal-header-border-width: #{$modal-header-border-width};
--#{$prefix}modal-title-line-height: #{$modal-title-line-height};
--#{$prefix}modal-footer-gap: #{$modal-footer-margin-between};
--#{$prefix}modal-footer-bg: #{$modal-footer-bg};
--#{$prefix}modal-footer-border-color: #{$modal-footer-border-color};
--#{$prefix}modal-footer-border-width: #{$modal-footer-border-width};
--#{$prefix}backdrop-zindex: #{$zindex-modal-backdrop};
--#{$prefix}backdrop-bg: #{$modal-backdrop-bg};
--#{$prefix}backdrop-opacity: #{$modal-backdrop-opacity};
Sass variable
$modal-inner-padding: $spacer;
$modal-footer-margin-between: .5rem;
$modal-dialog-margin: .5rem;
$modal-dialog-margin-y-sm-up: 1.75rem;
$modal-title-line-height: $line-height-base;
$modal-content-color: null;
$modal-content-bg: $white;
$modal-content-border-color: var(--#{$prefix}border-color-translucent);
$modal-content-border-width: $border-width;
$modal-content-border-radius: $border-radius-lg;
$modal-content-inner-border-radius: subtract($modal-content-border-radius, $modal-content-border-width);
$modal-content-box-shadow-xs: $box-shadow-sm;
$modal-content-box-shadow-sm-up: $box-shadow;
$modal-backdrop-bg: $black;
$modal-backdrop-opacity: .5;
$modal-header-border-color: var(--#{$prefix}border-color);
$modal-header-border-width: $modal-content-border-width;
$modal-header-padding-y: $modal-inner-padding;
$modal-header-padding-x: $modal-inner-padding;
$modal-header-padding: $modal-header-padding-y $modal-header-padding-x; // Keep this for backwards compatibility
$modal-footer-bg: null;
$modal-footer-border-color: $modal-header-border-color;
$modal-footer-border-width: $modal-header-border-width;
$modal-sm: 300px;
$modal-md: 500px;
$modal-lg: 800px;
$modal-xl: 1140px;
$modal-fade-transform: translate(0, -50px);
$modal-show-transform: none;
$modal-transition: transform .3s ease-out;
$modal-scale-transform: scale(1.02);
Løkke
Responsive modals i fuld skærm genereres via $breakpoints
kortet og en loop in scss/_modal.scss
.
@each $breakpoint in map-keys($grid-breakpoints) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
$postfix: if($infix != "", $infix + "-down", "");
@include media-breakpoint-down($breakpoint) {
.modal-fullscreen#{$postfix} {
width: 100vw;
max-width: none;
height: 100%;
margin: 0;
.modal-content {
height: 100%;
border: 0;
@include border-radius(0);
}
.modal-header,
.modal-footer {
@include border-radius(0);
}
.modal-body {
overflow-y: auto;
}
}
}
}
Brug
Det modale plugin skifter dit skjulte indhold efter behov via dataattributter eller JavaScript. Det tilsidesætter også standard rulleadfærd og genererer et .modal-backdrop
klikområde til at afvise viste modaler, når der klikkes uden for modalen.
Via dataattributter
Skift
Aktiver en modal uden at skrive JavaScript. Indstil data-bs-toggle="modal"
på et controller-element, som en knap, sammen med et data-bs-target="#foo"
eller href="#foo"
for at målrette en bestemt modal til at skifte.
<button type="button" data-bs-toggle="modal" data-bs-target="#myModal">Launch modal</button>
Afskedige
Afskedigelse kan opnås med data
attributten på en knap inden for modalen som vist nedenfor:
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
eller på en knap uden for modalen ved hjælp af data-bs-target
som vist nedenfor:
<button type="button" class="btn-close" data-bs-dismiss="modal" data-bs-target="#my-modal" aria-label="Close"></button>
Via JavaScript
Opret en modal med en enkelt linje JavaScript:
const myModal = new bootstrap.Modal(document.getElementById('myModal'), options)
// or
const myModalAlternative = new bootstrap.Modal('#myModal', options)
Muligheder
Da muligheder kan videregives via dataattributter eller JavaScript, kan du tilføje et indstillingsnavn til data-bs-
, som i data-bs-animation="{value}"
. Sørg for at ændre sagstypen for indstillingsnavnet fra " camelCase " til " kebab-case ", når du videregiver mulighederne via dataattributter. Brug for eksempel i data-bs-custom-class="beautifier"
stedet for data-bs-customClass="beautifier"
.
Fra Bootstrap 5.2.0 understøtter alle komponenter en eksperimentel reserveret dataattribut data-bs-config
, der kan rumme simpel komponentkonfiguration som en JSON-streng. Når et element har data-bs-config='{"delay":0, "title":123}'
og data-bs-title="456"
attributter, vil den endelige title
værdi være, 456
og de separate dataattributter vil tilsidesætte værdier givet på data-bs-config
. Derudover er eksisterende dataattributter i stand til at rumme JSON-værdier som data-bs-delay='{"show":0,"hide":150}'
.
Navn | Type | Standard | Beskrivelse |
---|---|---|---|
backdrop |
boolsk,'static' |
true |
Indeholder et modal-baggrundselement. Alternativt kan du angive static en baggrund, som ikke lukker modalen, når der klikkes på den. |
focus |
boolesk | true |
Sætter fokus på modalen, når den initialiseres. |
keyboard |
boolesk | true |
Lukker modalen, når der trykkes på escape-tasten. |
Metoder
Asynkrone metoder og overgange
Alle API - metoder er asynkrone og starter en overgang . De vender tilbage til den, der ringer, så snart overgangen er startet, men før den slutter . Derudover vil et metodekald på en overgangskomponent blive ignoreret .
Beståelsesmuligheder
Aktiverer dit indhold som en modal. Accepterer en valgfri indstilling object
.
const myModal = new bootstrap.Modal('#myModal', {
keyboard: false
})
Metode | Beskrivelse |
---|---|
dispose |
Ødelægger et elements modal. (Fjerner lagrede data på DOM-elementet) |
getInstance |
Statisk metode, som giver dig mulighed for at få den modale instans forbundet med et DOM-element. |
getOrCreateInstance |
Statisk metode, som giver dig mulighed for at få den modale instans tilknyttet et DOM-element, eller oprette en ny, hvis den ikke blev initialiseret. |
handleUpdate |
Juster manuelt modalens position, hvis højden af en modal ændres, mens den er åben (dvs. hvis der vises en rullebjælke). |
hide |
Skjuler manuelt en modal. Vender tilbage til den, der ringer, før modalen rent faktisk er blevet skjult (dvs. før hidden.bs.modal hændelsen indtræffer). |
show |
Åbner manuelt en modal. Vender tilbage til den, der ringer, før modalen faktisk er blevet vist (dvs. før shown.bs.modal hændelsen indtræffer). Du kan også sende et DOM-element som et argument, der kan modtages i de modale hændelser (som relatedTarget egenskaben). const modalToggle = document.getElementById('toggleMyModal'); myModal.show(modalToggle) ( dvs. |
toggle |
Skifter manuelt en modal. Vender tilbage til den, der ringer, før modalen faktisk er blevet vist eller skjult (dvs. før hændelsen shown.bs.modal eller hidden.bs.modal indtræffer). |
Begivenheder
Bootstraps modal-klasse afslører nogle få hændelser for tilslutning til modal funktionalitet. Alle modale hændelser skydes mod selve modalen (dvs. på <div class="modal">
).
Begivenhed | Beskrivelse |
---|---|
hide.bs.modal |
Denne hændelse udløses straks, når hide instansmetoden er blevet kaldt. |
hidden.bs.modal |
Denne hændelse udløses, når modalen er færdig med at blive skjult for brugeren (vil vente på, at CSS-overgange er fuldført). |
hidePrevented.bs.modal |
Denne hændelse udløses, når modalen vises, dens baggrund er, static og der udføres et klik uden for modalen. Hændelsen udløses også, når der trykkes på escape-tasten, og keyboard indstillingen er indstillet til false . |
show.bs.modal |
Denne hændelse udløses med det samme, når show instansmetoden kaldes. Hvis det er forårsaget af et klik, er det klikkede element tilgængeligt som relatedTarget hændelsens egenskab. |
shown.bs.modal |
Denne hændelse udløses, når modalen er gjort synlig for brugeren (vil vente på, at CSS-overgange er fuldført). Hvis det er forårsaget af et klik, er det klikkede element tilgængeligt som relatedTarget hændelsens egenskab. |
const myModalEl = document.getElementById('myModal')
myModalEl.addEventListener('hidden.bs.modal', event => {
// do something...
})