Infobox/modale Dialogfenster
- Popover (aus dem letzten Kapitel) zeigen Benachrichtigungen oder zusätzliche Informationen. Der Nutzer kann sie beachten, aber auch normal weiterarbeiten.
- Modale Dialogfenster erfordern wie alert() in JavaScript sofortige Aufmerksamkeit. Während sie geöffnet sind, ist die darunter liegende Webseite nicht aktiv und kann erst wiederverwendet werden, wenn die Dialog-Box geschlossen ist. Dies muss durch den Nutzer ausdrücklich bestätigt werden, was in der Regel durch Anklicken einer Schaltfläche innerhalb des Containers geschieht.
In HTML5 wurde dafür das dialog-Element eingeführt, das seit 2022 von allen Browsern unterstützt wird.
Inhaltsverzeichnis
dialog - ein Offenlegungs-Widget
Das dialog-Element ist wie ein div ein Container-Element für die in der Popup-Box enthaltenen Inhalte. Standardmäßig ist das Element nicht sichtbar.
Dialoge können Formulare enthalten. Entweder gewöhnliche, die zu einem GET oder POST-Request an den Server führen und die Seite neu laden, oder spezielle Dialog-Formulare. Mittels <form method="dialog">
erstellen Sie ein Formular, dessen submit-Buttons nicht die Seite an den Server senden, sondern lediglich den Dialog schließen, der dieses Form enthält. Der Inhalt des value
Attributs, das sich am geklickten Button befindet, wird dabei in die returnValue
Eigenschaft des HTMLDialogElement-Objekts übertragen.[1]
open-Attribut
Das boolesche Attribut open gibt an, ob der Dialog aktiv ist. Ist das Attribut vorhanden und enthält entweder den leeren String oder den String 'open'
, bedeutet dies, dass der Dialog aktiv ist. Wird das Attribut weggelassen, bedeutet dies, dass der Dialog inaktiv ist und vom Browser nicht angezeigt werden soll.
Ein Blick in den Seiteninspektor zeigt folgende Festlegung im Browser-Stylesheet:
/* Festlegung im Default-Stylesheet der Browser */
dialog:not([open]) {
display: none;
}
/* Styling der geöffneten Popup-Box */
dialog[open] {
width: 20em;
background: #fffbf0;
border: thin solid #e7c157;
margin: 5em auto;
}
Öffnen und Schließen mittels Javascript
Information
invoketarget
und invokeaction
ermöglicht werden.[2]Dies würde einige Zeilen JavaScript sparen.
Anders als bei Popover ist noch der Einsatz von JavaScript zum Öffnen und Schließen erforderlich.
Das Dialog-Element besitzt sein eigenes DOM-Interface, das das Steuern von Ein-/Ausblenden und eventuellen Rückgabewerten ermöglicht.
Öffnen
Für das Einblenden eines dialog-Elements werden gleich zwei Optionen zur Verfügung gestellt:
dialog.show()
- wird verwendet, um einen Dialog zu öffnen.
dialog.showModal()
- öffnet den Dialog ebenfalls und macht ihn zusätzlich zum vordergründigsten Dialog der Anwendung. D.h. alle interaktiven Elemente der Webseite, außer den Kind-Elementen des modal geöffneten Dialogs, werden gesperrt. Es ist zulässig, weitere modale Dialoge zu öffnen. Jedes weitere Öffnen blockiert den bereits offenen modalen Dialog.
document.getElementById("show-dialog").addEventListener("click", () => {
document.getElementById("dialog").showModal();
});
document.getElementById("close-dialog").addEventListener("click", () => {
document.getElementById("dialog").close();
});
In diesem Beispiel ist das dialog-Element ursprünglich geschlossen. Durch einen Klick auf den Button mit der id show-dialog
wird das dialog-Element per JavaScript mit der showModal()
-Methode geöffnet.
Damit die Dialog-Box die volle Aufmerksamkeit des Nutzers bekommt, wird durch das Pseudoelement ::backdrop
der Seitenhintergrund mit einem durchscheinenden Overlay verdunkelt. Die dahinterliegende, eigentliche Webseite wird im Stack des Top-Layers versteckt und ist inaktiv.
Zwischen Dokument und der geöffneten Dialog-Box befindet sich nun eine durchscheinende Schicht, die einen Zugriff auf das darunterliegende Dokument solange verhindert, bis die Dialog-Box geschlossen ist.
dialog::backdrop {
background: hsl(201 50% 40% /.5) ;
}
document.getElementById("dialog").show();
und beobachten Sie die Unterschiede.modal oder nichtmodal?
Wie in der Einführung bereits erwähnt, wird die Webseite bei einem modalen Dialogfenster inaktiv. Es wäre möglich, mehrere modale Dialogfenster zu öffnen, wobei das jeweils oberste die anderen ebenfalls inaktiv werden lässt.
Es gibt nichts Schlimmeres als auf der Suche nach Informationen erst ein Cookie-Banner wegklicken zu müssen, um dann nicht auf der Webseite selbst, sondern auf der Newsletter-Anmeldung hängenzubleiben.
Technisch ist dies möglich, aber für die Nutzer der Webseite ein Grund zum Abbruch.
Denken Sie an die Benutzerfreundlichkeit (usability) Ihrer Webseite!
Schließen
Des Weiteren können Sie den dialog auch mit JavaScript schließen oder auswerten:
dialog.close( [result] )
- schließt einen Dialog und weist einen eventuellen Rückgabewert zu, der mit dem optionalen Parameter
result
übergeben werden kann.
dialog.returnValue
- liefert den Rückgabewert, der zuvor mit
dialog.close
gesetzt wurde. Wurde dort kein Rückgabewert angegeben, wird stattdessen der leere String zurückgegeben.
returnValue
Eigenschaft ihren Wert.document.getElementById("show-dialog").addEventListener("click", () => {
document.getElementById("dialog").showModal();
});
document.getElementById("close-dialog").addEventListener("click", () => {
document.getElementById("dialog").close();
});
Die im dialog-Element enthaltenen Inhalte sind ursprünglich nicht sichtbar.
Erst ein Klick auf den Button mit der id show-dialog
öffnet die Dialog-Box.
Ein Klick auf den close-dialog
Button schließt das Dialog-Fenster wieder mit der close()
-Methode.
::backdrop und :modal - Animation mit CSS
Bei modalen Dialogen ist die Webseite inaktiv, bis die Dialogbox geschlossen ist. Um dies zu kennzeichnen, wurde bereits im oberen Beispiel der Hintergrund ausge„blaut“.
Sie können den Hintergrund, aber auch das Öffnen mit CSS gestalten und auch animieren. Dabei wird häufig auf das vermeintlich Bewährte zurückgegriffen: Das Setzen und Entfernen einer Klasse. Zumindest für das Öffnen können Sie aber auch die :modal-Pseudoklasse als Selektor verwenden:
dialog:modal {
width: 20em;
background: #fffbf0;
border: thin solid #e7c157;
margin: 5em auto;
animation: show 1s ease normal;
}
@keyframes show{
from {
transform: translateY(-110%);
}
to {
transform: translateY(0%);
}
}
dialog::backdrop {
background: hsl(201 50% 40% /.5);
animation: none;
}
dialog[open]::backdrop {
animation: show-backdrop 2s ease forwards;
}
@keyframes show-backdrop {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
Die Dialog-Box wird beim Öffnen mit einer CSS-Animation von oben eingeschoben. Dies funktioniert in allen Browsern.
Das ::backdrop-Pseudoelement wird ebenfalls sanft eingeblendet. Dies funktioniert (Stand: Februar 2024) in allen Browsern außer dem Firefox. In diesem wird der Hintergrund ohne die Animation dargestellt. Eine Alternative wäre ein seitenfüllender box-shadow anstelle des ::backdrop-Elements oder ein seitenfüllendes, halbtransparentes Dialog-Element, das mit einem kleineren Kind-Element arbeitet.
Ein animiertes Schließen funktioniert (noch) nicht mit reinem CSS. Eine Alternative stellt Geckotang vor, der beim Schließen eine Klasse .hide
hinzufügt, die dialog und ::backdrop ausblendet und dann nach dem transitionend die Klasse wieder entfernt. [3][4]
Siehe auch
- Bildwechsler
- Lightbox
- Thumbnail und Großansicht
- Bildwechsler
- Lightbox
- Eigene modale Dialogfensteralert, confirm und prompt sind heute verpönt. Dieses Tutorial zeigt, wie man diese mit einem eigenen modalen Dialog nachbauen kann.
- Kontextmenü
- menu
- contextmenu-Event
- Zusammenfassung für längere Artikel
Weblinks
- ↑ WAHTWG: dialog element
- ↑ open-ui.org: Invokers (Explainer)
- ↑ <dialog> with animation by geckotang
- ↑ Dialogkomponente erstellen (und animieren) (web.dev)
- ↑ ::backdrop doesn’t inherit from anywhere (KilianValkhoff, 19 January 2023, )