Skip to content
FrameworkStyle

media-thumbnail

Time-based thumbnail preview component for timeline scrubbing and hover previews

Quick Start: Video Track

Thumbnail can read thumbnail cues directly from your video track. Add a <track> with kind="metadata" and label="thumbnails" to your media element.

Mux provides this as storyboard.vtt:

https://image.mux.com/{PLAYBACK_ID}/storyboard.vtt

<video src="video.mp4">
  <track
    kind="metadata"
    label="thumbnails"
    src="https://image.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/storyboard.vtt"
    default
  />
</video>
<media-thumbnail time="12"></media-thumbnail>

Anatomy

<media-thumbnail time="12"></media-thumbnail>

Behavior

Thumbnail resolves an image for the current time.

Supported source formats:

  • Text track: <track kind="metadata" label="thumbnails" src="...vtt">
  • JSON array: { url, startTime, endTime? }[]
  • JSON sprite array: { url, startTime, endTime?, width, height, coords }[]

In React, text-track mode needs Player because it reads track state from the player store. JSON modes (thumbnails prop) work without a player.

The component picks the latest thumbnail whose startTime is less than or equal to the current time, then scales/clips sprite tiles to fit CSS min/max constraints while preserving aspect ratio.

Styling

Use state data attributes for pure CSS styling:

media-thumbnail[data-hidden] {
  display: none;
}

media-thumbnail[data-loading] {
  opacity: 0.6;
}

media-thumbnail[data-error] {
  outline: 1px solid #ef4444;
}

Accessibility

Thumbnail is decorative by default (aria-hidden="true"). It is intended for visual preview UX (for example, timeline hover previews) rather than primary accessible content.

Examples

Text Track (VTT)

<section class="demo">
    <video-player>
        <media-container>
            <video
                class="media"
                src="https://stream.mux.com/BV3YZtogl89mg9VcNBhhnHm02Y34zI1nlMuMQfAbl3dM/highest.mp4"
                preload="auto"
                muted
                playsinline
                crossorigin="anonymous"
            >
                <track
                    kind="metadata"
                    label="thumbnails"
                    src="/docs/demos/thumbnail/basic.vtt"
                    default
                />
            </video>
            <media-thumbnail class="media-thumbnail" time="12"></media-thumbnail>
        </media-container>
    </video-player>
</section>

JSON Array

<media-thumbnail time="12" style="max-width: 240px;"></media-thumbnail>

JSON Sprite Array

<media-thumbnail time="12" style="max-width: 240px;"></media-thumbnail>

API Reference

Props

PropTypeDefaultDetails
crossOrigin'anonymous' | 'use-credentials' | '' ...
fetchPriority'high' | 'low' | 'auto'
loading'eager' | 'lazy'
timenumber

State

State is reflected as data attributes for CSS styling.

PropertyTypeDetails
loadingboolean
errorboolean
hiddenboolean

Data attributes

AttributeTypeDetails
data-loading
data-error
data-hidden