docs.rodeo

MDN Web Docs mirror

Picture-in-Picture API

{{DefaultAPISidebar("Picture-in-Picture API")}} 

The Picture-in-Picture API allow websites to create a floating, always-on-top video window. This allows users to continue consuming media while they interact with other sites or applications on their device.

[!NOTE] The Document Picture-in-Picture API extends the Picture-in-Picture API to allow the always-on-top window to be populated with any arbitrary HTML content, not just a video.

Interfaces

Instance methods

The Picture-in-Picture API adds methods to the {{DOMxRef("HTMLVideoElement")}}  and {{DOMxRef("Document")}}  interfaces to allow toggling of the floating video window.

Instance methods on the HTMLVideoElement interface

Instance methods on the Document interface

Instance properties

The Picture-in-Picture API augments the {{DOMxRef("HTMLVideoElement")}} , {{DOMxRef("Document")}} , and {{DOMxRef("ShadowRoot")}}  interfaces with properties that can be used to determine if the floating video window mode is supported and available, if picture-in-picture mode is currently active, and which video is floating.

Instance properties on the HTMLVideoElement interface

Instance properties on the Document interface

Instance properties on the Document or ShadowRoot interfaces

Events

The Picture-in-Picture API defines three events, which can be used to detect when picture-in-picture mode is toggled and when the floating video window is resized.

Adding Controls

If media action handlers have been set via the Media Session API, then appropriate controls for those actions will be added by the browser to the picture-in-picture overlay. For example, if a "nexttrack" action has been set, then a skip button might be displayed in the picture-in-picture view. There is no support for adding custom HTML buttons or controls.

Controlling styling

The :picture-in-picture CSS pseudo-class matches the video element currently in picture-in-picture mode, allowing you to configure your stylesheets to automatically adjust the size, style, or layout of content when a video switches back and forth between picture-in-picture and traditional presentation modes.

Controlling access

The availability of picture-in-picture mode can be controlled using Permissions Policy. The picture-in-picture mode feature is identified by the string "picture-in-picture", with a default allowlist value of *, meaning that picture-in-picture mode is permitted in top-level document contexts, as well as to nested browsing contexts loaded from the same origin as the top-most document.

Examples

In this example, a video is presented in a web page. Clicking the button below lets the user toggle the floating video window.

{{EmbedGHLiveSample("dom-examples/picture-in-picture/index.html", '100%', 350)}} 

Toggling picture-in-picture mode

This code is called by a click handler when the user clicks the “Toggle Picture-in-Picture” button:

function togglePictureInPicture() {
  if (document.pictureInPictureElement) {
    document.exitPictureInPicture();
  } else if (document.pictureInPictureEnabled) {
    video.requestPictureInPicture();
  }
}

This block starts by looking at the value of the {{DOMxRef("Document", "document")}} 's pictureInPictureElement attribute.

If the value is not null, it’s the element that’s currently in picture-in-picture mode, that is in a floating window. We call {{DOMxRef("Document.exitPictureInPicture", "document.exitPictureInPicture()")}}  to bring the video back into its initial box.

If the value is null, no video is in the floating window. So we can request a video to enter the picture-in-picture mode. We do it by calling {{DOMxRef("HTMLVideoElement.requestPictureInPicture()")}}  on the {{HTMLElement("video")}}  element.

Specifications

{{Specifications}} 

Browser compatibility

{{Compat}} 

See also

In this article

View on MDN