<media-pip-button>

The <media-pip-button> component is used to toggle the picture-in-picture mode of the video.

The contents of <media-pip-button> will update based on the PiP state and availability.

  • When the media is not in PiP mode, the component will display the contents of the enter slot.
  • When the media is PiP mode, the component will display the contents of the exit slot.

NOTE: picture-in-picture support isn’t available in all browsers. Interacting with these examples may not do anything when support isn’t available.

<media-controller defaultsubtitles>
  <video
    playsinline muted crossorigin
    slot="media"
    src="https://stream.mux.com/A3VXy02VoUinw01pwyomEO3bHnG4P32xzV7u1j1FSzjNg/low.mp4"
  ></video>
  <media-pip-button></media-pip-button>
</media-controller>

You can modify the contents of the <media-pip-button> component using slots. This is useful if you’d like to use your own custom PiP icon instead of the default one provided by media-chrome.

Here’s an example of how you can replace the default PiP icons with the words “Enter” and “Exit”

<media-controller defaultsubtitles>
  <video
    playsinline muted crossorigin
    slot="media"
    src="https://stream.mux.com/A3VXy02VoUinw01pwyomEO3bHnG4P32xzV7u1j1FSzjNg/low.mp4"
  ></video>
  <media-pip-button>
    <span slot="enter">Enter</span>
    <span slot="exit">Exit</span>
  </media-pip-button>
</media-controller>

Alternatively, if you would like to represent both states using a single element you could use the icon slot instead. This is useful for creating an animated icon that transitions between states. Here’s a basic example that uses CSS to change an element based on the picture-in-picture state.

.my-icon {
  font-size: 16px;
  font-weight: 700;
  transition: color .4s;
}

media-pip-button:not([mediaispip]) .my-icon span:last-child,
media-pip-button[mediaispip] .my-icon span:first-child {
  display: none;
}

media-pip-button[mediaispip] .my-icon {
  color: coral;
}

The <media-pip-button> doesn’t expose any configuration attributes. However, it will be updated with Media UI Attributes any time the PiP state and availability changes.

You can use these attributes to style the button. For example, hide the button if PiP is unavailable:

media-pip-button:not([mediapipunavailable]) {
  display: none;
}

Or make the background blue if the media is in PiP mode.

media-pip-button[mediaispip] {
  --media-control-background: blue;
}
NameDescription
enterAn element shown when the media is not in PIP mode and pressing the button will trigger entering PIP mode.
exitAn element shown when the media is in PIP and pressing the button will trigger exiting PIP mode.
iconAn element for representing enter and exit states in a single icon
NameTypeDescription
disabledbooleanThe Boolean disabled attribute makes the element not mutable or focusable.
mediacontrollerstringThe element `id` of the media controller to connect to (if not nested within).

The media UI attributes will be set automatically by the controller if they are connected via nesting or the mediacontroller attribute. Only set these attributes manually if you know what you're doing.

NameTypeDescription
mediapipunavailable(unavailable|unsupported) Set if picture-in-picture is unavailable.
mediaispipboolean Present if the media is playing in picture-in-picture.
NameDefaultDescription
--media-pip-button-displayinline-flexdisplay property of button.
--media-primary-colorrgb(238 238 238)Default color of text and icon.
--media-secondary-colorrgb(20 20 30 / .7)Default color of button background.
--media-text-colorvar(--media-primary-color, rgb(238 238 238))color of button text.
--media-icon-colorvar(--media-primary-color, rgb(238 238 238))fill color of button icon.
--media-control-displaydisplay property of control.
--media-control-backgroundvar(--media-secondary-color, rgb(20 20 30 / .7))background of control.
--media-control-hover-backgroundrgba(50 50 70 / .7)background of control hover state.
--media-control-padding10pxpadding of control.
--media-control-height24pxline-height of control.
--media-fontvar(--media-font-weight, bold) var(--media-font-size, 14px) / var(--media-text-content-height, var(--media-control-height, 24px)) var(--media-font-family, helvetica neue, segoe ui, roboto, arial, sans-serif)font shorthand property.
--media-font-weightboldfont-weight property.
--media-font-familyhelvetica neue, segoe ui, roboto, arial, sans-seriffont-family property.
--media-font-size14pxfont-size property.
--media-text-content-heightvar(--media-control-height, 24px)line-height of button text.
--media-button-icon-widthwidth of button icon.
--media-button-icon-heightvar(--media-control-height, 24px)height of button icon.
--media-button-icon-transformtransform of button icon.
--media-button-icon-transitiontransition of button icon.