ARIA meter needs accessible names
Last updated:
Related Guides
ARIA meter elements must have an accessible name
Any element with role="meter" needs a programmatic name that explains what the meter represents. This appears in dashboards, status indicators, and custom visual meters. It affects people using screen readers and speech tools that rely on names to identify controls and status.
Why It Matters
Without a name, a screen reader may only announce a percentage or range with no context. Users cannot tell if 70% refers to battery level, storage usage, or something else.
Voice control users depend on names to reference items by speech. Cognitive and low-vision users also benefit when the purpose is clearly conveyed.
Common Causes
role="meter"used withoutaria-labeloraria-labelledby- Nearby text exists but is not programmatically associated
- Empty
aria-labelvalues ("") aria-labelledbypoints to a missing or empty element- Relying solely on visual icons or colors to convey purpose
- Using the title attribute instead of a robust label strategy
How to Fix
- Choose clear, concise text that describes the meter’s purpose (e.g., "Storage used", "CPU load").
- Provide the accessible name using one of these patterns:
- Prefer
aria-labelledbythat references visible text. - Use
aria-labelfor a concise embedded label when no visible text is present. - title can supply a name, but prefer
aria-labelledbyoraria-labelfor consistency.
- Prefer
- Ensure value attributes are present and accurate for comprehension:
aria-valuemin,aria-valuemax,aria-valuenow(andaria-valuetextif a human-friendly value is needed).
- Verify any ID in
aria-labelledbyexists and the referenced element contains meaningful text. - Do not leave
aria-labelempty. Remove it if not used, or provide a proper value. - If the meter is purely decorative, remove
role="meter"and hide it from assistive tech (aria-hidden="true").
Standards note: Providing an accessible name aligns with WCAG 2.2 Success Criterion 4.1.2 (Name, Role, Value).
How to Test
Keyboard
- If the meter is focusable, tab to it and confirm the label is announced along with the value. If not focusable, this step may not apply.
Screen reader
- NVDA/JAWS (Windows): Navigate by landmarks or graphics. Confirm it announces the name (e.g., "Storage used, meter, 72 percent").
- VoiceOver (macOS/iOS): Navigate by controls or explore by touch. Confirm the announced name and value are clear.
- TalkBack (Android): Explore by touch. Confirm the name and value are read together.
Visual inspection / DevTools
- Use browser accessibility tools to check the computed accessible name for the meter node.
- Confirm ID references in
aria-labelledbyresolve to visible, meaningful text.
Quick checklist
- Name exists and describes purpose.
- Value (now/min/max) is present and correct.
- No empty
aria-labelvalues. aria-labelledbyreferences valid, non-empty elements.- Name is short and clear (avoid redundancy).
- Works with at least one desktop and one mobile screen reader.
Good Example
<p id="disk-label">Storage used</p>
<div role="meter"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="72"
aria-labelledby="disk-label"></div>aria-label:<div role="meter"
aria-label="CPU load"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="55"></div>Bad Example
<!-- No accessible name at all -->
<div role="meter" aria-valuemin="0" aria-valuemax="100" aria-valuenow="70"></div>
<!-- Empty aria-label provides no name -->
<div role="meter" aria-label="" aria-valuemin="0" aria-valuemax="100" aria-valuenow="40"></div>
<!-- Broken reference: id does not exist -->
<div role="meter" aria-labelledby="missingId" aria-valuemin="0" aria-valuemax="10" aria-valuenow="7"></div>Quick Checklist
role="meter"has a clear accessible name (aria-labelledbyoraria-label)- Referenced IDs exist and contain meaningful text
- No empty name attributes
- Value attributes (min/max/now) accurately reflect the range
- Name describes what the meter measures, not just the value
- Screen readers announce name + role + value together
- Avoid relying on title alone; prefer aria-labelledby/aria-label