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.

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> renders no image of its own. It fills in the src of the image you put inside it:

<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 is an ordinary child, so style it as a descendant:

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

Props

PropTypeDefaultDetails
srcstring

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