Copyright © 2021 W3C® (MIT, ERCIM, Keio, Beihang). W3C liability, trademark and permissive document license rules apply.
This section describes the status of this document at the time of its publication. Other documents may supersede this document. A list of current W3C publications and the latest revision of this technical report can be found in the W3C technical reports index at https://www.w3.org/TR/.
ARIA in HTML is a [HTML] specification module. Any HTML features, conformance requirements, or terms that this specification module makes reference to, but does not explicitly define, are defined in the HTML specification.
This is a draft document and its contents are subject to change without notice.
This document was published by the Web Applications Working Group as a Working Draft. This document is intended to become a W3C Recommendation.
GitHub Issues are preferred for discussion of this specification. Alternatively, you can send comments to our mailing list. Please send them to [email protected] (subscribe, archives).
Publication as a Working Draft does not imply endorsement by the W3C Membership.
This is a draft document and may be updated, replaced or obsoleted by other documents at any time. It is inappropriate to cite this document as other than work in progress.
This document was produced by a group operating under the W3C Patent Policy. W3C maintains a public list of any patent disclosures made in connection with the deliverables of the group; that page also includes instructions for disclosing a patent. An individual who has actual knowledge of a patent which the individual believes contains Essential Claim(s) must disclose the information in accordance with section 6 of the W3C Patent Policy.
This document is governed by the 15 September 2020 W3C Process Document.
Developers MAY use the ARIA role
and aria-*
attributes on
HTML elements, in accordance
with the requirements described in WAI-ARIA, except
where these conflict with the
strong native semantics
or are equal to the
implicit ARIA semantics
of a given HTML element. The implicit ARIA semantics for an
HTML element are defined in the
HTML Accessibility API Mappings specification.
The constraints defined in this specification are intended to prevent developers from making assistive technology products report nonsensical user interface (UI) information that does not represent the actual UI of the document.
Developers MUST NOT use the ARIA role
and aria-*
attributes in
a manner that conflicts with the semantics described in the
§ 3.
Document conformance requirements for use of ARIA attributes in HTML and §
Document conformance requirements for use of ARIA attributes with HTML attributes tables.
It is NOT RECOMMENDED for developers to set the ARIA role
and
aria-*
attributes to values that match the
implicit ARIA semantics defined in the table. Doing so is
unnecessary and can potentially lead to unintended consequences.
This section is non-normative.
This section is non-normative.
The following uses a role=heading
on a button
element. This is
not allowed, because the button
element has default characteristics
that conflict with the heading role.
<button role="heading">search</button>
This section is non-normative.
The following uses a role=button
on a button
element. This is
unnecessary, as "button" is already exposed as the implicit role for
the element. In practice this redundancy will likely not have any
unforeseen side effects, other than unnecessarily making the markup
more verbose, and incorrectly signaling to other developers that this
practice is useful.
<!-- Avoid doing this! -->
<button role="button">...</button>
Similarly, the following uses a role=group
on a fieldset
element.
This is unnecessary, because the fieldset
element is implicitly
exposed as a role=group
. Again, in practice this will likely not
have any unforeseen side effects.
<!-- Avoid doing this! -->
<fieldset role="group">...</fieldset>
The following uses a role=list
on an ul
element. This is
generally unnecessary, because the ul
element is implicitly exposed
as a role=list
. However, some user agents suppress a list's
implicit ARIA semantics if list markers are removed. Developers can
use role=list
to reinstate the role if necessary, though this
practice would generally not be recommended, otherwise.
<!-- Avoid doing this! -->
<ul role="list">...</ul>
This section is non-normative.
The following uses a role=button
on a summary
element. This is
unnecessary and can result in cross-platform issues. For instance,
preventing the element from correctly exposing its state, and forcing
the role of button
, when it might otherwise be exposed with a
different role.
<details>
<!-- Avoid doing this! -->
<summary role="button">more information</summary>
...
</details>
The following table provides normative per-element document-conformance requirements for the use of ARIA markup in HTML documents and describes the implicit ARIA semantics that apply to HTML elements as defined in HTML AAM.
Each language feature (element) in a cell in the first column implies
the ARIA semantics (role, states, and properties) given in the cell in
the second column of the same row. The third cell in each row defines
the ARIA role values and aria-*
attributes which MAY be used. Where
a cell in the third column includes the term
Any role
it indicates that any role
value apart from the implicit ARIA semantics role
value,
MAY be used. If a cell in the third column includes the term
No role
it indicates that developers
MUST NOT overwrite the implicit ARIA semantics, or native semantics
of the HTML element.
While setting an ARIA role
and/or aria-*
attribute that matches the
implicit ARIA semantics is NOT RECOMMENDED, in some
situations explicitly setting these attributes can be helpful.
For instance, in user agents which lack exposing specific implicit
ARIA semantics.
HTML element |
Implicit ARIA semantics (explicitly assigning these in markup is NOT RECOMMENDED) |
ARIA roles, states and properties which MAY be used |
---|---|---|
a with
href
|
role=link
|
Roles:
DPub Roles:
Global It is NOT RECOMMENDED to use |
a without href
|
No corresponding role |
Global |
abbr
|
No corresponding role |
Global |
address
|
No corresponding role |
Global |
area with href
|
role=link
|
No
Global |
area without href
|
No corresponding role |
No Global |
article
|
role=article
|
Roles:
Global |
aside
|
role=complementary
|
Roles:
DPub Roles:
Global |
audio
|
No corresponding role |
Role:
Global |
autonomous custom element |
Role exposed from developer defined ElementInternals .
Otherwise no corresponding role.
|
If no developer defined role, Otherwise only allowed roles for the role exposed by the custom element's
Global |
b
|
No corresponding role |
Any role
Global |
base
|
No corresponding role |
No role or aria-* attributes
|
bdi
|
No corresponding role |
Any role
Global |
bdo
|
No corresponding role |
Any role
Global |
blockquote
|
No corresponding role |
Global |
body
|
role=document
|
No
Global |
br
|
No corresponding role |
Roles:
Global |
button
|
role=button
|
Roles:
Global |
canvas
|
No corresponding role |
Global |
caption
|
No corresponding role |
No |
cite
|
No corresponding role |
Any role
Global |
code
|
No corresponding role |
Any role
Global |
col
|
No corresponding role |
No role or aria-* attributes
|
colgroup
|
No corresponding role |
No role or aria-* attributes
|
data
|
No corresponding role |
Any role
Global |
datalist
|
role=listbox
|
No
Global |
dd
|
role=definition
|
No
Global |
del
|
No corresponding role |
Global |
dfn
|
role=term
|
Any role
Global |
details
|
role=group
|
No
Global |
dialog
|
role=dialog
|
Role:
Global |
div
|
No corresponding role |
Global |
dl
|
No corresponding role |
Roles:
Global |
dt
|
role=term
|
Role:
Global |
em
|
No corresponding role |
Global |
embed
|
No corresponding role |
Roles:
Global |
fieldset
|
role=group
|
Roles:
Global |
figcaption
|
No corresponding role |
Roles:
Global |
figure
|
role=figure
|
If the
If the
Global |
footer
|
If not a descendant of an article , aside , main , nav
or section element, or an element with role=article , complementary ,
main , navigation or region
then role=contentinfo .
Otherwise no corresponding role.
|
Roles:
DPub Roles:
Global |
form
|
If the form element has an
accessible name:
role=form .
Otherwise, no corresponding role.
|
Roles:
Global |
form-associated custom element |
Role exposed from developer defined ElementInternals .
Otherwise no corresponding role.
|
If no developer defined role, Otherwise only allowed roles for the role exposed by the custom element's
Global |
h1 to h6
|
role=heading ,
with the aria-level = positive integer.
|
Roles:
DPub Role:
Global |
head
|
No corresponding role |
No role or aria-* attributes
|
header
|
If not a descendant of an article , aside , main ,
nav or section element, or an element with role=article ,
complementary , main , navigation
or region then role=banner .
Otherwise no corresponding role
|
Roles:
Global |
hgroup
|
No corresponding role |
Global |
hr
|
role=separator
|
Roles:
DPub Role:
Global |
html
|
No corresponding role |
No role or aria-* attributes
|
i
|
No corresponding role |
Global |
iframe
|
No corresponding role |
Roles:
Global |
img with
alt="some text"
|
role=img
|
Roles:
DPub Role:
Global |
img with
alt=""
|
No corresponding role |
No role or aria-* attributes
except aria-hidden="true" .
|
img without alt attribute
|
role=img
|
If no accessible name is provided via other
Otherwise, if the |
input type=button
|
role=button
|
Roles:
Global |
input type=checkbox
|
|
Roles:
Developers SHOULD NOT use the
Otherwise, any global
Note: the HTML
|
input type=color
|
No corresponding role |
No |
input type=date
|
No corresponding role |
No
Global |
input type=datetime-local
|
No corresponding role |
No
Global |
input type=email
with no
list attribute
|
role=textbox
|
No
Global |
input type=file
|
No corresponding role |
No |
input type=image
|
role=button
|
Roles:
Global |
input type=month
|
No corresponding role |
No
Global |
input type=number
|
role=spinbutton
|
No
Global |
input type=password
|
No corresponding role |
No
Global |
input type=radio
|
role=radio
|
Role:
Developers SHOULD NOT use the
Otherwise, any global
Note: the HTML |
input type=range
|
role=slider
|
No
Developers SHOULD NOT use the
Otherwise, any global |
input type=reset
|
role=button
|
No
Global |
input type=search ,
with no list attribute
|
role=searchbox
|
No
Global |
input type=submit
|
role=button
|
No
Global |
input type=tel , with no list attribute
|
role=textbox
|
No
Global |
input type=text
or with a missing or invalid type , with no list attribute
|
role=textbox
|
Roles:
Global |
input type=text ,
search ,
tel ,
url ,
email ,
or with a missing or invalid type , with a list attribute
|
role=combobox
|
No
Developers SHOULD NOT use the
Otherwise, any
global |
input type=time
|
No corresponding role |
No
Global |
input type=url
with no
list attribute
|
role=textbox
|
No
Global |
input type=week
|
No corresponding role |
No
Global |
ins
|
No corresponding role |
Global |
kbd
|
No corresponding role |
Global |
label
|
No corresponding role |
No |
legend
|
No corresponding role |
No |
li
|
role=listitem
|
Roles:
DPub Roles:
Global |
link
|
No corresponding role |
No role or aria-* attributes
|
main
|
role=main
|
No
Global |
map
|
No corresponding role |
No role or aria-* attributes
|
math
|
role=math
|
No
Global |
mark
|
No corresponding role |
Global |
menu
|
role=list
|
Roles:
Global |
meta
|
No corresponding role |
No role or aria-* attributes
|
meter
|
No corresponding role |
No |
nav
|
role=navigation
|
Roles:
DPub Roles:
Global |
noscript
|
No corresponding role |
No role or aria-* attributes
|
object
|
No corresponding role |
Roles:
Global |
ol
|
role=list
|
Roles:
Global |
optgroup
|
role=group
|
No
Global |
option element that is in a list of options or that
represents a suggestion in a datalist
|
role=option
|
No
Developers SHOULD NOT use the
Global |
output
|
role=status
|
Global |
p
|
No corresponding role |
Global |
param
|
No corresponding role |
No role or aria-* attributes
|
picture
|
No corresponding role |
No role or aria-* attributes
|
pre
|
No corresponding role |
Global |
progress
|
role=progressbar
|
No
Global |
q
|
No corresponding role |
Global |
rp
|
No corresponding role |
Global |
rt
|
No corresponding role |
Global |
ruby
|
No corresponding role |
Global |
s
|
No corresponding role |
Global |
samp
|
No corresponding role |
Global |
script
|
No corresponding role |
No role or aria-* attributes
|
section
|
role=region if the
section element has an accessible name. Otherwise, no corresponding role.
|
Roles:
DPub Roles:
Global |
select (with NO multiple attribute and NO size
attribute having value greater than 1 )
|
role=combobox
|
Role: Developers SHOULD NOT use the
Otherwise, any global |
select (with a multiple attribute or a size attribute
having value greater than 1 )
|
role=listbox
|
No Developers SHOULD NOT use the
Otherwise, any global |
slot
|
No corresponding role | No role or aria-* attributes |
small
|
No corresponding role |
Global |
source
|
No corresponding role |
No role or aria-* attributes
|
span
|
No corresponding role |
Global |
strong
|
No corresponding role |
Global |
style
|
No corresponding role |
No role or aria-* attributes
|
SVG
|
role=graphics-document as defined by
SVG AAM
|
Global |
sub
|
No corresponding role |
Global |
summary
|
role=button
|
No
Global |
sup
|
No corresponding role |
Global |
table
|
role=table
|
Global |
tbody
|
role=rowgroup
|
Global |
template
|
No corresponding role |
No role or aria-* attributes
|
textarea
|
role=textbox
|
No
Global |
tfoot
|
role=rowgroup
|
Global |
thead
|
role=rowgroup
|
Global |
time
|
No corresponding role |
Global |
title
|
No corresponding role |
No role or aria-* attributes
|
td
|
|
No
Global |
th
|
If the ancestor
If the ancestor |
No
Global |
tr
|
role=row
|
No
Global |
track
|
No corresponding role |
No role or aria-* attributes
|
u
|
No corresponding role |
Global |
ul
|
role=list
|
Roles:
Global |
var
|
No corresponding role |
Global |
video
|
No corresponding role |
Role:
Global |
wbr
|
No corresponding role |
Global |
The elements marked with No corresponding role, in the
second column of the table do not have any implicit ARIA semantics,
but they do have meaning and this meaning may be
represented in roles, states and properties not provided by ARIA, and
exposed to users of assistive technology via accessibility APIs. It is
therefore recommended that developers add a role
attribute to a
semantically neutral element such as a div
or span
, rather than
overriding the semantics of the listed elements.
Developers are encouraged to make use of the following documents for guidance on using ARIA in HTML beyond that which is provided here:
Unless otherwise stated, developers MAY use aria-*
attributes in place of their HTML equivalents on HTML elements where the aria-*
semantics would be expected. For example, developers MAY use aria-disabled=true
on a button
element, rather than the disabled
attribute. However, developers SHOULD NOT use both the native HTML attribute and the aria-*
attribute together, and MUST NOT use the these features together when their values are in opposition to each other. As stated in
WAI-ARIA's Conflicts with Host Language Semantics,
user agents MUST ignore WAI-ARIA attributes and use the host language
(HTML) attribute with the same implicit ARIA semantics.
The following table represents HTML elements and their attributes which have aria-*
attribute parity.
Each language feature (element and attribute) in a cell in the first
column implies the ARIA semantics (states, and properties) given in
the cell in the second column of the same row. The third cell in each
row defines how developers can use the native HTML feature, along with
requirements for using the aria-*
attributes that supply the same
implicit ARIA semantics.
HTML feature |
Implicit ARIA semantics |
HTML feature and aria-* attribute developer guidance
|
---|---|---|
Any element where the checked
attribute is allowed
|
aria-checked="true"
|
Use the
Developers SHOULD NOT use the
Developers MAY use the |
Any element where the
disabled attribute is allowed
|
aria-disabled="true"
|
Use the
Developers MAY use the
Developers SHOULD NOT use
Developers MUST NOT use |
Any element where the placeholder attribute is allowed
|
aria-placeholder="..."
|
Use the
Developers MAY use the
Developers MUST NOT use the |
Any element where the max
attribute is allowed
|
aria-valuemax="..."
|
Use the
Developers MAY use the
Developers SHOULD NOT use
Developers MUST NOT use |
Any element where the min
attribute is allowed
|
aria-valuemin="..."
|
Use the
Developers MAY use the
Developers SHOULD NOT use
Developers MUST NOT use |
Any element where the readonly
attribute is allowed
|
aria-readonly="true"
|
Use the
Developers MAY use the
Developers SHOULD NOT use the
Developers MUST NOT use |
Element with
Note: this is equivalent to the |
aria-readonly="false"
|
Developers MUST NOT set aria-readonly="true" on an element that has isContentEditable="true" .
|
Any element where the
required attribute is allowed
|
aria-required="true"
|
Use the
Developers MAY use the
Developers SHOULD NOT use the
Developers MUST NOT use |
Any element where the colspan
attribute is allowed
|
aria-colspan="..."
|
Use the
Developers MAY use the
Developers SHOULD NOT use the
Developers MUST NOT use |
Any element where the rowspan
attribute is allowed
|
aria-rowspan="..."
|
Use the
Developers MAY use the
Developers SHOULD NOT use the
Developers MUST NOT use |
Element that is a candidate for constraint validation but that does not satisfy its constraints |
aria-invalid="true"
|
The |
Developers MUST use lowercase ASCII
letters for all role
token values and any state or property
attributes (aria-*
) whose values are defined as tokens.
Columns 1 to 4 of the ARIA Roles, States and Properties table provide an informative (non-normative) reference to the ARIA roles, states and properties permitted for use in HTML. All ARIA roles, states and properties are normatively defined in the Accessible Rich Internet Applications (WAI-ARIA) 1.1 specification. Links to ARIA roles, states and properties in the table reference the normative Accessible Rich Internet Applications (WAI-ARIA) 1.1 definitions.
Column 5 of the ARIA Roles, States and
Properties table, defines extensions to the Kinds of content (defined in the
[HTML] specification) categories each role
has when it is used on a
HTML element. Column 6 defines what HTML elements can be descendants of
an element with a particular implicit or
explicit role
value.
For example, a button
element has an implicit
role=button
. A button
element allows phrasing content as descendants and does not allow interactive content or descendants with a tabindex
attribute. Therefore, any elements specified with a role=button
also MUST NOT allow any interactive content descendants, elements with a tabindex
specified or any elements with role values that are in the interactive content category (identified in
Column 3).
<!-- conformance checkers will report an error -->
<button>
<div role="button">...</div>
</button>
<div role="button">
<button>...</button>
</div>
<div role="link">
<textarea>...</textarea>
</div>
As well as sections marked as non-normative, all authoring guidelines, diagrams, examples, and notes in this specification are non-normative. Everything else in this specification is normative.
The key words MAY, MUST, MUST NOT, NOT RECOMMENDED, and SHOULD NOT in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.
Conformance checkers that claim support for checking of ARIA in HTML,
MUST implement checks for the document conformance requirements for use
of the ARIA role
and aria-*
attributes on HTML elements as defined
in this specification.
Documents MUST NOT use any role
values with elements in the § 3.
Document conformance requirements for use of ARIA attributes in HTML table, other than the
corresponding role value (if any) as listed for that element in the
third column, other than those indicated in the second column (whose
explicit use in markup is NOT RECOMMENDED).