Gå til hovedinnhold Hopp til dokumentnavigering
Check

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 .modali 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 autofocusHTML-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()
})
Animasjonseffekten til denne komponenten er avhengig av prefers-reduced-motionmediesøket. Se delen for redusert bevegelse i tilgjengelighetsdokumentasjonen vår .

Fortsett å lese for demoer og retningslinjer for bruk.

Eksempler

Nedenfor er et statisk modalt eksempel (som betyr at det er positionog displayhar 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-scrollabletil .modal-dialog.

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

Vertikalt sentrert

Legg .modal-dialog-centeredtil .modal-dialogfor å 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-fluidi .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.relatedTargetog 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.

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

Veksle mellom modaler

Veksle mellom flere modaler med en smart plassering av attributtene data-bs-targetog . data-bs-toggleDu 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.

Åpne første 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>

Endre animasjon

$modal-fade-transformVariabelen bestemmer transformasjonstilstanden før den .modal-dialogmodale inntoningsanimasjonen, $modal-show-transformvariabelen bestemmer transformasjonen av .modal-dialogpå 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 .fadeklassen 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.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.0

Som en del av Bootstraps utviklende CSS-variabletilnærming, bruker modaler nå lokale CSS-variabler på .modalog .modal-backdropfor 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 $breakpointskartet 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-backdropklikkområ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 dataattributtet 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-targetsom vist nedenfor:

<button type="button" class="btn-close" data-bs-dismiss="modal" data-bs-target="#my-modal" aria-label="Close"></button>
Selv om begge måter å avvise en modal støttes på, husk at avvisning fra utenfor en modal ikke samsvarer med ARIA Authoring Practices Guide-dialog (modal) mønsteret . Gjør dette på egen risiko.

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-configsom 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 titleverdien være 456og 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 staticfor 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 .

Se vår JavaScript-dokumentasjon for mer informasjon .

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.modalhendelsen 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.modalhendelsen inntreffer). Du kan også sende et DOM-element som et argument som kan mottas i de modale hendelsene (som relatedTargetegenskapen). 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.modaleller hidden.bs.modalinntreffer).

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 hideinstansmetoden 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 staticog et klikk utenfor modalen utføres. Hendelsen utløses også når escape-tasten trykkes og keyboardalternativet er satt til false.
show.bs.modal Denne hendelsen utløses umiddelbart når showinstansmetoden kalles. Hvis det er forårsaket av et klikk, er det klikkede elementet tilgjengelig som relatedTargetegenskapen 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 relatedTargetegenskapen til hendelsen.
const myModalEl = document.getElementById('myModal')
myModalEl.addEventListener('hidden.bs.modal', event => {
  // do something...
})