ARIA
Every role, and what it obliges you to do
Declaring a role is a promise about how an element behaves, and the browser holds you to it. Of the 94 roles in the specification, 34 carry an obligation you can get wrong. A state you have to supply, a parent you have to sit inside, or children you have to contain. Miss the state and the finding usually lands on 4.1.2 Name, Role, Value. Break the parent or the children and it lands on 1.3.1 Info and Relationships instead.
Worth knowing before you start. In February 2026, 82.7% of the top million home pages carried ARIA, up from 79.4% a year earlier. The pages using it averaged 59.1 accessibility errors and the pages without it averaged 42, so the pages reaching for the fix carried 17 more barriers. WebAIM is careful to say ARIA may not be the cause, since those pages were also more complex. Either way it settles the question of whether ARIA is free. For the attributes that go with these roles, see ARIA states and properties.
Check for a native element before you reach for a role
Most of these have an HTML element that means the same thing and behaves correctly with no help at all. A button element is a button. A nav is navigation. ARIA's own first rule puts it plainly, that if you can use a native HTML element or attribute with the semantics and behavior you require already built in, then do so. The reason is that the element brings its keyboard behavior along and the role does not, so a div wearing role="button" still needs you to write the Enter handling, the Space handling and the focus handling by hand. ARIA, explained without the jargon covers the cases where reaching for it is worth it.
Landmark roles cut a page into regions people can jump between
Landmarks split a page into regions a screen reader user can move between directly, so the header, the navigation, the main content and the footer become places to jump to rather than stretches of text to sit through.
- banner
The site-wide page header, the part that repeats across pages.
- complementary
Content that supports the main content and still makes sense on its own, like a sidebar.
- contentinfo
The site-wide page footer, the copyright and contact end of the page.
- form
A form region, worth naming when a page carries more than one.
- main
The page's own content. There should be exactly one, and the header, footer and sidebars stay outside it.
- navigation
A set of links for moving around the site or the page.
- region
A section important enough to jump to. It only becomes a landmark once it has a name.
- search
The search facility, marked as a region of the page rather than as a single control.
Widget roles say an element is a control somebody has to operate
A widget role tells assistive technology that an element is interactive and what kind of control it is. Buttons, checkboxes, sliders, tabs and menu items all live here.
- button
A button does something when you activate it. If it goes to a URL instead, that is a link.
- checkbox
A control with two or three states that has to announce which one it is in.
needs aria-checked
- combobox
An input that pops up a list to help you fill it, and has to say what it controls and whether that list is open.
needs aria-controls, aria-expanded
- grid
A table you can move through cell by cell with the keyboard.
must contain row or rowgroup
- gridcell
One cell in a grid.
goes inside row
- link
A link goes somewhere. If it acts on the page you are already on, that is a button.
- listbox
A list of options someone can move through and choose from.
must contain group or option
- menu
A list of commands, usually opened from a trigger, and built to be driven with arrow keys.
must contain group or menuitem or menuitemradio or menuitemcheckbox
- menubar
A menu that stays visible and lays its options out along a bar.
must contain group or menuitem or menuitemradio or menuitemcheckbox
- menuitem
One command inside a menu.
goes inside group or menu or menubar
- menuitemcheckbox
A menu item that toggles on and off like a checkbox.
needs aria-checked · goes inside group or menu or menubar
- menuitemradio
A menu item that is one option in a set where only one can be chosen.
goes inside group or menu or menubar
- option
One choice inside a listbox, which has to announce whether it is currently selected.
needs aria-selected · goes inside group or listbox
- progressbar
Shows how far a task has got. It is read-only, not something to operate.
- radio
One option in a set where only one can be chosen, and it belongs inside a radiogroup.
needs aria-checked
- radiogroup
The container that turns a set of radios into a single choice rather than several separate ones.
must contain radio
- scrollbar
A control that scrolls something, and has to say what it scrolls and where it currently sits.
needs aria-controls, aria-valuenow
- searchbox
A text input meant for search queries.
- slider
A control you set by moving a handle along a range.
needs aria-valuenow
- spinbutton
A control for stepping a value up and down.
- switch
A binary on-or-off control with no mixed state, usually taking effect the moment it is flipped.
needs aria-checked
- tab
A label that reveals its panel, and it means nothing outside a tablist.
goes inside tablist
- tablist
The container for a set of tabs, which has to actually contain tabs.
must contain tab
- tabpanel
The panel a tab reveals.
- textbox
A text input that takes free-form typing.
- tree
A hierarchy whose branches open and close.
must contain group or treeitem
- treegrid
A grid whose rows open and close, so it behaves as a table and a tree at once.
must contain row or rowgroup
- treeitem
One node in a tree.
goes inside group or tree
Document structure roles describe how the content is organized
These roles describe the shape of the content rather than controls somebody operates. Headings, lists, tables, figures and paragraphs, so that assistive technology users can navigate by structure instead of reading straight through.
- application
Hands every keystroke to your code instead of the screen reader. Use it only when nothing else will do.
- article
A self-contained piece of content that still makes sense pulled out on its own.
- blockquote
A quotation from somewhere else.
- caption
The title of a table or a figure, sitting inside the thing it titles.
goes inside figure or grid or table or treegrid
- cell
One data cell in a table.
goes inside row
- code
A fragment of computer code.
- columnheader
A header cell that names its column.
goes inside row
- definition
The meaning of a term.
- deletion
Text that has been removed.
- directory
A list of references, such as a table of contents. ARIA 1.2 deprecates it in favor of list.
- document
Content meant to be read rather than operated, which puts screen readers back into reading mode.
- emphasis
Text carrying stress emphasis, the meaning the em element has.
- feed
A stream of articles that keeps loading more as somebody scrolls.
must contain article
- figure
An illustration with a caption, referred to from the text around it.
- generic
The role a plain div or span already has. It exists for browsers, not for authors.
- group
A set of related items that is not important enough to be a landmark and stays out of the page outline.
- heading
A heading, which carries its level in aria-level rather than in the element name.
needs aria-level
- img
Anything built from markup that should be announced as a single image.
- insertion
Text that has been added.
- list
A list, which has to contain actual list items.
must contain listitem
- listitem
One entry in a list.
goes inside directory or list
- math
A mathematical expression.
- meter
A gauge showing where a value sits in a known range, like disk usage. It is not a progress bar.
needs aria-valuenow
- none
Strips an element's own meaning while leaving its content in place. The same role as presentation.
- note
An aside or annotation about the content around it.
- paragraph
A paragraph of text.
- presentation
Strips an element's own meaning while leaving its content in place. The same role as none.
- row
One row in a table, grid or treegrid.
goes inside grid or rowgroup or table or treegrid · must contain cell or columnheader or gridcell or rowheader
- rowgroup
A band of rows, the equivalent of thead or tbody.
goes inside grid or table or treegrid · must contain row
- rowheader
A header cell that names its row.
goes inside row
- separator
A divider between sections. It becomes a control when it can be moved, and only then does it need a value.
needs aria-valuenow
- strong
Text carrying strong importance, the meaning the strong element has.
- subscript
Text set below the baseline.
- superscript
Text set above the baseline.
- table
Data laid out in rows and columns for reading, not for operating.
must contain row or rowgroup
- term
A word or phrase being defined.
- time
A point in time or a length of it.
- toolbar
A container for related controls that groups them for keyboard navigation.
- tooltip
A small label that appears on hover or focus, and it should hold no controls of its own.
Live region roles announce changes nobody navigated to
A live region tells assistive technology to announce a change the user never went looking for. A validation error, a save confirmation, a count going up.
- alert
An urgent message that screen readers announce the moment it appears.
- log
A running record where new entries pile up, like a chat history or an activity feed.
- marquee
Content that scrolls, cycles or rotates on its own.
- status
A message worth announcing that is not urgent enough to interrupt what somebody is doing.
- timer
A counter that updates as time passes.
Window roles mark content layered over the page
A dialog is content stacked on top of the page that wants an answer before the reader goes back to what they were doing. The role tells assistive technology that this is now the thing to deal with.
- alertdialog
An urgent dialog carrying a message that has to be answered before anything else.
- dialog
Content layered over the page that wants a response before you go back.
Abstract roles belong in the specification, not your markup
These twelve roles exist so the specification can group related roles together and describe what they have in common. Every role you can actually use inherits from one of them, and that inheritance is where a role gets its global attributes and much of its shape.
- command
Groups the widget roles that do something when you activate them.
- composite
Groups the widget roles that contain and manage other widgets, such as tablists and listboxes.
- input
Groups the widget roles that collect a value from someone.
- landmark
Groups the roles that divide a page into navigable regions.
- range
Groups the roles that carry a value inside a known span, such as sliders and progress bars.
- roletype
The base role every other role inherits from, and the source of the global attributes.
- section
Groups the structural roles that form a distinct part of a document.
- sectionhead
Groups the roles that introduce and label whatever follows them.
- select
Groups the widget roles that offer a set of choices.
- structure
Groups every role that describes content rather than controls.
- widget
Groups the roles that represent interactive controls.
- window
Groups the roles for content layered over the page.
Where to go next
- 4.1.2 Name, Role, Value is the criterion most of this serves.
- The ACT test rules show how a checker verifies ARIA is used properly.
- The technique library carries W3C's 26 ARIA techniques, rewritten.
- ARIA explained without the jargon is where to start if this is new.
- ARIA states and properties are the other half of the model.
82 of the 94 roles are for authors to use. The other 12 are abstract and belong to the specification alone. Putting one in your markup does not give the element that role, because a browser ignores a role it cannot use and falls back to whatever the element already was.