Signatur
Beschreibung
Die Eigenschaft document.pictureInPictureEnabled gehört zur Picture-in-Picture-API und liefert true, wenn das Dokument Videos per HTMLVideoElement.requestPictureInPicture() in ein schwebendes, immer im Vordergrund liegendes Fenster auslagern darf. Andernfalls ist der Wert false.
Der Wert kann aus mehreren Gründen false sein: Der Nutzer hat die Funktion in den Browsereinstellungen abgeschaltet, eine Permissions Policy (picture-in-picture) verbietet sie – etwa in einem <iframe> ohne passendes allow-Attribut – oder die Plattform unterstützt den Modus grundsätzlich nicht.
Typischer Einsatz: Vor dem Anzeigen eines eigenen „Bild-in-Bild“-Buttons in einem Videoplayer prüfen, ob die Funktion verfügbar ist, und den Button sonst ausblenden oder deaktivieren. Zusätzlich sollte man das Attribut disablePictureInPicture des jeweiligen Videos berücksichtigen.
Rückgabewert
true, wenn der Bild-in-Bild-Modus im Dokument verfügbar ist, sonst false. In Browsern ohne Unterstützung der API ist die Eigenschaft undefined.Beispiele
Einfache Verfügbarkeitsprüfung
// Prüft Unterstützung und Freigabe in einem Schritt
const pipAvailable = 'pictureInPictureEnabled' in document && document.pictureInPictureEnabled;
console.log(`Bild-in-Bild verfügbar: ${pipAvailable}`);
PiP-Button nur bei Verfügbarkeit anzeigen
const video = document.querySelector('#player');
const pipButton = document.querySelector('#pip-button');
const canUsePip = () =>
document.pictureInPictureEnabled === true && !video.disablePictureInPicture;
pipButton.hidden = !canUsePip();
pipButton.addEventListener('click', async () => {
try {
if (document.pictureInPictureElement) {
await document.exitPictureInPicture();
} else {
await video.requestPictureInPicture();
}
} catch (err) {
console.error('Bild-in-Bild fehlgeschlagen:', err.name, err.message);
}
});
Button-Zustand an Metadaten des Videos koppeln
const video = document.querySelector('video');
const button = document.querySelector('#pip-button');
const updateButton = () => {
// Ohne geladene Metadaten schlägt requestPictureInPicture() fehl
button.disabled = !document.pictureInPictureEnabled || video.readyState === 0;
};
video.addEventListener('loadedmetadata', updateButton);
video.addEventListener('emptied', updateButton);
updateButton();
console.log('Button deaktiviert:', button.disabled);
// Wichtig · Fallstricke
- Browser-Kompatibilität: Unterstützt in Chromium-Browsern (Chrome, Edge, Opera) und Safari. Firefox bietet zwar eine eigene Bild-in-Bild-Schaltfläche im Browser, implementiert die API aber nicht – dort ist
document.pictureInPictureEnabledundefined. Daher immer per'pictureInPictureEnabled' in documentoder strengem Vergleich auftrueprüfen. - iframes: In eingebetteten Frames ist der Wert
false, wenn die Permissions Policypicture-in-picturenicht erlaubt ist. Lösung:<iframe allow="picture-in-picture">. truegarantiert keinen Erfolg:requestPictureInPicture()erfordert zusätzlich eine Nutzerinteraktion (transiente Aktivierung), geladene Metadaten und kein gesetztesdisablePictureInPicture; sonst wird das Promise mitNotAllowedErrorbzw.InvalidStateErrorabgelehnt.- Die Eigenschaft ist schreibgeschützt; Zuweisungen werden ignoriert (im Strict Mode ggf.
TypeError). - Für beliebige HTML-Inhalte statt Videos gibt es die neuere Document Picture-in-Picture API (
window.documentPictureInPicture, nur Chromium).