Signatur
Beschreibung
showPopover() öffnet ein Element, das mit dem globalen HTML-Attribut popover als Popover markiert ist. Das Element wird in den Top Layer gelegt. Dadurch erscheint es über allen anderen Inhalten, und zwar unabhängig von z-index, overflow: hidden oder dem Stapelkontext der Eltern-Elemente. Das entspricht dem Verhalten eines Buttons mit popovertarget, nur dass du es per Skript auslöst.
Wie sich das Popover verhält, hängt vom Wert des Attributs ab:
popoverbzw.popover="auto": Das Popover schließt sich von selbst (Light Dismiss), wenn man außerhalb klickt oder Esc drückt. Andere offeneauto-Popover, die nicht seine Vorfahren sind, werden dabei geschlossen.popover="manual": Das Popover bleibt offen, bis es ausdrücklich geschlossen wird, etwa mithidePopover()odertogglePopover(). Das eignet sich für Toasts und Benachrichtigungen.popover="hint"(neuer, noch nicht überall unterstützt): für Tooltips. Solche Popover schließen keine offenenauto-Popover.
Vor dem Öffnen wird das abbrechbare Ereignis beforetoggle ausgelöst (newState: "open"), danach asynchron das Ereignis toggle. Über die Option source gibst du ein auslösendes Element an. Dann funktionieren Tastatur-Fokus-Navigation, Barrierefreiheits-Beziehungen und die implizite CSS-Anchor-Positionierung genauso wie bei popovertarget.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $options | object | Optionales Konfigurationsobjekt. Es wird nur in neueren Browsern unterstützt (z. B. ab Chrome 133). | |
| $options.source | HTMLElement | Das Element, das das Popover auslöst (meist ein Button). Es stellt eine implizite Anker- und Barrierefreiheits-Beziehung her, wie popovertarget. |
Rückgabewert
undefined).Beispiele
Popover per Skript öffnen
// HTML: <div id="info" popover>Gespeichert!</div>
// <button id="save">Speichern</button>
const info = document.getElementById('info');
document.getElementById('save').addEventListener('click', () => {
info.showPopover();
console.log(info.matches(':popover-open'));
});
Toast mit popover="manual", der sich selbst schließt
// HTML: <div id="toast" popover="manual"></div>
const toast = document.getElementById('toast');
const notify = (message, ms = 3000) => {
toast.textContent = message;
if (!toast.matches(':popover-open')) {
toast.showPopover();
}
clearTimeout(notify.timer);
notify.timer = setTimeout(() => toast.hidePopover(), ms);
};
notify('Datei erfolgreich hochgeladen');
Auf beforetoggle/toggle reagieren und Öffnen verhindern
// HTML: <div id="menu" popover>…</div>
const menu = document.getElementById('menu');
let locked = false;
menu.addEventListener('beforetoggle', (event) => {
if (event.newState === 'open' && locked) {
event.preventDefault(); // Öffnen abbrechen
}
});
menu.addEventListener('toggle', (event) => {
console.log(`Popover ist jetzt: ${event.newState}`);
});
menu.showPopover();
Mit source-Option und Feature-Erkennung
// HTML: <button id="trigger">Hilfe</button>
// <div id="help" popover>Kurze Hilfe…</div>
const trigger = document.getElementById('trigger');
const help = document.getElementById('help');
const supportsPopover = HTMLElement.prototype.hasOwnProperty('popover');
trigger.addEventListener('click', () => {
if (!supportsPopover) {
help.hidden = false; // einfacher Rückfall
return;
}
try {
// Ältere Browser ignorieren das Options-Objekt einfach
help.showPopover({ source: trigger });
} catch (err) {
console.error(err.name, err.message);
}
});
// Wichtig · Fallstricke
- Ausnahmen: Hat das Element kein
popover-Attribut, wird eineNotSupportedError-DOMExceptiongeworfen. EineInvalidStateErrorentsteht, wenn das Element nicht im Dokument hängt oder ein modal geöffnetes<dialog>ist. - Bereits geöffnet: Nach der aktuellen Spezifikation passiert beim erneuten Aufruf auf einem offenen Popover nichts. Frühe Implementierungen haben dagegen eine
InvalidStateErrorgeworfen. Prüfe deshalb vorher mitel.matches(':popover-open'), ob das Popover schon offen ist. - Wenn
beforetogglemitpreventDefault()abgebrochen wird, bleibt das Popover geschlossen, und zwar ohne Fehlermeldung. - Das Öffnen eines
auto-Popovers schließt andere offeneauto-Popover, die nicht seine Vorfahren sind. Bei verschachtelten Menüs kommt es deshalb auf die DOM-Struktur bzw. diesource-Beziehung an. - Positionierung: Standardmäßig wird ein Popover per UA-Stylesheet mittig im Viewport angezeigt. Für eine Ausrichtung am Auslöser brauchst du CSS Anchor Positioning (noch nicht überall verfügbar) oder eigenes JavaScript.
- Kompatibilität: Baseline seit April 2024 (Chrome/Edge 114, Safari 17, Firefox 125). Die Option
sourceundpopover="hint"sind neuer und noch nicht in allen Browsern verfügbar. Für ältere Browser gibt es ein Polyfill (@oddbird/popover-polyfill).