Der Kunde möchte ein Modal: Beim Klick auf „Termin anfragen" soll sich ein Fenster über die Seite legen, abgedunkelter Hintergrund, schließbar per Button oder Escape-Taste. Der Reflex vieler Teams ist bis heute derselbe wie vor zehn Jahren – schnell eine Modal-Bibliothek eingebunden, ein paar Event-Listener dazu, fertig. Nur: Jedes dieser Skripte ist zusätzliches Gewicht, ein weiterer Baustein, der bei Updates bricht, und ein Stück Interaktivität, das ausfällt, sobald das JavaScript nicht lädt. Dazu kommt der Teil, der gern vergessen wird – Fokus einfangen, korrekt wieder freigeben, für Screenreader ankündigen. 2026 brauchst du für ein Modal nichts von alldem mehr.
Dieser Beitrag zeigt, wie du einen Dialog ohne JavaScript baust – mit dem HTML-Element <dialog> und den neuen Attributen command und commandfor, die seit Ende 2025 breit verfügbar sind. Und er ist ehrlich an der Stelle, an der es darauf ankommt: bei der Browser-Unterstützung und den Grenzen.
Dialog ohne JavaScript: das dialog-Element als Fundament
Das Fundament ist ein HTML-Element, das es in jedem aktuellen Browser gibt: <dialog>. Es bringt alles mit, was ein Modal ausmacht, von Haus aus – inklusive der Dinge, die man sonst mühsam nachbaut. Laut MDN öffnest du es als echtes modales Fenster, das sich über den gesamten übrigen Seiteninhalt legt und diesen inert – also nicht bedienbar – schaltet.
<dialog id="termin">
<form method="dialog">
<h2>Termin anfragen</h2>
<p>Wir melden uns innerhalb eines Werktags.</p>
<button>Schließen</button>
</form>
</dialog>
Drei Details nehmen dir hier Arbeit ab, für die früher Skript nötig war. Erstens der abgedunkelte Hintergrund: Er entsteht automatisch und lässt sich über das Pseudo-Element ::backdrop gestalten, etwa mit einer halbtransparenten Farbe und einem Weichzeichner. Zweitens das Schließen über ein Formular: Ein <form method="dialog"> schließt den Dialog beim Absenden ganz ohne Handler und liefert dir sogar den Wert des geklickten Buttons zurück. Und drittens der Fokus – der wichtigste Punkt für die Zugänglichkeit. Ein modal geöffneter Dialog fängt die Tastatur-Navigation ein, sodass man nicht versehentlich in die Seite dahinter tabbt, schließt auf Druck der Escape-Taste und gibt den Fokus beim Schließen an das auslösende Element zurück. Genau dieses Verhalten ist bei einer selbstgebauten Lösung die häufigste Fehlerquelle.
Noch komfortabler wird es mit dem jüngeren Attribut closedby. Setzt du closedby="any" auf den Dialog, lässt er sich auch per Klick außerhalb des Fensters schließen – das sogenannte Light-Dismiss-Verhalten, das Nutzerinnen und Nutzer von modernen Overlays erwarten und das man früher mit einem eigenen Klick-Handler auf den Hintergrund nachbauen musste. Auch das ist neuer und noch nicht überall verfügbar, taugt aber als sinnvolle Ergänzung dort, wo es unterstützt wird.
Was bislang noch fehlte, war das Öffnen selbst: <dialog> kennt zwar von sich aus kein Attribut, das es per Klick aufruft. Genau hier kam man früher um eine Zeile JavaScript (dialog.showModal()) nicht herum. Das hat sich geändert.
command und commandfor: Buttons, die ohne Skript steuern
Die neue Zutat heißt Invoker Commands API – zwei Attribute auf einem <button>, die ihn zur Fernbedienung für ein anderes Element machen. commandfor nennt die id des Zielelements, command die Aktion. Die MDN-Dokumentation beschreibt das Prinzip so: Beim Aktivieren des Buttons führt der Browser die Aktion selbst aus – für eingebaute Kommandos komplett ohne JavaScript.
Für Dialoge heißt das:
<button commandfor="termin" command="show-modal">Termin anfragen</button>
<dialog id="termin">
<h2>Termin anfragen</h2>
<button commandfor="termin" command="close">Schließen</button>
</dialog>
Mehr ist es nicht. Der erste Button öffnet den Dialog modal, der zweite schließt ihn – kein Listener, keine Bibliothek. Neben show-modal und close gibt es laut dem OpenReplay-Leitfaden auch request-close: Dieses Kommando bittet den Dialog nur zu schließen, sodass ein cancel-Ereignis den Vorgang noch abfangen kann – praktisch, wenn in einem Formular noch ungespeicherte Eingaben stehen.
Dasselbe Muster funktioniert für Popovers – also für kleine Overlays wie Hinweise, Menüs oder Bestätigungen, die nicht modal sein müssen. Mit toggle-popover, show-popover und hide-popover steuerst du jedes Element, das das popover-Attribut trägt. Wie du das für Tooltips mit präziser Positionierung nutzt, haben wir im Beitrag zu Tooltips ohne JavaScript gezeigt; die Invoker Commands sind die logische Ergänzung dazu, wenn ein Button das Overlay auslösen soll.
Wo die Grenzen liegen
Jetzt der ehrliche Teil. <dialog> samt ::backdrop und method="dialog" ist seit Jahren breit verfügbar und unkritisch. Die Attribute command und commandfor dagegen sind neu: Laut MDN gehören sie zu „Baseline 2025 – Newly available" und funktionieren seit Dezember 2025 in den aktuellen Versionen aller großen Browser. Das heißt zweierlei. Erstens: In topaktuellen Browsern läuft es überall. Zweitens: In älteren Versionen, die manche Kundinnen und Kunden noch nutzen, passiert beim Klick schlicht nichts.
Für ein zentrales Element wie „Modal öffnen" ist das zu riskant, solange die Attribute nicht den Status „widely available" erreicht haben. Die pragmatische Lösung ist Progressive Enhancement: Du baust die Buttons mit command/commandfor und legst eine kurze JavaScript-Zeile als Auffangnetz darüber, die nur dort greift, wo die Attribute noch nicht unterstützt werden. Du prüfst einmal, ob "command" in HTMLButtonElement.prototype existiert; falls nicht, verdrahtest du das Öffnen klassisch per showModal(). So bekommen moderne Browser die skriptfreie Variante, alle anderen eine funktionierende. Den jeweils aktuellen Stand der Unterstützung prüfst du am besten über Baseline bzw. webstatus.dev, bevor du dich auf ein Feature verlässt – ein Reflex, der sich generell bei neuen Web-Features lohnt, wie wir in der Übersicht zu Baseline 2026 beschrieben haben.
Was das für die Barrierefreiheit bedeutet
Der eigentliche Gewinn liegt nicht beim eingesparten Code, sondern bei der Zugänglichkeit. Die Fokus-Verwaltung, das Einfangen der Tastatur, das Schließen per Escape, die korrekte Ankündigung als Dialog – all das liefert die Plattform, ohne dass du ein einziges aria-Attribut von Hand setzen musst. Bei selbstgebauten Modals ist genau das die Stelle, an der es in der Praxis am häufigsten hakt: Der Hintergrund bleibt bedienbar, der Fokus landet nach dem Schließen irgendwo, Screenreader verlieren den Faden.
Für Agenturen ist das mehr als Kür. Mit dem Barrierefreiheitsstärkungsgesetz sind viele Websites und Shops seit 2025 zur Barrierefreiheit verpflichtet – was das konkret heißt, haben wir im Beitrag zur Barrierefreiheits-Pflicht eingeordnet. Ein natives <dialog> bringt dich diesem Ziel ohne Zusatzaufwand näher, während ein selbstgebautes Overlay ohne saubere Fokus-Logik schnell zum Mangel wird.
Wann sich der native Weg lohnt – und wann nicht
Für den Großteil der Modal-Fälle im Agenturalltag ist der native Weg heute die richtige Wahl: Terminanfragen, Bestätigungsdialoge („Wirklich löschen?"), kurze Formulare, Newsletter-Hinweise, Bild-Lightboxen. Du sparst dir eine Abhängigkeit, der Code ist kürzer und robuster, und die Barrierefreiheit kommt gratis mit. Dasselbe Prinzip – weniger Fremdskripte, mehr native Bausteine – zieht sich durch die ganze Reihe, vom Akkordeon ohne JavaScript bis zum Styling des select-Elements.
Grenzen gibt es trotzdem. Braucht ein Dialog komplexe, verschachtelte Zustände, mehrstufige Abläufe oder eng getaktete Animationen, bist du irgendwann wieder bei JavaScript – und das ist in Ordnung. Der Punkt ist nicht, Skript um jeden Preis zu vermeiden, sondern es nicht mehr für den Standardfall zu brauchen. Wer ein ganzes Framework samt Modal-Komponente einbindet, nur um ein einziges Bestätigungsfenster zu zeigen, zahlt dafür mit Ladezeit und Wartungsaufwand – an beidem haben am Ende weder du noch der Kunde ein Interesse.
Fazit
Ein Dialog ohne JavaScript ist 2026 kein Kunststück mehr, sondern der naheliegende Weg. Das <dialog>-Element liefert Hintergrund, Fokus-Verwaltung und Tastatur-Bedienung von Haus aus, und mit command und commandfor öffnen und schließen ihn Buttons ganz ohne Skript. Weil die beiden Attribute erst seit Ende 2025 breit verfügbar sind, gehört für zentrale Elemente ein kurzes JavaScript-Auffangnetz dazu – aber das ändert nichts am Gewinn: weniger Abhängigkeiten, kürzerer Code und eine Barrierefreiheit, die du sonst mühsam nachrüsten müsstest. Für die meisten Modals in Kundenprojekten ist das die bessere Grundlage als die nächste Bibliothek.
- Das HTML-Element dialog liefert Modal-Fenster inklusive abgedunkeltem Hintergrund (::backdrop), Formular-Schließen (method="dialog") und Fokus-Verwaltung von Haus aus.
- Mit den neuen Attributen command und commandfor öffnen und schließen Buttons einen Dialog komplett ohne JavaScript – ebenso Popovers über toggle-popover.
- command und commandfor sind erst seit Dezember 2025 breit verfügbar (Baseline 2025); für zentrale Elemente gehört ein kurzes JavaScript-Auffangnetz als Progressive Enhancement dazu.
- Der größte Gewinn ist die Barrierefreiheit: Fokus einfangen, Escape-Schließen und korrekte Screenreader-Ankündigung kommen ohne eigene aria-Attribute aus dem Browser.
- Für Standard-Modals wie Bestätigungen, Terminanfragen oder Lightboxen ersetzt der native Weg die nächste Bibliothek – bei komplexen Abläufen bleibt JavaScript berechtigt.