The Difference Between HTML meter and progress
<meter> and <progress> can both appear as a filled horizontal bar. Their meaning is different, and the visual similarity does not make them interchangeable.
Use <meter> for a measurement within a known range. Use <progress> for a task moving towards completion.
A meter describes the current value
<label for="storage">Storage used</label>
<meter id="storage" min="0" max="100" value="68">
68%
</meter>
The storage is not 68% finished. Its current measurement is 68 within a range from 0 to 100.
Disk use, battery level, signal strength, a score, and a rating can all fit this model. The range needs a meaningful lower and upper bound.
Progress describes unfinished work
An upload at 60% uses <progress>:
<label for="upload">File upload</label>
<progress id="upload" max="100" value="60">
60%
</progress>
If the amount completed is unknown, omit value to create an indeterminate progress indicator. A meter does not have that concept because it describes a value, not waiting for a task.
A meter can describe useful regions
low, high, and optimum add context to the range:
<meter
min="0"
max="100"
low="60"
high="85"
optimum="20"
value="72">
72% used
</meter>
For disk usage, a low value is desirable, so the optimum sits below the thresholds. For a test score, the relationship could run the other way:
<meter
min="0"
max="100"
low="40"
high="75"
optimum="100"
value="82">
82%
</meter>
Browsers can use those values when choosing the meter’s appearance. Do not rely on colour alone to explain whether 72 is good or bad.
Keep the number and label readable
The text inside the element is fallback content, not always the visible label next to the rendered control. Associate a <label> where possible and include the useful number in surrounding text if the design needs it.
Native styling differs between browsers. You can reach for engine-specific pseudo-elements, but I would leave most of the control alone unless the project has a strong reason. Rebuilding a familiar meter from <div> elements adds work quickly: semantics, ranges, colours, and accessible values all need attention.
When the meaning fits, <meter> is the short answer. When it does not, a bar-shaped design does not make it fit.
Enjoyed reading this?
If you found this article helpful, consider supporting my writing. Every little bit helps keep this blog going.
Related articles
- Finding Hidden Content With hidden="until-found"
Let Find in Page and fragment navigation reveal collapsed content with hidden=until-found, while keeping a usable fallback.
- The HTML Details That Make Forms More Accessible
Build clearer forms with visible labels, autocomplete, connected help and errors, fieldsets, and visible focus.
- When a Control Needs aria-label
Use aria-label for genuinely unlabelled controls while keeping visible text and native elements as the first choice.