HTML / Element / Initial coverage

<progress> Element

Status: Initial coverage Scope: HTML Living Standard Specification checked: 2026-09-20

Technical Summary

The progress element represents the completion progress of a task. It can be determinate, with a known current and maximum amount, or indeterminate, when work is progressing but the remaining amount is unknown.

The presence of the value attribute selects the determinate state; omitting it selects the indeterminate state. Use meter for a scalar measurement such as disk usage, and output for a calculation or user-action result.

Definition / Categories

ItemDefinition
MeaningCompletion progress of a task
CategoriesFlow content, phrasing content, labelable content, and palpable content
ContextWhere phrasing content is expected
Content modelPhrasing content, but no descendant progress element
Tag omissionNeither the start tag nor the end tag is omissible
Content attributesGlobal attributes, value, and max
DOM interfaceHTMLProgressElement

Determinate and indeterminate states

A determinate progress bar has a current value and a maximum, so its relative completion can be calculated. An indeterminate progress bar communicates that work is ongoing without saying how much remains.

<label for="determinate-progress">Upload</label>
<progress id="determinate-progress" max="100" value="65">65%</progress>

<label for="indeterminate-progress">Waiting for the server</label>
<progress id="indeterminate-progress">Processing</progress>

value="0" is a determinate progress bar whose current value is zero. It is different from omitting the value attribute.

value and max resolution

The max attribute represents the total amount of work. If it is omitted, the maximum is 1. The units are not fixed by the specification, so an application should choose and use one unit consistently.

  • max must be a valid floating-point number greater than zero. An invalid or non-positive value resolves to a maximum of 1.
  • When present, value is parsed as a floating-point number. An invalid or non-positive value resolves to a current value of 0.
  • If the current value is greater than the maximum, the progress value is limited to the maximum.
  • When value is absent, the element is indeterminate and position returns -1.

progress has no min attribute. Its lower bound is always zero. This processing model differs from meter, where a bounded measurement has lower, upper, and threshold-related meaning.

Fallback text and labeling

Descendant text can provide a fallback current and maximum value for legacy user agents. That text should not be treated as the only name for the element; use a label or appropriate ARIA labeling to identify which task is progressing.

<label for="file-progress">Report upload progress</label>
<progress id="file-progress" max="100" value="70">70%</progress>

When a progress indicator describes a region that is loading, an author may also relate it to that region with aria-describedby and mark the region as busy with aria-busy. Normative meaning, browser accessibility-tree exposure, and assistive-technology announcements remain separate questions.

DOM Interface

APIMeaningBoundary
valueThe current progress valueThe getter returns 0 for an indeterminate bar; setting it can make an omitted-value element determinate
maxThe maximum value; default 1Invalid or non-positive values resolve to the default maximum
positionCurrent value divided by maximum, or -1 when indeterminateA readonly surface for the relative position
labelsThe NodeList of associated label elementsAn entry point for checking labelable-element naming

Fact / Evidence

The normative progress model, attribute processing, content model, DOM API, and accessibility mapping are recorded with claims, conditions, and source locations. Browser observations are kept separate in Implementation Evidence below.

Key facts and source locations
TypeFact / claimConditions / scopeStatusSource
SPECThe progress element represents the completion progress of a task.Determinate progress gives a completed amount relative to a maximum; indeterminate progress does not expose the remaining amount.ReviewedHTML Standard: the progress element
SPECThe presence of value distinguishes determinate from indeterminate progress.Absent value means indeterminate; present value is resolved with max.ReviewedHTML Standard: determinate and indeterminate progress
SPECmax defaults to 1, and the current value is resolved between zero and the maximum.Invalid floating-point values, non-positive max, and values above the maximum.ReviewedHTML Standard: value and max processing
SPECprogress belongs to flow, phrasing, labelable, and palpable content categories.It is used where phrasing content is expected and may not contain a descendant progress element.ReviewedHTML Standard: categories and content model
SPECHTMLProgressElement exposes value, max, readonly position, and labels.Includes the indeterminate position result and IDL/content-attribute behavior.ReviewedHTML Standard: HTMLProgressElement
AAMprogress maps to the progressbar role; determinate progress exposes maximum, minimum zero, and current value properties.HTML-AAM element-role mapping. Browser, platform-API, and assistive-technology results require separate observation.ReviewedHTML-AAM: progress

Evidence

  1. HTML Standard: The progress element — meaning, categories, attributes, determinate and indeterminate states, value/max processing, and DOM interface
  2. HTML Accessibility API Mappings: progress — progressbar role, determinate value properties, and labeling
  3. Web Platform Tests: HTML forms — entry point for locating progress element tests

Implementation Evidence

Browser implementation, WPT, and accessibility-tree observations are recorded separately from normative claims. A dedicated progress-v1 fixture has not yet been run, so unrun items are not marked as reviewed.

Fixture candidate: progress-v1 would reproduce determinate and indeterminate transitions, value and max boundary and invalid values, position, labels, fallback text, and accessibility-tree value properties.

Implementation evidence registration
TypeVerification scopeConditions to recordStatus
IMPLDeterminate and indeterminate states, value/max boundaries, attribute and IDL reflection, position, labels, and fallback textRegister browser/version, OS, date, progress-v1 fixture, and each resultPending / not run
WPTProgress element, value/max parsing, indeterminate state, and DOM API testsRegister selected files, execution environment, pass/fail, and reasons for unrun testsPending / not run
AAMProgressbar role, accessible name from labels, determinate min/max/now, and indeterminate exposureRegister browser accessibility tree, platform API, assistive-technology, and cross-browser observations separatelyPending / not run

A browser observation from one environment must not be registered as a universal result across browsers, platform APIs, and assistive technologies.

Coverage / Open Issues

  • ReviewedMeaning, categories, context, content model, tag omission, and content attributes
  • ReviewedDeterminate and indeterminate states, value/max processing, and the semantic boundary with meter and output
  • ReviewedMain HTMLProgressElement APIs and the HTML-AAM progressbar mapping entry point
  • OpenChrome, Firefox, and Safari comparisons for attributes, IDL, rendering, and determinate/indeterminate transitions
  • OpenIndividual WPT results and browser differences for boundary values, invalid values, and dynamic changes
  • OpenComplete HTML-AAM mapping, platform APIs, assistive-technology announcements, and interactions between dynamic updates, aria-busy, and aria-describedby

This is initial coverage. It records the normative entry point and evidence sources; it does not claim identical results in every browser, platform API, or assistive technology, or complete verification of the progress element.

Related surface

For a beginner-friendly explanation of progress display, determinate and indeterminate states, and the difference from meter and output, see the progress element page in Yugien. For labeling, see the label element; for calculation results, see the output element.