Hoppa till huvudinnehållet Hoppa till dokumentnavigering
Check

Använd Bootstraps JavaScript modala plugin för att lägga till dialogrutor på din webbplats för ljusboxar, användarmeddelanden eller helt anpassat innehåll.

Hur det fungerar

Innan du börjar med Bootstraps modala komponent, se till att läsa följande eftersom våra menyalternativ nyligen har ändrats.

  • Modalerna är byggda med HTML, CSS och JavaScript. De är placerade över allt annat i dokumentet och tar bort rullningen från <body>så att modalt innehåll rullar istället.
  • Genom att klicka på den modala "bakgrunden" stängs modalen automatiskt.
  • Bootstrap stöder bara ett modalt fönster åt gången. Kapslade modaler stöds inte eftersom vi anser att de är dåliga användarupplevelser.
  • Modaler använder position: fixed, som ibland kan vara lite speciell när det gäller dess rendering. När det är möjligt, placera din modala HTML på en toppnivå för att undvika potentiell störning från andra element. Du kommer sannolikt att stöta på problem när du kapslar en .modali ett annat fast element.
  • Återigen, på grund av position: fixed, finns det några varningar med att använda modaler på mobila enheter. Se våra webbläsarsupportdokument för detaljer.
  • På grund av hur HTML5 definierar sin semantik har HTML autofocus-attributet ingen effekt i Bootstrap-modaler. För att uppnå samma effekt, använd lite anpassat JavaScript:
const myModal = document.getElementById('myModal')
const myInput = document.getElementById('myInput')

myModal.addEventListener('shown.bs.modal', () => {
  myInput.focus()
})
Animeringseffekten av denna komponent beror på prefers-reduced-motionmediefrågan. Se avsnittet för reducerad rörelse i vår tillgänglighetsdokumentation .

Fortsätt läsa för demos och användningsriktlinjer.

Exempel

Nedan är ett statiskt modalt exempel (vilket betyder att dess positionoch displayhar åsidosatts). Inkluderat är modal sidhuvud, modal body (krävs för padding) och modal sidfot (valfritt). Vi ber dig att inkludera modala rubriker med avvisningsåtgärder när det är möjligt, eller tillhandahålla en annan uttrycklig avvisningsåtgärd.

<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

Växla en fungerande modal demo genom att klicka på knappen nedan. Den kommer att glida ned och tona in från toppen av sidan.

<!-- 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 bakgrund

När bakgrunden är inställd på statisk stängs inte modalen när du klickar utanför den. Klicka på knappen nedan för att prova.

<!-- 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>

Rulla långt innehåll

När modalerna blir för långa för användarens viewport eller enhet rullar de oberoende av själva sidan. Prova demon nedan för att se vad vi menar.

Du kan också skapa en rullningsbar modal som tillåter rullning av modalkroppen genom att lägga .modal-dialog-scrollabletill i .modal-dialog.

<!-- Scrollable modal -->
<div class="modal-dialog modal-dialog-scrollable">
  ...
</div>

Vertikalt centrerad

Lägg .modal-dialog-centeredtill .modal-dialogför att vertikalt centrera modalen.

<!-- 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>

Verktygstips och popovers

Verktygstips och popovers kan placeras inom modaler efter behov. När modalerna stängs stängs även alla verktygstips och popovers inom automatiskt.

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

Använda rutnätet

Använd Bootstrap-rutnätssystemet inom en modal genom att kapsla .container-fluidi .modal-body. Använd sedan de normala rutsystemklasserna som du skulle någon annanstans.

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

Varierande modalt innehåll

Har du ett gäng knappar som alla triggar samma modal med lite olika innehåll? Använd event.relatedTargetoch HTML- data-bs-*attribut för att variera innehållet i modalen beroende på vilken knapp som klickades på.

Nedan är en livedemo följt av exempel HTML och JavaScript. För mer information, läs dokumenten för modala händelser för detaljer om relatedTarget.

html
<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
})

Växla mellan modaler

Växla mellan flera modaler med en smart placering av attributen data-bs-targetoch . data-bs-toggleTill exempel kan du växla en lösenordsåterställningsmodal från en redan öppen inloggningsmodal. Observera att flera modaler inte kan vara öppna samtidigt - den här metoden växlar helt enkelt mellan två separata modaler.

Öppna första modal
html
<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>

Ändra animation

Variabeln $modal-fade-transformbestämmer transformeringstillståndet .modal-dialogföre den modala fade-in-animeringen, $modal-show-transformvariabeln bestämmer transformationen av .modal-dialogi slutet av den modala fade-in-animeringen.

Om du till exempel vill ha en zoom-in-animation kan du ställa in $modal-fade-transform: scale(.8).

Ta bort animation

För modaler som helt enkelt visas istället för att tona in för att visa, ta bort .fadeklassen från din modala uppmärkning.

<div class="modal" tabindex="-1" aria-labelledby="..." aria-hidden="true">
  ...
</div>

Dynamiska höjder

Om höjden på en modal ändras medan den är öppen, bör du ringa myModal.handleUpdate()för att justera modalens position om en rullningslist visas.

Tillgänglighet

Var noga med att lägga till aria-labelledby="...", med hänvisning till den modala titeln, till .modal. Dessutom kan du ge en beskrivning av din modala dialogruta med aria-describedby.modal. Observera att du inte behöver lägga till role="dialog"eftersom vi redan lägger till det via JavaScript.

Bädda in YouTube-videor

Att bädda in YouTube-videor i modals kräver ytterligare JavaScript som inte finns i Bootstrap för att automatiskt stoppa uppspelningen och mer. Se detta användbara Stack Overflow-inlägg för mer information.

Valfria storlekar

Modaler har tre valfria storlekar, tillgängliga via modifieringsklasser för att placeras på en .modal-dialog. Dessa storlekar slår in vid vissa brytpunkter för att undvika horisontella rullningslister på smalare vyportar.

Storlek Klass Modal maxbredd
Små .modal-sm 300px
Standard Ingen 500px
Stor .modal-lg 800px
Extra stor .modal-xl 1140px

Vår standardmodal utan modifieringsklass utgör "medelstor" modal.

<div class="modal-dialog modal-xl">...</div>
<div class="modal-dialog modal-lg">...</div>
<div class="modal-dialog modal-sm">...</div>

Helskärmsmodal

En annan åsidosättning är alternativet att poppa upp en modal som täcker användarens vyport, tillgänglig via modifieringsklasser som placeras på en .modal-dialog.

Klass Tillgänglighet
.modal-fullscreen Alltid
.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

Lades till i v5.2.0

Som en del av Bootstraps utvecklande CSS-variabler använder modals nu lokala CSS-variabler på .modaloch .modal-backdropför förbättrad realtidsanpassning. Värden för CSS-variablerna ställs in via Sass, så Sass-anpassning stöds fortfarande också.

  --#{$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);

Slinga

Responsiva helskärmsmodaler genereras via $breakpointskartan och en loop i 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;
      }
    }
  }
}

Användande

Modal plugin växlar ditt dolda innehåll på begäran, via dataattribut eller JavaScript. Den åsidosätter också standardrullningsbeteendet och genererar ett .modal-backdropför att tillhandahålla ett klickområde för att avvisa visade modaler när du klickar utanför modalen.

Via dataattribut

Växla

Aktivera en modal utan att skriva JavaScript. Ställ in data-bs-toggle="modal"på ett kontrollelement, som en knapp, tillsammans med en data-bs-target="#foo"eller href="#foo"för att rikta in en specifik modal att växla.

<button type="button" data-bs-toggle="modal" data-bs-target="#myModal">Launch modal</button>

Avfärda

Uppsägning kan uppnås med dataattributet på en knapp inom modalen som visas nedan:

<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>

eller på en knapp utanför modalen med hjälp av det data-bs-targetsom visas nedan:

<button type="button" class="btn-close" data-bs-dismiss="modal" data-bs-target="#my-modal" aria-label="Close"></button>
Även om båda sätten att avvisa en modal stöds, kom ihåg att avvisning utanför en modal inte matchar ARIA Authoring Practices Guide-dialog (modal) mönstret . Gör detta på egen risk.

Via JavaScript

Skapa en modal med en enda rad JavaScript:

const myModal = new bootstrap.Modal(document.getElementById('myModal'), options)
// or
const myModalAlternative = new bootstrap.Modal('#myModal', options)

alternativ

Eftersom alternativ kan skickas via dataattribut eller JavaScript kan du lägga till ett alternativnamn till data-bs-, som i data-bs-animation="{value}". Se till att ändra fallets typ av alternativnamnet från " camelCase " till " kebab-case " när du skickar alternativen via dataattribut. Använd till exempel data-bs-custom-class="beautifier"istället för data-bs-customClass="beautifier".

Från och med Bootstrap 5.2.0 stöder alla komponenter ett experimentellt reserverat dataattribut data-bs-configsom kan hysa enkel komponentkonfiguration som en JSON-sträng. När ett element har data-bs-config='{"delay":0, "title":123}'och data-bs-title="456"attribut kommer det slutliga titlevärdet att vara 456och de separata dataattributen kommer att åsidosätta värden som ges på data-bs-config. Dessutom kan befintliga dataattribut innehålla JSON-värden som data-bs-delay='{"show":0,"hide":150}'.

namn Typ Standard Beskrivning
backdrop boolesk,'static' true Inkluderar ett modal-bakgrundselement. Alternativt kan du ange staticför en bakgrund som inte stänger modalen när du klickar på den.
focus booleskt true Sätter fokus på modalen när den initieras.
keyboard booleskt true Stänger modalen när escape-tangenten trycks ned.

Metoder

Asynkrona metoder och övergångar

Alla API - metoder är asynkrona och startar en övergång . De återvänder till den som ringer så snart övergången har påbörjats men innan den slutar . Dessutom kommer ett metodanrop på en övergångskomponent att ignoreras .

Se vår JavaScript-dokumentation för mer information .

Passeringsalternativ

Aktiverar ditt innehåll som en modal. Accepterar ett valfritt alternativ object.

const myModal = new bootstrap.Modal('#myModal', {
  keyboard: false
})
Metod Beskrivning
dispose Förstör ett elements modal. (Tar bort lagrad data på DOM-elementet)
getInstance Statisk metod som låter dig få den modala instansen associerad med ett DOM-element.
getOrCreateInstance Statisk metod som låter dig få den modala instansen associerad med ett DOM-element, eller skapa en ny om den inte initierades.
handleUpdate Justera manuellt modalens position om höjden på en modal ändras medan den är öppen (dvs. om en rullningslist visas).
hide Döljer en modal manuellt. Återgår till den som ringer innan modalen faktiskt har dolts (dvs innan hidden.bs.modalhändelsen inträffar).
show Öppnar en modal manuellt. Återgår till den som ringer innan modalen faktiskt har visats (dvs innan shown.bs.modalhändelsen inträffar). Du kan också skicka ett DOM-element som ett argument som kan tas emot i de modala händelserna (som relatedTargetegenskapen). const modalToggle = document.getElementById('toggleMyModal'); myModal.show(modalToggle)( dvs.
toggle Växlar manuellt en modal. Återgår till den som ringer innan modalen faktiskt har visats eller dolt (dvs innan händelsen shown.bs.modaleller hidden.bs.modalinträffar).

evenemang

Bootstraps modalklass avslöjar några händelser för att koppla in modal funktionalitet. Alla modala händelser avfyras mot själva modalen (dvs. på <div class="modal">).

Händelse Beskrivning
hide.bs.modal Denna händelse aktiveras omedelbart när hideinstansmetoden har anropats.
hidden.bs.modal Denna händelse utlöses när modalen har döljts för användaren (väntar på att CSS-övergångar ska slutföras).
hidePrevented.bs.modal Denna händelse utlöses när modalen visas, dess bakgrund är staticoch ett klick utanför modalen utförs. Händelsen aktiveras också när escape-tangenten trycks ned och keyboardalternativet är inställt på false.
show.bs.modal Denna händelse aktiveras omedelbart när showinstansmetoden anropas. Om det orsakas av ett klick är det klickade elementet tillgängligt som relatedTargetegenskapen för händelsen.
shown.bs.modal Denna händelse utlöses när modalen har gjorts synlig för användaren (väntar på att CSS-övergångar ska slutföras). Om det orsakas av ett klick är det klickade elementet tillgängligt som relatedTargetegenskapen för händelsen.
const myModalEl = document.getElementById('myModal')
myModalEl.addEventListener('hidden.bs.modal', event => {
  // do something...
})