ARIA: progressbar role
The progressbar role defines an element that displays the progress status for tasks that take a long time.
Description
The progressbar range widget indicates that a request has been received and the application is making progress toward completing the requested action.
Authors may set aria-valuemin and aria-valuemax to indicate the minimum and maximum progress indicator values. Otherwise, their implicit values follow the same rules as HTML's <input type="range">:
- If
aria-valueminis missing or not a number, it defaults to0(zero). - If
aria-valuemaxis missing or not a number, it defaults to100. - The
aria-valueminandaria-valuemaxproperties only need to be set for theprogressbarrole when the progress bar's minimum is not0or the maximum value is not100. - The read-only
aria-valuenowshould be provided and updated unless the value isindeterminate, in which case don't include the attribute. If set, make sure thearia-valuenowvalue is between the minimum and maximum values.
If the progressbar role is applied to an HTML <progress> element, the accessible name can come from the associated <label>. Otherwise use aria-labelledby if a visible label is present or aria-label if a visible label is not present.
All descendants are presentational
There are some types of user interface components that, when represented in a platform accessibility API, can only contain text. Accessibility APIs do not have a way of representing semantic elements contained in a progressbar. To deal with this limitation, browsers, automatically apply role presentation to all descendant elements of any progressbar element as it is a role that does not support semantic children.
For example, consider the following progressbar element, which contains a heading.
<div role="progressbar"><h3>Title of my progressbar</h3></div>
Because descendants of progressbar are presentational, the following code is equivalent:
<div role="progressbar">
<h3 role="presentation">Title of my progressbar</h3>
</div>
From the assistive technology user's perspective, the heading does not exist since the previous code snippets are equivalent to the following in the accessibility tree:
<div role="progressbar">Title of my progressbar</div>
Associated WAI-ARIA roles, states, and properties
aria-valuenow-
Only present and required if the value is not indeterminate. Set to a decimal value between
0, oraria-valueminif present, andaria-valuemaxindicating the current value of the progress bar. aria-valuetext-
Assistive technologies often present the value of
aria-valuenowas a percentage. If this would not be accurate use this property to make the progress bar value understandable. aria-valuemin-
Set to a decimal value representing the minimum value, and less than
aria-valuemax. If not present, the default value is0. aria-valuemax-
Set to a decimal value representing the maximum value, and greater than
aria-valuemin. If not present, the default value is100. aria-labeloraria-labelledby-
Defines the string value or identifies the element (or elements) that label the progressbar element providing an accessible name. An accessible name is required.
It is recommended to use a native <progress> or <input type="range"> elements rather than the progressbar role. User agents provide a stylize widget for the <progress> element based on the current value as it relates to the 0, the minimum value, and the max value. When using non-semantic elements, all features of the native semantic element need to be recreated with ARIA attributes, JavaScript and CSS.
Examples
In the example below, the progress bar uses the default values of 0 and 100 for aria-valuemin and aria-valuemax:
<div>
<span id="loadinglabel">Loading:</span>
<span role="progressbar" aria-labelledby="loadinglabel" aria-valuenow="23">
<svg width="100" height="10">
<rect height="10" width="100" stroke="black" fill="black" />
<rect height="10" width="23" fill="white" />
</svg>
</span>
</div>
Using semantic HTML, this could be written as:
<label for="loadinglabel">Loading:</label>
<progress id="loadinglabel" max="100" value="23"></progress>
Best practices
If the progress bar is describing the loading progress of a particular region of a page, include the aria-describedby attribute to reference the progress bar's status, and set the aria-busy attribute to true on the region until it is finished loading.
Prefer HTML
It is recommended to use a native <progress> or <input type="range"> elements rather than the progressbar role.
Specifications
| Specification |
|---|
| Accessible Rich Internet Applications (WAI-ARIA)> # progressbar> |
See also
- HTML
<progress>element - Other range widgets include:
meterscrollbarseparator(if focusable)sliderspinbutton