Dialoge mit dem closedby-Attribut aufwerten

Erstellt am

Das native HTML-Element <dialog> ist einfach großartig. Damit lassen sich auf einfache Weise barrierefreie Modal-Dialoge erstellen, die für alle Nutzer:innen gut funktionieren. Und es wird seit 2022 von allen modernen Browsern unterstützt.

Aber es wird noch besser: Mit dem neuen Attribut closedby könnt ihr festlegen, durch welche Aktionen der Dialog geschlossen wird. Ihr könnt ein Light-Dismiss-Verhalten hinzufügen oder genau das Gegenteil tun: z.B. verhindern, dass der Dialog durch Drücken der ESC Taste geschlossen wird.

Zwei weiße Sprechblasen auf pinkem Hintergrund.

Wir sehen uns die technische Spezifikation sowie ein paar Anwendungsfälle für das neue Attribut an.

So funktioniert es

Die HTML-Spezifikation definiert closedby als ein enumeriertes Attribut mit den folgenden Werten:

Wenn ihr das Attribut closedby nicht für einen Modaldialog definiert, verhält dieser sich so, als wäre der Wert closerequest . Das bedeutet, dass der Dialog durch Drücken der ESC Taste auf Desktop-Plattformen oder durch eine „Zurück“- oder „Schließen“-Geste auf mobilen Plattformen geschlossen wird.

Anwendungsfälle

Light-Dismiss für Informations-Dialoge

Manche Dialoge dienen lediglich der Darstellung von Information. Von Benutzer:innen wird nicht erwartet, dass diese eine Entscheidung treffen oder ein Formular ausfüllen. Meiner Meinung nach ein idealer Anwendungsfall für Light-Dismiss: Das Dialogfeld sollte sich schließen, wenn man außerhalb des Feldes klickt oder tippt.

Bevor es das closedby Attribut gab, war zusätzlicher JavaScript-Code erforderlich, um das Schließen des Dialoges zu implementieren. Ein Beispiel findet ihr in meinem Artikel „Warum du das native Dialog-Element nutzen solltest“. Zum Glück benötigen wir jetzt nur noch den folgenden HTML-Code:

<dialog closedby="any">
    <!-- content -->
</dialog>

Genial! 🥳

Versehentliches Schließen verhindern

Dialogfelder eignen sich hervorragend, um Arbeitsabläufe wie beispielsweise die Dateneingabe über ein Formular zu kapseln. Auch den Onboarding-Prozess für eine Webanwendung könnt ihr mithilfe eines Dialogs abwickeln.

In diesen Fällen solltet ihr verhindern, dass Nutzer:innen den Dialog versehentlich schließen, z.B. über die ESC Taste. Andernfalls gingen die Daten verloren, die bereits in das Formular eingegeben wurden. Oder man könnte den Onboarding-Dialog nicht erneut aufrufen.

Daher solltet ihr closedby=“none” auf das Dialogelement setzen. Nun können Nutzer das Dialogfeld nur noch über einen von der Entwicklerin festgelegten Mechanismus schließen, beispielsweise über eine Schaltfläche zum Schließen. Hier ein Beispiel:

<dialog id="mydialog" closedby="none">
    <!-- content -->
    <button commandfor="mydialog" command="close">
        Continue
    </button>
</dialog>

Vielleicht kennt ihr die Attribute command und commandfor für Button-Elemente noch nicht. Sie sind Teil eines neuen Web-Features namens Invoker Commands API. Ihr müsst sie nicht unbedingt verwenden. Aber ich mag ihre Einfachheit und Eleganz, deshalb wollte ich sie in mein Codebeispiel aufnehmen. 😉

Browser-Unterstützung

Das closedby Attribut wird bereits von Firefox, Chrome und Edge unterstützt. Dank Interop 2026 sollte auch Safari/WebKit bis Ende des Jahres nachziehen.

Erstellt am