HTML / Element / Initial coverage

The <video> Element

Status: Initial coverage Scope: HTML Living Standard Specification review: 2026-09-24

Technical Summary

video is an embedded-content element for playing video data in a document. It participates in the shared HTMLMediaElement processing model. Its element-specific surface includes poster, video dimensions, and playsinline; its behavior also depends on resource selection, network and ready states, playback, seeking, and associated timed text tracks.

The content model changes depending on whether the src attribute is present. play() returns a Promise and can reject with NotAllowedError when playback is not allowed. Normative algorithms, browser media policy, file and codec support, native controls, and accessibility API observations must be recorded as distinct evidence.

Definition / Categories

ItemDefinition
MeaningPlays a media resource with video data and, optionally, associated audio and text tracks
CategoriesFlow, phrasing, embedded, and palpable content; interactive content when the controls attribute is present
ContextWhere embedded content is expected
Content modelThe order of source, track, and transparent content depends on whether src is present
Tag omissionNeither the start tag nor the end tag is omissible
Content attributesGlobal attributes, shared media attributes, poster, playsinline, width, height, and loading
DOM interfaceHTMLVideoElement, which inherits from HTMLMediaElement

Content model and resource selection

The permitted order of child content depends on whether the src attribute is present. In either case, transparent content must not contain descendant media elements.

ConditionChild content model
src is presentZero or more track elements, followed by transparent content. Do not include child source elements.
src is absentZero or more source elements, zero or more track elements, then transparent content
<video controls width="640" height="360" poster="/media/lesson.jpg">
  <source src="/media/lesson.webm" type="video/webm">
  <source src="/media/lesson.mp4" type="video/mp4">
  <track kind="captions" src="/media/lesson.en.vtt"
         srclang="en" label="English captions" default>
  This user agent does not support the video element.
</video>

A child source in a media element identifies an alternative media resource. When a type is available, a user agent can skip a candidate with an unsupported type before fetching it. Playback is not guaranteed: container, codec, profile, network, CORS, and server behavior can all matter. The selection model for source inside picture is different.

Transparent content inside video is for user agents that do not support the video element. It is not guaranteed to appear when a user agent supports the element but cannot fetch its resource. Provide a separate direct link or transcript if people need an alternative after a loading failure.

Element-specific and shared attributes

AttributeNormative roleBoundary
srcURL of the media resourceWhen present, it is the resource-selection entry point instead of child source elements
posterRepresentative image to show when video data is unavailableNot captions, a transcript, or an alternative description
controlsRequests that the user agent show its controlsAppearance, operable controls, and AAM exposure are implementation and platform observations
preloadAuthor hint about the amount of buffering likely to be needednone, metadata, and auto do not establish the amount actually fetched
autoplayRequests automatic playback when the algorithm's conditions are metUser agents are not required to support autoplay and may account for user preferences
muted / loopInitial muted state / return to the beginning after playback endsRead the current state separately from the content attribute
playsinlineEncourages video to be shown in the element's playback areaDoes not fix fullscreen behavior or UI across all user agents
width / heightDimension attributes for the playback areaDistinct from the natural dimensions of the video resource
crossorigin / loadingAffect request mode / loading deferralRecord fetch results separately for the resource, poster, and text tracks

poster is used as the image represented by the element while video data is unavailable. videoWidth and videoHeight return the resource's natural dimensions and return zero before that data is available. Do not conflate them with the CSS size of the playback area or the poster image dimensions.

Network state and ready state

networkState describes the stage of resource selection and fetching; readyState describes how much media data is currently available. They describe different state machines and should not be collapsed into one simple loading percentage.

APIWhat it observesValues and boundaries
networkStateResource selection and data fetchingNETWORK_EMPTY, NETWORK_IDLE, NETWORK_LOADING, NETWORK_NO_SOURCE
readyStateAvailability of media data for the current positionFrom HAVE_NOTHING through HAVE_ENOUGH_DATA; values can be skipped
currentTime / durationPlayback position / media resource length on the timelineHandle seeking, ranges, unknown duration, and end conditions separately. An unbounded live resource can have an infinite duration.
Media eventsChanges in fetching, metadata, buffering, playback, and seekingExamples include loadedmetadata, canplay, waiting, playing, seeking, and seeked; they are not one fixed sequence

preload is a hint; inspect it together with the browser cache, resource, network, and user-agent policy. Events are processed as media element tasks, and the ready state is not required to pass through every intermediate value.

Playback requests and autoplay

HTMLMediaElement.play() returns a Promise. It can reject with NotAllowedError when playback is not allowed or NotSupportedError when the resource is not supported. Do not infer that playback started merely because the method was called; observe the Promise and media events.

const video = document.querySelector('video');

video.play().then(() => {
  console.log('playback started');
}).catch((error) => {
  console.log('playback did not start:', error.name);
});

The HTML Standard does not require user agents to support autoplay. It also encourages authors to let users override autoplay and to consider waiting for an explicit request. Record implementation policy, muted conditions, user activation, and OS settings separately from normative claims.

Text tracks and video accessibility

track associates an external timed text track with a media element. Its kind can be subtitles, captions, descriptions, chapters, or metadata. Cues have start and end times on the media timeline. Examine the meaning of each kind, default, and language selection separately; not every text track is a caption track.

HTML-AAM maps the computed role of video to html-video and defines platform accessibility API mappings. Exposure of the controls when controls is present can differ by platform. The normative mapping, browser accessibility tree, platform API, and assistive-technology output are distinct evidence.

Providing HTML track elements and making the media content meet accessibility requirements are separate questions. WCAG 2.2 time-based media criteria have conditions that depend on whether content is prerecorded or live, what information is conveyed by audio and video, and whether the media is clearly a text alternative.

DOM Interface

APISummaryCondition or boundary
width / heightElement dimension attributesDistinct from CSS-computed rendered dimensions
videoWidth / videoHeightNatural dimensions of the video resourceZero while media data is unavailable
poster / playsInlinePoster URL / inline-playback IDL surfaceSeparate reflected attribute values from rendering and playback behavior
play() / pause()Request playback / pauseplay() returns a Promise; handle success and rejection
currentTime / duration / seekableTimeline, playback position, and seekable rangesDo not assume finite duration or seeking from the beginning for live and streaming resources
networkState / readyState / errorResource fetching and current playback readinessRecord these as separate state surfaces
textTracks / addTextTrack()Associated text tracks and API for adding oneDistinguish child track elements, script-added tracks, and tracks sourced from the resource

Fact / Evidence

Claims from the HTML Standard, HTML-AAM, and WCAG are paired with scope and source locations. Browser observations are kept in the Implementation Evidence section; unrun items are not treated as reviewed.

Key facts and source locations
TypeFact / claimConditions / scopeStatusSource
SPECvideo is flow, phrasing, embedded, and palpable content, and is interactive content when controls is present.Use where embedded content is expected. Its DOM interface is HTMLVideoElement.ReviewedHTML Standard: the video element
SPECThe presence of src determines the order of source, track, and transparent content.The content model with src does not include child source elements; both models exclude descendant media elements.ReviewedHTML Standard: video content model
SPECposter is the representative image that the video element represents while video data is unavailable.Distinguish the poster frame, natural dimensions, and playback-area rendering.ReviewedHTML Standard: poster and rendering
SPECnetworkState and readyState describe different media-element states, and ready-state values need not change in sequence.Resource fetching, metadata, buffering, playback state changes, and task/event processing.ReviewedHTML Standard: media elements
SPECplay() returns a Promise and rejects with NotAllowedError when playback is not allowed.Keep unsupported-resource failures, user-agent playback permission, and autoplay support distinct.ReviewedHTML Standard: playing media
SPECtrack specifies an external timed text track for a media element.Captions, subtitles, descriptions, chapters, and metadata are distinct track kinds. Cues are associated with the media timeline.ReviewedHTML Standard: the track element
AAMHTML-AAM maps the computed role of video to html-video and defines platform mappings for controls.Keep specification mapping distinct from browser, platform, and assistive-technology observations.Specification reviewedHTML-AAM: video
SPECWCAG time-based media requirements do not follow from the presence of an HTML element alone; they depend on media type, content, and conditions such as live or prerecorded status.Assess WCAG 2.2 SC 1.2.2, 1.2.3, 1.2.5, and other criteria as separate success criteria.ReviewedWCAG 2.2: Captions (Prerecorded); Audio Description or Media Alternative (Prerecorded)

Evidence

  1. HTML Standard: The video element — categories, content model, attributes, poster, and HTMLVideoElement
  2. HTML Standard: Media elements — resource selection, network / ready states, playback, seeking, events, and autoplay
  3. HTML Standard: The track element and timed text tracks — track kinds, cues, language, default selection, and text track API
  4. HTML Accessibility API Mappings: video — computed role and platform control mappings
  5. WCAG 2.2 SC 1.2.2 and SC 1.2.3 — prerecorded synchronized-media criteria and their conditions
  6. Web Platform Tests: the-video-element and media-elements — test discovery entry points; no results are claimed here

Implementation Evidence

Browser behavior, WPT, and accessibility-tree observations are registered separately from normative claims. Selected measurements and tests have been run; each row records its environment and remaining verification scope.

Measurement fixture: video-v1 was created and used in one Chrome 153 environment to observe video loading, playback, captions, and the Accessibility Tree. Eight selected WPT files were run. See the evidence rows below for details. Cross-browser coverage, the full test suites, and platform accessibility mappings remain incomplete.

video element implementation evidence registry
TypeReproduction scopeConditions to recordStatus
IMPL src / source candidate selection, poster and dimensions, networkState / readyState, play() promises and media events, text tracks, and controls in the accessibility tree Measured 2026-09-24 in Chrome 153.0.8010.50 / Windows NT 10.0.26200.0 using the video-v1 VP8 / Opus WebM (320×180, 3.008 s) at 127.0.0.1:4173. The unsupported MIME candidate was skipped and sample.webm selected. Observed loadstart → loadedmetadata → loadeddata → canplay, networkState 2→1, readyState 0→1→4, and videoWidth / videoHeight. A scripted play() call on the audio-bearing fixture rejected with NotAllowedError before user activation; it resolved after the fixture button was clicked and emitted playing / pause. One captions cue loaded and rendered. A separate video with only an unsupported MIME candidate remained at networkState 3 / error null, and its play Promise remained unsettled after 1.5 s. The NotSupportedError condition and other browsers / codecs remain unverified. Reran the fixture on 2026-09-25 in Chrome 153.0.8010.50 / Codex In-app Browser. The separate button test passed with navigator.userActivation.isActive=true in the click handler, a resolved play Promise, and a fired playing event (volume=0, muted=false). Before the no-activation attempt, isActive=false / hasBeenActive=false; this volume=0 fixture nevertheless resolved and emitted playing. Record it as an additional observation under different conditions from the upstream test default volume; it does not replace the earlier wpt.live result. Partial (Chrome 153 / one environment)
WPT Tests for the video element, resource selection, media state / playback, poster, track, and timed text 2026-09-24 / Chrome 153.0.8010.50 / Windows NT 10.0.26200.0 / wpt.live. Eight selected files passed 17/17 assertions: networkState_initial.html (2/2), src_reflects_attribute_not_source_elements.html (2/2), readyState_initial.html (2/2), event_loadedmetadata_noautoplay.html (4/4), event_canplay_noautoplay.html (4/4), video-loading-eager.html (1/1), track-load-from-src-readyState.html (1/1), track-default-attribute.html (1/1). The additional event_playing_noautoplay.html reported 2 pass and 2 Not Run out of 4 because scripted play() in the runner had no user activation and rejected with NotAllowedError. The source synchronously sets up one audio and one video case, while each async test waits for a playing event. The Promise is not handled and playback is started without activation, so in this Chrome context only the two setup tests passed; both async tests for blocked playback remained incomplete. This is a mismatch between the test precondition and ordinary wpt.live execution, not evidence that post-start playing events fail. To retest the event path, use test_driver.bless() in a WebDriver runner; test playback blocking separately with a Promise-rejection assertion. track-mode.html, error-sequence.html, and video-poster-clone-template.html did not produce a final harness summary and are excluded. Selected coverage only; other browsers and the full directories remain untested. A test_driver.bless()-based user-activation WPT candidate was added at build-config/yugien/research-results/video-v1/wpt/event_playing_after_user_activation.html; it has not been run in a WebDriver environment.

The test version used was not recorded. The linked test may change, so this result cannot be repeated with certainty against the same version.

Partial (17/17 selected assertions pass)
AAM Computed role / accessible name for video, native controls, and accessibility-tree exposure of captions and text tracks Observed 2026-09-24 in Chrome 153.0.8010.50 / Windows NT 10.0.26200.0. In the Chrome tab Accessibility Tree snapshot, the video surface appeared as a container with Description Atlas video-v1 test clip, with buffer status, native-control buttons, a seek slider, and a popup button. The slider label was 動画シークバー. The caption cue rendered on the video but did not appear as a separate node in this snapshot. Windows platform accessibility APIs, assistive technology such as Narrator / NVDA, and other browsers were not observed. Partial (Chrome tree snapshot)

Record codec, media file, network, user activation, user preference, browser, OS, native controls, platform APIs, and assistive technology separately. Do not generalize one environment's results to all implementations.

Coverage / Open Issues

  • ReviewedMeaning, categories, context, src-dependent content models, major attributes, poster, and HTMLVideoElement
  • ReviewedNormative entry points for shared resource selection, network / ready states, playback promises, and event model
  • ReviewedText tracks, HTML-AAM, and source locations and scope boundaries for WCAG time-based media criteria
  • OpenCross-browser comparison of source fallback, codecs, network / ready state, events, poster, and dimensions in Chrome, Firefox, and Safari
  • OpenImplementation comparisons for autoplay policy, user activation, preload, lazy loading, CORS, range requests, media fragments, and live streams
  • Opencross-browser measurements, full WPT directories, all HTML-AAM platform mappings, OS accessibility APIs and assistive technology, and caption rendering / selection differences

This is initial coverage. It records normative entry points and sources; it does not claim complete verification of video, playback in every browser, or that every media resource meets accessibility criteria.

Related surface

For a beginner-friendly guide to playback controls, captions, poster images, and descriptions, see video in Yugien. Compare its shared media model with the audio element. Parent-specific candidate selection is covered by the source element; see the track element for timed-text requirements, WebVTT, and its own evidence scope. Compare image-resource selection in picture and img; see iframe for the boundary between media playback and embedding another document.