Das popover-Attribut

Zuletzt aktualisiert am 3. Juli 2026

Dropdown-Menüs, Tooltips, Onboarding-Hinweise, Toast-Meldungen: All diese kleinen Overlays waren jahrelang reine JavaScript-Handarbeit. Ein Klick-Handler zum Öffnen, ein zweiter zum Schließen, ein ESC-Listener, ein z-index, der hoch genug ist, und ein Klick-außerhalb-Check obendrauf. Mit dem globalen popover-Attribut erledigt der Browser das alles selbst. In vielen Fällen brauchst du dafür keine einzige Zeile JavaScript.

Was ist ein Popover?

Ein Popover ist ein Element, das über dem restlichen Seiteninhalt eingeblendet wird, ohne die Seite zu blockieren. Du kannst weiterhin scrollen, klicken und tippen. Typische Beispiele:

  • Aufklappende Menüs und Aktionslisten
  • Tooltips und Hilfetexte
  • Hinweise wie “In den Warenkorb gelegt”
  • Kleine Einstellungs-Panels

Das Besondere: popover ist ein globales Attribut. Du kannst es auf fast jedes Element setzen, meistens landet es auf einem <div>. Ein Element mit popover ist standardmäßig unsichtbar und wird erst beim Öffnen angezeigt.

Ein Popover ohne JavaScript öffnen

Du brauchst nur zwei Zutaten: ein Element mit popover und einer id, dazu einen <button> mit popovertarget, der auf diese id zeigt.

Popover nur mit HTML
<button popovertarget="info-popover">
  Popover öffnen
</button>

<div id="info-popover" popover>
  <strong>Hallo!</strong>
  <p>Ich bin ein Popover. Klick daneben oder
    drücke ESC, um mich zu schließen.</p>
</div>
Vorschau

Das war alles. Der Button öffnet das Popover, ein zweiter Klick schließt es wieder. Der Browser kümmert sich um das Ein- und Ausblenden, die ESC-Taste und den Klick daneben.

Wichtig: popovertarget funktioniert nur auf Buttons, also auf <button> oder <input> mit einem Button-Typ. Auf einem <div> oder <a> hat das Attribut keine Wirkung.

Standardmäßig zentriert der Browser das Popover in der Mitte des Viewports. Mit CSS kannst du es beliebig positionieren, zum Beispiel unter den auslösenden Button.

popovertargetaction: show, hide, toggle

Ohne weitere Angabe toggelt ein Button mit popovertarget das Popover: Erster Klick öffnet, zweiter Klick schließt. Mit popovertargetaction legst du das Verhalten genauer fest:

WertVerhalten
showÖffnet das Popover (tut nichts, wenn es schon offen ist)
hideSchließt das Popover
toggleÖffnet oder schließt, je nach Zustand (Standard)

Damit kannst du zum Beispiel einen eigenen Schließen-Button in das Popover setzen:

popovertargetaction
<button popovertarget="mein-popover" popovertargetaction="show">
  Anzeigen
</button>
<button popovertarget="mein-popover" popovertargetaction="hide">
  Verstecken
</button>
<button popovertarget="mein-popover" popovertargetaction="toggle">
  Umschalten
</button>

<div id="mein-popover" popover="manual">
  Ich lasse mich nur über die Buttons steuern.
</div>
Vorschau

auto vs. manual: Light Dismiss

Das popover-Attribut kennt zwei Werte, die das Schließ-Verhalten steuern. Schreibst du nur popover ohne Wert, gilt popover="auto".

popover="auto" bringt das sogenannte Light Dismiss mit: Ein Klick irgendwo außerhalb des Popovers schließt es, genauso wie die ESC-Taste. Öffnest du ein zweites auto-Popover, schließt sich das erste automatisch (außer die Popovers sind ineinander verschachtelt). Genau das Verhalten, das du von einem Dropdown-Menü erwartest.

popover="manual" schaltet Light Dismiss ab: Kein Klick daneben und keine ESC-Taste schließt das Popover. Es bleibt offen, bis es explizit geschlossen wird, per Button mit popovertargetaction="hide" oder per JavaScript. Außerdem können mehrere manuelle Popovers gleichzeitig offen sein. Das passt für Toast-Benachrichtigungen oder Panels, die der Nutzer bewusst wegklicken soll.

auto vs. manual
<button popovertarget="auto-pop">auto öffnen</button>
<button popovertarget="manual-pop">manual öffnen</button>

<div id="auto-pop" popover="auto">
  popover="auto": Klick daneben oder ESC
  schließt mich.
</div>

<div id="manual-pop" popover="manual">
  <p>popover="manual": Ich bleibe offen,
    bis du unten klickst.</p>
  <button popovertarget="manual-pop" popovertargetaction="hide">
    Schließen
  </button>
</div>
Vorschau
Verhaltenpopover="auto"popover="manual"
Klick daneben schließtJaNein
ESC schließtJaNein
Mehrere gleichzeitig offenNein, das neue schließt das alteJa
Typischer EinsatzMenüs, Hinweise, AuswahlToasts, dauerhafte Panels

Der Top Layer: Schluss mit dem z-index-Kampf

Vielleicht kennst du das: Ein Overlay soll über allem liegen, aber irgendein Element mit z-index: 9999 schiebt sich trotzdem davor. Oder ein Eltern-Element mit overflow: hidden schneidet dein Dropdown ab.

Popovers haben dieses Problem nicht, denn der Browser rendert sie im Top Layer. Das ist eine spezielle Ebene, die immer über dem gesamten restlichen Seiteninhalt liegt. Modale Dialoge und der Vollbildmodus nutzen dieselbe Ebene. Das bedeutet für dich:

  • Kein z-index nötig, egal was der Rest der Seite treibt
  • Kein Abschneiden durch overflow: hidden auf Eltern-Elementen
  • Keine Probleme mit Stacking Contexts von transform oder filter

Du kannst das Popover irgendwo tief in deinem HTML verschachteln, es liegt beim Öffnen trotzdem über allem.

Styling mit :popover-open und ::backdrop

Ein offenes Popover erreichst du in CSS über die Pseudo-Klasse :popover-open. Die Fläche dahinter stylst du mit dem Pseudo-Element ::backdrop, genau wie beim <dialog>. Standardmäßig ist der Backdrop bei Popovers komplett durchsichtig.

Popover stylen
<style>
  #styled-popover {
    border: none;
    border-radius: 14px;
    padding: 20px 24px;
    box-shadow: 0 12px 40px rgba(0, 0, 0, 0.25);
  }

  /* Fläche hinter dem Popover abdunkeln */
  #styled-popover::backdrop {
    background: rgba(15, 23, 42, 0.4);
  }

  /* Nur im offenen Zustand animieren */
  #styled-popover:popover-open {
    animation: pop-in 0.2s ease-out;
  }

  @keyframes pop-in {
    from { opacity: 0; transform: scale(0.95); }
    to { opacity: 1; transform: scale(1); }
  }
</style>

<button popovertarget="styled-popover">
  Gestyltes Popover öffnen
</button>

<div id="styled-popover" popover>
  <h2>Schick!</h2>
  <p>Abgedunkelter Hintergrund, Animation
    und Schatten: alles nur CSS.</p>
</div>
Vorschau

Ein Hinweis zum Verstecken: Der Browser blendet geschlossene Popovers über display: none aus. Setze deshalb kein eigenes display direkt auf [popover], sonst ist das Popover dauerhaft sichtbar. Wenn du zum Beispiel Flexbox brauchst, gehört das auf :popover-open (mehr dazu unter “Häufige Fehler”).

Die JavaScript-API im Überblick

Für alles, was über Buttons hinausgeht, gibt es eine kleine JavaScript-API. Sie besteht aus drei Methoden und zwei Events:

APIZweck
showPopover()Öffnet das Popover
hidePopover()Schließt das Popover
togglePopover()Öffnet oder schließt, je nach Zustand
beforetoggleEvent, feuert direkt vor dem Öffnen/Schließen
toggleEvent, feuert nach dem Öffnen/Schließen

Beide Events liefern über event.oldState und event.newState die Zustände "open" und "closed". beforetoggle eignet sich zum Beispiel, um Inhalte erst beim Öffnen nachzuladen.

Popover per JavaScript steuern
<button id="js-toggle" type="button">
  Per JavaScript umschalten
</button>
<p id="js-status">Status: geschlossen</p>

<div id="js-popover" popover="manual">
  Dieses Popover wird per JavaScript gesteuert.
</div>

<script>
  const pop = document.getElementById("js-popover");

  document.getElementById("js-toggle")
    .addEventListener("click", () => {
      pop.togglePopover();
    });

  pop.addEventListener("beforetoggle", (event) => {
    const status = event.newState === "open"
      ? "offen"
      : "geschlossen";
    document.getElementById("js-status")
      .textContent = "Status: " + status;
  });
</script>
Vorschau

Popover oder dialog?

Auf den ersten Blick wirken Popover und <dialog> sehr ähnlich: Beide legen Inhalte über die Seite, beide landen im Top Layer, beide kennen ::backdrop. Der entscheidende Unterschied: Ein Popover ist nicht-modal.

  • Kein Fokus-Trap: Beim Popover kann der Nutzer weiter durch die restliche Seite tabben. Ein modaler Dialog (showModal()) hält den Fokus dagegen im Dialog fest.
  • Seite bleibt bedienbar: Hinter einem Popover kannst du weiter klicken und scrollen. Ein modaler Dialog blockiert alles andere.
FragePopover<dialog> mit showModal()
Blockiert die restliche Seite?NeinJa
Fokus-TrapNeinJa
Light DismissJa, bei autoNein, nur ESC
Öffnen ohne JavaScriptJa, per popovertargetNein
Typischer EinsatzMenüs, Tooltips, ToastsBestätigungen, Formulare

Die Faustregel: Muss der Nutzer reagieren, bevor es weitergeht (etwas bestätigen, ein Formular ausfüllen), nimm <dialog> mit showModal(). Soll die Seite bedienbar bleiben (Menü, Hinweis, Tooltip), nimm ein Popover.

Ausblick: popover=“hint”

Neben auto und manual gibt es noch einen dritten Wert: popover="hint". Er ist für Tooltips gedacht, die sich neben einem offenen auto-Popover zeigen sollen, ohne es zu schließen. Ein hint-Popover schließt also keine auto-Popovers, wohl aber andere hint-Popovers, und unterstützt Light Dismiss.

popover="hint" ist noch nicht in allen Browsern verfügbar, Safari unterstützt den Wert bisher nicht. Für den produktiven Einsatz solltest du deshalb vorerst bei auto und manual bleiben.

Barrierefreiheit

Die Kombination aus Button und popovertarget bringt viel Barrierefreiheit automatisch mit: Der Browser verknüpft Button und Popover im Accessibility-Tree und pflegt aria-expanded auf dem Button, so wissen Screenreader-Nutzer, ob das Popover gerade offen ist. Ein paar Dinge bleiben trotzdem bei dir:

  • DOM-Reihenfolge beachten: Da es keinen Fokus-Trap gibt, tabben Tastaturnutzer vom Button aus weiter. Platziere das Popover im HTML direkt hinter dem auslösenden Button, damit die Tab-Reihenfolge logisch bleibt.
  • manual braucht einen Schließen-Weg: Bei popover="manual" gibt es weder ESC noch Klick daneben. Baue immer einen klar erkennbaren Schließen-Button ein.
  • Keine kritischen Abfragen im Popover: Ein Popover kann leicht übersehen oder versehentlich weggeklickt werden. Für Entscheidungen, die der Nutzer treffen muss, ist ein modaler Dialog die bessere Wahl.
  • Nicht nur per Hover öffnen: Ein Popover, das nur bei Maus-Hover erscheint, ist für Tastatur- und Touch-Nutzer unerreichbar. Sorge dafür, dass es auch per Klick oder Fokus erreichbar ist.

Mehr Grundlagen findest du im Artikel Barrierefreiheit.

Häufige Fehler

  • popovertarget auf dem falschen Element: Das Attribut funktioniert nur auf <button> und <input> mit Button-Typ. Auf einem <div> oder <a> passiert schlicht nichts.
  • id vergessen oder vertippt: Zeigt popovertarget auf eine id, die es nicht gibt, bleibt der Klick wirkungslos. Der Browser wirft dabei keinen Fehler, was die Suche erschwert. Prüfe als Erstes, ob beide Werte exakt übereinstimmen.
  • Eigenes display auf dem Popover: [popover] { display: flex; } überschreibt das eingebaute Verstecken, das Popover ist dann dauerhaft sichtbar. Richtig: [popover]:popover-open { display: flex; }.
  • Popover als Modal missbrauchen: Ein Popover hat keinen Fokus-Trap und blockiert die Seite nicht. Für Bestätigungsdialoge und Pflicht-Eingaben ist <dialog> mit showModal() zuständig.
  • manual ohne Schließen-Button: Ein manuelles Popover ohne eigenen Schließen-Weg bleibt für immer offen. Ergänze einen Button mit popovertargetaction="hide".

Browser-Kompatibilität

Das popover-Attribut mit den Werten auto und manual, die Buttons mit popovertarget sowie die JavaScript-API werden von allen modernen Browsern unterstützt. Nur der Wert hint ist noch nicht überall angekommen.

ClientUnterstützungHinweise
ChromeKomplett
FirefoxKomplett
SafariKomplettpopover="hint" wird noch nicht unterstützt
EdgeKomplett
OperaKomplett

Zusammenfassung

BausteinZweck
popover / popover="auto"Overlay mit Light Dismiss (Klick daneben, ESC)
popover="manual"Overlay, das explizit geschlossen werden muss
popovertargetButton deklarativ mit einem Popover verbinden
popovertargetactionshow, hide oder toggle (Standard)
:popover-openOffenes Popover per CSS stylen
::backdropFläche hinter dem Popover stylen
showPopover() & Co.Steuerung und Events per JavaScript

Popovers decken den nicht-modalen Teil der Overlay-Welt ab. Für den modalen Teil, also blockierende Dialoge mit Fokus-Trap, schau dir das <dialog>-Element an.

Bleib auf dem Laufenden

Erhalte neue Inhalte direkt in dein Postfach

Mit der Anmeldung akzeptierst du unsere Datenschutzerklärung. Du kannst dich jederzeit über den Link in den E-Mails wieder abmelden.

Was erwartet dich?

Neue Artikel & Videos

Wenn ich was Neues veröffentliche, erfährst du's hier zuerst.

Plattform & Kurs-Updates

Neue Kurse, Referenz-Updates und gelegentlich Sonderpreise zum Launch.

Einmal die Woche in deinem Postfach

Kurz, auf den Punkt, kein Spam.