Skip to content
FrameworkStyle

media-poster

Poster image component that displays a thumbnail until video playback starts

Import

import '@videojs/html/ui/poster';

Anatomy

<media-poster>
  <img alt="" />
</media-poster>

Behavior

The poster shows before playback starts. Once the user plays or seeks, it hides; pausing does not bring it back. Loading a new source shows it again.

The <img> child is optional. Leave it out and <media-poster> draws one of its own in its shadow DOM.

You can set the poster URL on the player. This is useful when you want to change the poster from inside a skin, or keep all your media metadata in one place:

<video-player poster="poster.jpg"></video-player>

Supply your own image

The component fills in a source only when you leave one out. srcset, sizes, loading, <picture>, and framework image components all stay available.

<media-poster> draws a fallback image in its shadow DOM and fills in its src. Put an <img> inside it and the element uses yours instead, filling in its src the same way:

<media-poster>
  <img alt="" />
</media-poster>

Give that image a src, a srcset, or <source> candidates and it is yours; the component leaves it alone:

<media-poster>
  <img src="poster.jpg" srcset="poster-480.jpg 480w, poster-1080.jpg 1080w" alt="Keynote speaker" />
</media-poster>

Inside a skin, slot your image instead. The skin carries a plain one that yours replaces:

<video-skin>
  <video src="video.mp4" playsinline></video>
  <img slot="poster" src="poster.jpg" alt="Keynote speaker" />
</video-skin>

A skin can only style an <img> you slot directly. Wrap one in a <picture> or a framework component and its sizing is yours.

Styling

Attribute Values Description
data-visible Present / absent Present before playback starts
data-loading Present / absent Present while the image is fetching
data-loaded Present / absent Present once the image has loaded
data-error Present / absent Present when the image failed

The three load attributes track the image on screen, including one you supplied yourself.

media-poster:not([data-visible]) {
  opacity: 0;
}

The image the element draws is exposed as a part. An image you supply is an ordinary child, so style it as a descendant:

media-poster::part(image),
media-poster img {
  object-fit: cover;
}

From inside a skin’s shadow root, an image slotted from outside needs ::slotted(img) as well.

Accessibility

Unlike the native <video poster> attribute, this component lets you describe the poster for screen readers.

The image is decorative by default (alt=""), since a URL says nothing about what the image shows. When the poster carries meaning, say so:

<media-poster>
  <img src="poster.jpg" alt="Keynote speaker at a conference" />
</media-poster>

Whether a poster is informative or decorative is your judgment, per the WAI guidelines.

Examples

Basic Usage

Play Pause
<!-- TODO: add a captions track to the demo. -->
<video-player class="video-player" poster="https://image.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/thumbnail.jpg">
  <media-container>
    <video src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4" playsinline></video>

    <media-poster class="media-poster">
      <img alt="" />
    </media-poster>

    <media-play-button class="media-play-button">
      <span class="paused">Play</span>
      <span class="playing">Pause</span>
    </media-play-button>
  </media-container>
</video-player>

API Reference

media-poster

Manages poster visibility and image loading state.

Renders a div and exposes data-visible, data-loading, data-loaded, and data-error for styling every layer in the poster presentation. Render Poster.Image inside it for the image that supplies the loading lifecycle.

State

State is reflected as data attributes for CSS styling.

PropertyTypeDetails
visibleboolean
srcstring
loadingboolean
loadedboolean
errorboolean

Data attributes

AttributeTypeDetails
data-visible
data-loading
data-loaded
data-error