ARIA progressbar needs accessible name

Last updated:

Who it helps: Blind
Standard: WCAG 2.2 Level A

ARIA progressbar components must have an accessible name

Every element with role=progressbar needs an accessible name that states what the progress represents.

This appears in file uploads, checkout steps, data imports, and loading indicators.

Without a clear name, screen reader and voice control users cannot tell which task a percentage refers to.

Why It Matters

Screen reader users may only hear “progress bar, 50%” with no context, making it impossible to know which operation is halfway done.

Cognitive disabilities are affected when multiple progress indicators exist and none are distinguished by purpose.

Low-vision users relying on speech output also need the label to disambiguate similar progress bars.

Common Causes

  • Using a generic <div role="progressbar"> without a label.
  • Empty aria-label or an aria-labelledby that points to a missing/empty element.
  • Relying on visual text near the bar that is not programmatically associated.
  • Dynamically injected progress bars created without names.
  • Native <progress> used without a visible <label> or an accessible name.
  • Depending solely on the title attribute (not reliable across assistive tech).

How to Fix

  1. Provide a programmatic label:
    • Preferred for native: Use <label for> with the <progress> element.
    • For ARIA widgets: Use aria-labelledby to reference visible text.
    • If no visible label fits, use a concise aria-label.
  2. Make the label specific to the task:
    • Example: “File upload progress”, “Checkout step progress”, “Report generation progress”.
    • Keep it short; avoid repeating values (e.g., do not include “50%” in the name).
  3. Ensure proper value states:
    • For ARIA progressbar: set aria-valuemin, aria-valuemax, and aria-valuenow for determinate bars.
    • For indeterminate bars, omit aria-valuenow.
    • For native <progress>, use value and max attributes.
  4. Avoid title-only naming:
    • Do not rely on title for the accessible name; support is inconsistent. Prefer a real label or ARIA naming.
  5. Multiple progress bars:
    • Give each a unique, descriptive name so users can distinguish them.

Compliance note: This maps to WCAG 2.2 Success Criterion 4.1.2 (Name, Role, Value).

How to Test

  • Keyboard check:
  • If the progressbar is focusable (most are not), when focused it should expose the correct name and value to assistive tech.
  • Tabbing should not trap focus. Progress bars are usually read-only.
  • Screen reader check (desktop):
  • NVDA/JAWS + browser: Move to the progressbar. Expect announcement like “Upload progress, progress bar, 32%”.
  • Verify the task description (name) is accurate and unique if multiple bars exist.
  • Mobile/touch check:
  • iOS VoiceOver or Android TalkBack: Swipe to the control. Confirm it announces the purpose and current value.
  • DevTools/Accessibility Tree:
  • Inspect the node and confirm the Computed Name is present and correct.
  • Automated checks:
  • Run an accessibility scanner and confirm no “ARIA progressbar name” violations remain.

Good Example

HTML
<label for="upload-progress">File upload progress</label>
<progress id="upload-progress" value="32" max="100"></progress>

<span id="report-progress-label" class="sr-only">Report generation progress</span>
<div role="progressbar"
     aria-labelledby="report-progress-label"
     aria-valuemin="0"
     aria-valuemax="100"
     aria-valuenow="68"></div>

Bad Example

HTML
<!-- No accessible name at all -->
<div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="45"></div>

<!-- Empty aria-label -->
<div role="progressbar" aria-label=""></div>

<!-- Broken reference -->
<div role="progressbar" aria-labelledby="missing-label"></div>

<!-- Native progress without label or ARIA name -->
<progress value="70" max="100"></progress>

Quick Checklist

  • Every progressbar exposes a clear, concise accessible name describing the task.
  • Use <label for> with <progress>, or aria-labelledby/aria-label for ARIA widgets.
  • Do not rely on title to provide the name.
  • Include appropriate value attributes (aria-valuenow/min/max or value/max).
  • Names do not include dynamic numeric values.
  • Each progressbar has a unique name when multiple are present.
  • Confirm the Computed Name in DevTools and with at least one screen reader.