Tailwind CSS Academy · Les

Openings- en sluitanimatie van een modal

Animeer het verschijnen en verdwijnen van de modal met Tailwind-transition-utilities in combinatie met het wisselen van JavaScript-classes voor een vloeiende gebruikerservaring.

Les 2 van 413 stappen

Openings- en sluitanimatie van een modal is een gratis Tailwind CSS Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Tailwind CSS Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Tailwind CSS Academy bevat in totaal 4 lessen.

Waarom modale vensters animeren

Het animeren van het verschijnen en verdwijnen van een modaal venster heeft naast esthetiek ook een functioneel doel. Een plotselinge verschijning kan gebruikers laten schrikken; een vloeiende vervaging maakt de komst van het modale venster begrijpelijker en helpt gebruikers te zien waar het vandaan komt. Een verdwijnanimatie geeft aan dat de interactie is voltooid en dat de gebruiker terugkeert naar de pagina.

De overgangshulpmiddelen van Tailwind maken het eenvoudig om dekking en schaal tegelijk te animeren. Zo ontstaat een verzorgde vervaging met schaalverandering die past bij de kwaliteit van systeemeigen mobiele gebruikersinterfaces.

Animatie van de achtergrond bij verschijnen

De achtergrond moet vervagen wanneer het modale venster wordt geopend en weer vervagen wanneer het wordt gesloten. Voeg transition-opacity duration-300 toe aan het achtergrondelement. Wissel via JavaScript tussen opacity-0 (verborgen) en opacity-100 (zichtbaar).

De achtergrond moet in de DOM blijven staan (gebruik dus niet hidden) om de vervaging te laten werken — begin in plaats daarvan met opacity-0 pointer-events-none en wissel naar opacity-100 pointer-events-auto.

<!-- Backdrop with fade -->
<div
  id="backdrop"
  onclick="closeModal()"
  class="fixed inset-0 bg-black/50 z-40
         transition-opacity duration-300
         opacity-0 pointer-events-none">
</div>

<script>
  function openModal() {
    document.getElementById('backdrop').classList.remove('opacity-0', 'pointer-events-none');
    document.getElementById('backdrop').classList.add('opacity-100', 'pointer-events-auto');
  }
  function closeModal() {
    document.getElementById('backdrop').classList.remove('opacity-100', 'pointer-events-auto');
    document.getElementById('backdrop').classList.add('opacity-0', 'pointer-events-none');
  }
</script>

Dialoogvenster laten schalen en vervagen bij verschijnen

De meest voorkomende animatie voor het verschijnen van een modaal venster is vergroten met vervaging: het dialoogvenster begint iets kleiner en transparant en groeit vervolgens naar de volledige grootte terwijl het ondoorzichtig wordt. Dit bootst na hoe modale vensters in iOS en Android verschijnen.

Voeg transition-all duration-300 toe aan het dialoogvenster. Wissel tussen scale-95 opacity-0 (de aanvankelijk verborgen toestand) en scale-100 opacity-100 (de zichtbare toestand). De korte duur van 300 ms houdt de animatie vlot.

<!-- Dialog panel -->
<div
  id="dialog"
  class="bg-white rounded-2xl shadow-2xl w-full max-w-md
         transition-all duration-300
         scale-95 opacity-0 pointer-events-none">
  <!-- content -->
</div>

<script>
  function openModal() {
    const d = document.getElementById('dialog');
    d.classList.remove('scale-95', 'opacity-0', 'pointer-events-none');
    d.classList.add('scale-100', 'opacity-100', 'pointer-events-auto');
  }
  function closeModal() {
    const d = document.getElementById('dialog');
    d.classList.remove('scale-100', 'opacity-100', 'pointer-events-auto');
    d.classList.add('scale-95', 'opacity-0', 'pointer-events-none');
  }
</script>

Omhoogschuifanimatie voor mobiele panelen

Op mobiele apparaten schuift een onderpaneel vanaf de onderkant van het scherm omhoog in plaats van in het midden te verschijnen. Dat werkt ergonomischer bij bediening met de duim. Gebruik fixed bottom-0 inset-x-0 om het paneel onderaan vast te zetten en translate-y-full als aanvankelijk verborgen toestand, die je wisselt naar translate-y-0.

Voeg bovenaan een sleepgreep (w-10 h-1 rounded-full bg-gray-300 mx-auto mt-3) toe om aan te geven dat vegen mogelijk is.

<div
  id="sheet"
  class="fixed bottom-0 inset-x-0 z-50 bg-white rounded-t-2xl shadow-2xl
         transition-transform duration-300 ease-out
         translate-y-full">
  <!-- Drag handle -->
  <div class="w-10 h-1 rounded-full bg-gray-300 mx-auto mt-3"></div>
  <div class="px-6 py-5">
    <h2 class="text-lg font-semibold text-gray-900">Share</h2>
    <p class="mt-2 text-sm text-gray-600">Choose how you want to share this item.</p>
  </div>
  <div class="flex justify-end gap-3 px-6 pb-6">
    <button onclick="closeSheet()" class="px-4 py-2 text-sm font-semibold border border-gray-300 rounded-lg">Cancel</button>
    <button class="px-4 py-2 text-sm font-semibold text-white bg-blue-600 rounded-lg">Share</button>
  </div>
</div>

Versnellingsfuncties voor vloeiende animaties

De timingfunctie bepaalt hoe een animatie versnelt en vertraagt. Tailwind biedt vier hulpprogramma's voor versnelling: ease-linear, ease-in, ease-out en ease-in-out.

Gebruik voor het verschijnen van modale vensters ease-out: het element begint snel en vertraagt wanneer het de eindpositie bereikt, wat natuurlijk en prettig aanvoelt. Gebruik voor het verdwijnen ease-in: het element versnelt wanneer het verdwijnt, wat doelgericht aanvoelt. ease-in-out werkt goed voor omkeerbare overgangen, zoals schakelacties.

<!-- Entrance: fast start, slow end -->
<div class="transition-all duration-300 ease-out
            scale-95 opacity-0">
  Modal entering
</div>

<!-- Exit: slow start, fast end -->
<div class="transition-all duration-200 ease-in
            scale-95 opacity-0">
  Modal exiting
</div>

Wachten tot de verdwijnanimatie is voltooid

Een veelgemaakte fout is het modale venster meteen uit de DOM verwijderen (of met hidden verbergen) zodra het sluiten wordt gestart. Daarmee wordt de verdwijnanimatie afgebroken. Wacht in plaats daarvan tot de animatie is voltooid met de gebeurtenis transitionend voordat je het element verbergt.

Luister naar de gebeurtenis met { once: true }, zodat de handler slechts één keer per overgang wordt uitgevoerd en zich niet opstapelt. Voeg na de overgang hidden of pointer-events-none toe om interactie met het onzichtbare element te voorkomen.

<script>
  function closeModal() {
    const dialog = document.getElementById('dialog');
    const backdrop = document.getElementById('backdrop');

    // Start exit animation
    dialog.classList.remove('scale-100', 'opacity-100');
    dialog.classList.add('scale-95', 'opacity-0');
    backdrop.classList.remove('opacity-100');
    backdrop.classList.add('opacity-0');

    // Wait for animation to finish, then hide
    dialog.addEventListener('transitionend', () => {
      dialog.classList.add('pointer-events-none');
      backdrop.classList.add('pointer-events-none');
      document.body.classList.remove('overflow-hidden');
    }, { once: true });
  }
</script>

Gelaagde animatie voor achtergrond en dialoogvenster

Als de achtergrond en het dialoogvenster precies tegelijk worden geopend, kan dat abrupt aanvoelen. Bij een gelaagde animatie wordt eerst de achtergrond geopend en het dialoogvenster een fractie van een seconde later. Zo ontstaat een gelaagd onthullingseffect.

Bereik dit door de klasse delay-100 aan het dialoo­gelement toe te voegen, zodat de overgang 100 ms na die van de achtergrond begint. Verwijder de vertraging tijdens het sluiten, zodat dit snel verloopt.

<!-- Backdrop: starts immediately -->
<div id="backdrop"
     class="fixed inset-0 bg-black/50 z-40
            transition-opacity duration-300
            opacity-0 pointer-events-none">
</div>

<!-- Dialog: starts 100ms after backdrop -->
<div id="dialog"
     class="bg-white rounded-2xl shadow-2xl w-full max-w-md
            transition-all duration-300 delay-100
            scale-90 opacity-0 pointer-events-none">
  <!-- content -->
</div>

<!-- On open: add opacity-100 to backdrop, then scale-100/opacity-100 to dialog (delay-100 handles the stagger) -->
<!-- On close: remove delay-100 from dialog before starting the exit --></i>

Inzoomend waarschuwingsvenster

Voor kritieke waarschuwingen (fouten en bevestigingen van destructieve acties) trekt een inzoomeffect meer aandacht dan een zachte schaalverandering. Begin het dialoogvenster met scale-50 en animeer naar scale-100 met een korte duration-150 voor een snelle verschijning die de aandacht opeist.

Gebruik dit spaarzaam — als je dramatische animaties overdrijft, raken gebruikers eraan gewend. Bewaar inzoomen voor echt belangrijke vragen waarbij je de onverdeelde aandacht van de gebruiker nodig hebt.

<!-- Zoom-in alert -->
<div
  id="alert-dialog"
  class="bg-white rounded-2xl shadow-2xl w-full max-w-sm
         transition-all duration-150 ease-out
         scale-50 opacity-0">
  <div class="p-6 text-center">
    <div class="mx-auto w-14 h-14 rounded-full bg-red-100 flex items-center justify-center">
      <svg class="w-7 h-7 text-red-600" fill="none" viewBox="0 0 24 24" stroke="currentColor">
        <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
              d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"/>
      </svg>
    </div>
    <h2 class="mt-4 text-lg font-bold text-gray-900">Critical Error</h2>
    <p class="mt-2 text-sm text-gray-500">Your session has expired. Please log in again.</p>
    <button class="mt-5 w-full py-2.5 bg-blue-600 text-white font-semibold rounded-lg">Sign In Again</button>
  </div>
</div>

Animeren met CSS-klassen versus inline stijlen

Voor animaties van modale vensters in Tailwind zijn er twee benaderingen: klassen wisselen (wat we tot nu toe hebben gedaan) en inline stijlen aanpassen via JavaScript. Klassen wisselen is de Tailwind-manier: stijlen blijven netjes in HTML-klassen en gedrag in JavaScript gescheiden.

Het aanpassen van inline stijlen (element.style.opacity = '0') doorbreekt de aanpak met hulpprogramma's en maakt stijlen moeilijker te controleren. Houd het bij het wisselen van klassen, tenzij je dynamische waarden nodig hebt die niet vooraf kunnen worden bepaald, zoals geanimeerde posities op basis van coördinaten uit een gebruikersinteractie.

// Class toggling (Tailwind approach) — preferred
function openModal() {
  dialog.classList.remove('scale-95', 'opacity-0');
  dialog.classList.add('scale-100', 'opacity-100');
}

// Inline style approach — avoid unless necessary
function openModalInline() {
  dialog.style.transform = 'scale(1)';
  dialog.style.opacity = '1';
  // Hard to maintain, not visible in HTML
}

Voorkeuren voor minder beweging respecteren

Sommige gebruikers worden misselijk van animaties in gebruikersinterfaces. Zowel CSS als Tailwind respecteren de mediaquery prefers-reduced-motion. Gebruik motion-reduce:transition-none en motion-reduce:transform-none op geanimeerde elementen om overgangen uit te schakelen voor gebruikers die in de instellingen van hun besturingssysteem hebben aangegeven minder beweging te willen.

Dit is een toegankelijkheidsvereiste die vaak over het hoofd wordt gezien. Met deze hulpprogramma's voorkom je dat je geanimeerde modale vensters ongemak veroorzaken of problemen met bewegingsgevoeligheid uitlokken.

<div
  id="dialog"
  class="bg-white rounded-2xl shadow-2xl w-full max-w-md
         transition-all duration-300 ease-out
         motion-reduce:transition-none
         scale-95 opacity-0">
  <!-- dialog content -->
</div>

Animatie van toastmeldingen

Een toastmelding is een tijdelijk, niet-blokkerend bericht dat vanuit een boven- of benedenhoek van het scherm naar binnen schuift. Gebruik fixed bottom-4 right-4 z-50 voor de positionering en animeer het element aanvankelijk met translate-y-2 opacity-0, waarna je overgaat naar translate-y-0 opacity-100.

Laat de toast na enkele seconden automatisch verdwijnen met setTimeout. Met transition-all duration-300 van Tailwind verlopen zowel het verschijnen als het automatisch vervagen bij het verdwijnen vloeiend.

<!-- Toast element -->
<div
  id="toast"
  class="fixed bottom-4 right-4 z-50
         flex items-center gap-3 px-4 py-3 bg-gray-900 text-white text-sm rounded-xl shadow-xl
         transition-all duration-300
         translate-y-2 opacity-0 pointer-events-none">
  <svg class="w-4 h-4 text-green-400" fill="currentColor" viewBox="0 0 20 20">
    <path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"/>
  </svg>
  Changes saved successfully!
</div>

<script>
  function showToast() {
    const t = document.getElementById('toast');
    t.classList.remove('translate-y-2', 'opacity-0', 'pointer-events-none');
    t.classList.add('translate-y-0', 'opacity-100');
    setTimeout(() => {
      t.classList.remove('translate-y-0', 'opacity-100');
      t.classList.add('translate-y-2', 'opacity-0', 'pointer-events-none');
    }, 3000);
  }
</script>

Korte controle

Test je begrip van de concepten uit deze les over Tailwind CSS Mastery.

Samenvatting van de les

In deze les heb je geleerd dat animaties van modale vensters werken door hulpprogrammaklassen voor dekking en schaal te wisselen (scale-95 opacity-0 naar scale-100 opacity-100) met transition-all duration-300; dat je bij verdwijnanimaties op transitionend moet wachten voordat je het element verbergt; en dat je toegankelijkheid voor beweging regelt met motion-reduce:transition-none om de besturingssysteeminstelling prefers-reduced-motion te respecteren. Hierna bouwen we vervolgkeuzemenu's.

Gratis beginnen

Leer HTML met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
30
Lessen
120

Veelgestelde vragen

Is de les “Openings- en sluitanimatie van een modal” gratis?

Ja — de volledige tekst van “Openings- en sluitanimatie van een modal” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Tailwind CSS Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Tailwind CSS Academy bevat in totaal 4 lessen.

Wat leer ik in “Openings- en sluitanimatie van een modal”?

Animeer het verschijnen en verdwijnen van de modal met Tailwind-transition-utilities in combinatie met het wisselen van JavaScript-classes voor een vloeiende gebruikerservaring. Je oefent met Tailwind CSS Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Tailwind CSS Academy te beginnen?

Ervaring vooraf is niet nodig. Tailwind CSS Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.

Hoe lang duurt de les “Openings- en sluitanimatie van een modal”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Tailwind CSS Academy?

Ja. Elke les over Tailwind CSS Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. Structuur van een modal dialoogvenster
  2. Openings- en sluitanimatie van een modal
  3. Dropdownmenucomponent
  4. Toegankelijke modals en dropdowns
← Terug naar Tailwind CSS Academy