Native Interaktion: das dialog-Element
Ein echtes Modal, ganz ohne eigenes CSS-Overlay
Abschnitt betitelt „Ein echtes Modal, ganz ohne eigenes CSS-Overlay“Erinnert ihr euch an den Modal-Backdrop aus dem CSS-Kapitel? position: fixed, z-index, ein abgedunkelter Hintergrund mit rgb(0 0 0 / 0.6), alles von Hand gebaut. Das <dialog>-Element bringt genau das fertig mit:
<dialog id="hinweis"> <p>Das ist ein Modal-Fenster.</p></dialog>
<button id="oeffnen">Hinweis anzeigen</button>document.querySelector("#oeffnen").addEventListener("click", () => { document.querySelector("#hinweis").showModal();});- Ein
<dialog>ist standardmäßig unsichtbar - egal was drinsteht showModal()öffnet es modal: der Rest der Seite wird automatisch abgedunkelt und ist nicht mehr klickbar, bis das Dialog geschlossen wird- Für dieses eine
showModal()braucht ihr eine Zeile JavaScript - einen deklarativen, JS-freien Weg zum Öffnen gibt es aktuell nicht - Die Esc-Taste schließt ein modales Dialog automatisch - ganz ohne eigenen Code
Schließen ganz ohne JavaScript: <form method="dialog">
Abschnitt betitelt „Schließen ganz ohne JavaScript: <form method="dialog">“Zum Öffnen braucht ihr die eine Zeile JavaScript von oben. Zum Schließen nicht - dafür reicht ein Formular mit method="dialog" innerhalb des Dialogs:
<dialog id="bestaetigung"> <p>Wirklich löschen?</p> <form method="dialog"> <button value="abbrechen">Abbrechen</button> <button value="loeschen">Löschen</button> </form></dialog>method="dialog"sorgt dafür, dass ein Klick auf irgendeinen Submit-Button im Formular das Dialog schließt, statt die Seite neu zu laden- Das funktioniert für jeden Button im Formular - “Abbrechen” und “Löschen” schließen beide das Dialog, ganz ohne dass ihr selbst
close()aufrufen müsst
Praxisbeispiel: Bestätigungsdialog
Abschnitt betitelt „Praxisbeispiel: Bestätigungsdialog“<dialog id="confirm-dialog"> <h2>Änderungen verwerfen?</h2> <p>Ungespeicherte Änderungen gehen verloren.</p> <form method="dialog"> <button value="cancel">Abbrechen</button> <button value="discard" autofocus>Verwerfen</button> </form></dialog>
<button id="open-confirm">Verwerfen...</button>document.querySelector("#open-confirm").addEventListener("click", () => { document.querySelector("#confirm-dialog").showModal();});#confirm-dialog { border: none; border-radius: 12px; padding: 24px; box-shadow: 0 8px 24px rgb(0 0 0 / 0.2);}
#confirm-dialog::backdrop { background-color: rgb(0 0 0 / 0.5);}Den Hintergrund stylen: ::backdrop
Abschnitt betitelt „Den Hintergrund stylen: ::backdrop“Der abgedunkelte Hintergrund hinter einem modalen Dialog ist selbst ein Pseudo-Element, das ihr anpassen könnt:
dialog::backdrop { background-color: rgb(0 0 0 / 0.7); backdrop-filter: blur(4px);}
dialog { border: none; border-radius: 12px; padding: 24px; max-width: 400px;}Modal oder nicht: show() vs. showModal()
Abschnitt betitelt „Modal oder nicht: show() vs. showModal()“| Methode | Verhalten |
|---|---|
show() | öffnet das Dialog, Rest der Seite bleibt bedienbar |
showModal() | öffnet modal: Rest der Seite abgedunkelt, nicht bedienbar, Fokus bleibt im Dialog gefangen |
Fortgeschritten: Schließen per JavaScript - für später, wenn ihr JS könnt
Die Formular-Lösung von oben reicht für die allermeisten Fälle. Wollt ihr das Dialog aber auch ohne Klick auf einen Formular-Button schließen (z.B. nach einem erfolgreichen API-Aufruf), geht das per JavaScript:
const dialog = document.querySelector("#hinweis");
dialog.close(); // schließt das DialogNutzt ihr <form method="dialog">, landet der value des geklickten Buttons zusätzlich in dialog.returnValue - damit lässt sich per JavaScript auslesen, welcher Button gedrückt wurde:
dialog.addEventListener("close", () => { console.log(dialog.returnValue); // "abbrechen" oder "loeschen"});beantwortet: 0 / 0 (0%)
richtig: 0 / 0 (0%)