Progress
<progress class="progress" value="60" max="100" aria-label="Upload progress"></progress><progress class="progress" value="60" max="100" aria-label="Upload progress"></progress>With a value
Section titled “With a value”A bar without a number is hard to read precisely. Put the number beside it.
60%
<div class="field" style="gap: 0.5rem"> <div style="display: flex; align-items: center; gap: 0.5rem"> <label class="label" for="progress-upload">Uploading</label> <span class="progress-value">60%</span> </div> <progress class="progress" id="progress-upload" value="60" max="100"></progress></div>Indeterminate
Section titled “Indeterminate”Leave value off and the element is indeterminate — the bar sweeps instead of filling.
<progress class="progress" aria-label="Working"></progress>The sweep stops under prefers-reduced-motion.
Set dir="rtl" on the page or on any subtree — the bar fills from the other end. See
the button page for a live example.
Accessibility
Section titled “Accessibility”- Name it.
aria-label, or a<label for>pointing at it. - A progress bar is not a spinner. Use it when you know the proportion, and a spinner when you do not.
- Do not announce every percent. The element updates its own value; wrapping it in an assertive live region turns a quiet bar into a stream of interruptions.