Modal
Bruk Bootstraps JavaScript modal-plugin for å legge til dialogbokser på nettstedet ditt for lysbokser, brukervarsler eller helt tilpasset innhold.
Hvordan det fungerer
Før du begynner med Bootstraps modale komponent, sørg for å lese følgende siden menyalternativene våre nylig har endret seg.
- Modaler er bygget med HTML, CSS og JavaScript. De er plassert over alt annet i dokumentet og fjerner rulling fra
<body>
slik at modalt innhold ruller i stedet. - Ved å klikke på det modale "bakteppet" lukkes modalen automatisk.
- Bootstrap støtter bare ett modalt vindu om gangen. Nestede modaler støttes ikke da vi mener de er dårlige brukeropplevelser.
- Modaler bruker
position: fixed
, som noen ganger kan være litt spesielt med tanke på gjengivelsen. Når det er mulig, plasser din modale HTML på toppnivå for å unngå potensiell interferens fra andre elementer. Du vil sannsynligvis støte på problemer når du legger et.modal
i et annet fast element. - Nok en gang, på grunn av
position: fixed
, er det noen forbehold med bruk av modaler på mobile enheter. Se våre nettleserstøttedokumenter for detaljer. - På grunn av hvordan HTML5 definerer sin semantikk, har
autofocus
HTML-attributtet ingen effekt i Bootstrap-modaler. For å oppnå samme effekt, bruk litt tilpasset JavaScript:
const myModal = document.getElementById('myModal')
const myInput = document.getElementById('myInput')
myModal.addEventListener('shown.bs.modal', () => {
myInput.focus()
})
prefers-reduced-motion
mediesøket. Se delen
for redusert bevegelse i tilgjengelighetsdokumentasjonen vår .
Fortsett å lese for demoer og retningslinjer for bruk.
Eksempler
Modale komponenter
Nedenfor er et statisk modalt eksempel (som betyr at det er position
og display
har blitt overstyrt). Inkludert er modal topptekst, modal hovedtekst (påkrevd for padding
) og modal bunntekst (valgfritt). Vi ber om at du inkluderer modale overskrifter med avvisningshandlinger når det er mulig, eller oppgir en annen eksplisitt avvisningshandling.
<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
Bytt en fungerende modal demo ved å klikke på knappen nedenfor. Den vil gli ned og tone inn fra toppen av 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 bakteppe
Når bakteppet er satt til statisk, lukkes ikke modalen når du klikker utenfor den. Klikk på knappen nedenfor for å 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>
Ruller langt innhold
Når modaler blir for lange for brukerens visningsport eller enhet, ruller de uavhengig av selve siden. Prøv demoen nedenfor for å se hva vi mener.
Du kan også lage en rullbar modal som gjør det mulig å rulle den modale kroppen ved å legge .modal-dialog-scrollable
til .modal-dialog
.
<!-- Scrollable modal -->
<div class="modal-dialog modal-dialog-scrollable">
...
</div>
Vertikalt sentrert
Legg .modal-dialog-centered
til .modal-dialog
for å sentrere modalen vertikalt.
<!-- 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>
Verktøytips og popovers
Verktøytips og popovers kan plasseres i modaler etter behov. Når modaler er lukket, blir alle verktøytips og popovers innenfor også automatisk avvist.
<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>
Bruke rutenettet
Bruk Bootstrap-rutenettsystemet i en modal ved å hekke .container-fluid
i .modal-body
. Bruk deretter de vanlige rutenettsystemklassene 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 innhold
Har du en haug med knapper som alle utløser samme modal med litt forskjellig innhold? Bruk event.relatedTarget
og HTML - data-bs-*
attributter for å variere innholdet i modalen avhengig av hvilken knapp som ble klikket på.
Nedenfor er en live demo etterfulgt av eksempel HTML og JavaScript. For mer informasjon, les dokumentene for modale hendelser 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
})
Veksle mellom modaler
Veksle mellom flere modaler med en smart plassering av attributtene data-bs-target
og . data-bs-toggle
Du kan for eksempel bytte en modal for tilbakestilling av passord fra en allerede åpen påloggingsmodal. Vær oppmerksom på at flere modaler ikke kan være åpne samtidig - denne metoden veksler ganske enkelt mellom 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>
Endre animasjon
$modal-fade-transform
Variabelen bestemmer transformasjonstilstanden før den .modal-dialog
modale inntoningsanimasjonen, $modal-show-transform
variabelen bestemmer transformasjonen av .modal-dialog
på slutten av den modale inntoningsanimasjonen.
Ønsker du for eksempel en zoom-inn-animasjon, kan du stille inn $modal-fade-transform: scale(.8)
.
Fjern animasjon
For modaler som ganske enkelt vises i stedet for å fortone seg, fjern .fade
klassen fra din modale markering.
<div class="modal" tabindex="-1" aria-labelledby="..." aria-hidden="true">
...
</div>
Dynamiske høyder
Hvis høyden på en modal endres mens den er åpen, bør du ringe myModal.handleUpdate()
for å justere modalens posisjon i tilfelle en rullefelt vises.
tilgjengelighet
Sørg for å legge til aria-labelledby="..."
, med referanse til den modale tittelen, til .modal
. I tillegg kan du gi en beskrivelse av din modale dialog med aria-describedby
på .modal
. Merk at du ikke trenger å legge til role="dialog"
siden vi allerede legger det til via JavaScript.
Innbygging av YouTube-videoer
Innbygging av YouTube-videoer i modaler krever ekstra JavaScript som ikke er i Bootstrap for automatisk å stoppe avspillingen og mer. Se dette nyttige Stack Overflow-innlegget for mer informasjon.
Valgfrie størrelser
Modaler har tre valgfrie størrelser, tilgjengelige via modifikasjonsklasser for å plasseres på en .modal-dialog
. Disse størrelsene slår inn ved visse bruddpunkter for å unngå horisontale rullefelt på smalere visningsporter.
Størrelse | Klasse | Modal maks-bredde |
---|---|---|
Liten | .modal-sm |
300px |
Misligholde | Ingen | 500px |
Stor | .modal-lg |
800px |
Ekstra stor | .modal-xl |
1140px |
Vår standard modal uten modifiseringsklasse utgjør "middels" størrelse modal.
<div class="modal-dialog modal-xl">...</div>
<div class="modal-dialog modal-lg">...</div>
<div class="modal-dialog modal-sm">...</div>
Fullskjerm Modal
En annen overstyring er muligheten til å åpne en modal som dekker brukervisningsporten, tilgjengelig via modifikatorklasser som er plassert på en .modal-dialog
.
Klasse | Tilgjengelighet | |
---|---|---|
.modal-fullscreen |
Bestandig | |
.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
Lagt til i v5.2.0Som en del av Bootstraps utviklende CSS-variabletilnærming, bruker modaler nå lokale CSS-variabler på .modal
og .modal-backdrop
for forbedret sanntidstilpasning. Verdier for CSS-variablene settes via Sass, så Sass-tilpasning støttes fortsatt også.
--#{$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 variabler
$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 fullskjerm-modaler genereres via $breakpoints
kartet 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;
}
}
}
}
Bruk
Modal-pluginen veksler mellom det skjulte innholdet ditt på forespørsel, via dataattributter eller JavaScript. Den overstyrer også standard rulleadferd og genererer et .modal-backdrop
klikkområde for å avvise viste modaler når du klikker utenfor modalen.
Via dataattributter
Veksle
Aktiver en modal uten å skrive JavaScript. Sett data-bs-toggle="modal"
på et kontrollerelement, som en knapp, sammen med en data-bs-target="#foo"
eller href="#foo"
for å målrette en bestemt modal for å veksle.
<button type="button" data-bs-toggle="modal" data-bs-target="#myModal">Launch modal</button>
Avskjedige
Avvisning kan oppnås med data
attributtet på en knapp i modalen som vist nedenfor:
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
eller på en knapp utenfor modalen ved å bruke 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
Lag en modal med en enkelt linje med JavaScript:
const myModal = new bootstrap.Modal(document.getElementById('myModal'), options)
// or
const myModalAlternative = new bootstrap.Modal('#myModal', options)
Alternativer
Siden alternativer kan sendes via dataattributter eller JavaScript, kan du legge til et alternativnavn til data-bs-
, som i data-bs-animation="{value}"
. Sørg for å endre sakstypen for alternativnavnet fra " camelCase " til " kebab-case " når du sender alternativene via dataattributter. Bruk for eksempel i data-bs-custom-class="beautifier"
stedet for data-bs-customClass="beautifier"
.
Fra Bootstrap 5.2.0 støtter alle komponenter et eksperimentelt reservert dataattributt data-bs-config
som kan inneholde enkel komponentkonfigurasjon 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
verdien være 456
og de separate dataattributtene vil overstyre verdier gitt på data-bs-config
. I tillegg kan eksisterende dataattributter inneholde JSON-verdier som data-bs-delay='{"show":0,"hide":150}'
.
Navn | Type | Misligholde | Beskrivelse |
---|---|---|---|
backdrop |
boolsk,'static' |
true |
Inkluderer et modalt bakteppeelement. Alternativt kan du spesifisere static for et bakteppe som ikke lukker modalen når du klikker. |
focus |
boolsk | true |
Setter fokus på modalen når den initialiseres. |
keyboard |
boolsk | true |
Lukker modalen når escape-tasten trykkes. |
Metoder
Asynkrone metoder og overganger
Alle API-metoder er asynkrone og starter en overgang . De går tilbake til den som ringer så snart overgangen er startet, men før den avsluttes . I tillegg vil et metodekall på en overgangskomponent bli ignorert .
Bestått alternativer
Aktiverer innholdet ditt som en modal. Godtar et valgfritt alternativ object
.
const myModal = new bootstrap.Modal('#myModal', {
keyboard: false
})
Metode | Beskrivelse |
---|---|
dispose |
Ødelegger et elements modal. (Fjerner lagrede data på DOM-elementet) |
getInstance |
Statisk metode som lar deg få den modale forekomsten assosiert med et DOM-element. |
getOrCreateInstance |
Statisk metode som lar deg få den modale forekomsten assosiert med et DOM-element, eller opprette en ny i tilfelle den ikke ble initialisert. |
handleUpdate |
Juster modalens posisjon manuelt hvis høyden på en modal endres mens den er åpen (dvs. i tilfelle en rullefelt vises). |
hide |
Skjuler en modal manuelt. Går tilbake til den som ringer før modalen faktisk har blitt skjult (dvs. før hidden.bs.modal hendelsen inntreffer). |
show |
Åpner en modal manuelt. Går tilbake til den som ringer før modalen faktisk har blitt vist (dvs. før shown.bs.modal hendelsen inntreffer). Du kan også sende et DOM-element som et argument som kan mottas i de modale hendelsene (som relatedTarget egenskapen). const modalToggle = document.getElementById('toggleMyModal'); myModal.show(modalToggle) ( dvs. |
toggle |
Bytter en modal manuelt. Går tilbake til den som ringer før modalen faktisk har blitt vist eller skjult (dvs. før hendelsen shown.bs.modal eller hidden.bs.modal inntreffer). |
arrangementer
Bootstraps modalklasse avslører noen få hendelser for å koble til modal funksjonalitet. Alle modale hendelser skytes mot selve modalen (dvs. på <div class="modal">
).
Begivenhet | Beskrivelse |
---|---|
hide.bs.modal |
Denne hendelsen utløses umiddelbart når hide instansmetoden er kalt. |
hidden.bs.modal |
Denne hendelsen utløses når modalen er ferdig skjult for brukeren (vil vente på at CSS-overganger er fullført). |
hidePrevented.bs.modal |
Denne hendelsen utløses når modalen vises, dens bakteppe er static og et klikk utenfor modalen utføres. Hendelsen utløses også når escape-tasten trykkes og keyboard alternativet er satt til false . |
show.bs.modal |
Denne hendelsen utløses umiddelbart når show instansmetoden kalles. Hvis det er forårsaket av et klikk, er det klikkede elementet tilgjengelig som relatedTarget egenskapen til hendelsen. |
shown.bs.modal |
Denne hendelsen utløses når modalen er gjort synlig for brukeren (vil vente til CSS-overganger er fullført). Hvis det er forårsaket av et klikk, er det klikkede elementet tilgjengelig som relatedTarget egenskapen til hendelsen. |
const myModalEl = document.getElementById('myModal')
myModalEl.addEventListener('hidden.bs.modal', event => {
// do something...
})