Link Search Menu Expand Document

ARIA Deep Dive

Table of Contents

What is ARIA?

ARIA stands for Accessible Rich Internet Applications and is defined by the World Wide Web Consortium. ARIA is used to help users who rely on screen readers understand what’s going on when a custom JavaScript event or script that is fired. Imagine you’re reading content on a website and an alert pops up in a corner of your screen, perhaps to say that a download is complete or that there has been some kind of error. Unless that popup event is tied to an action in ARIA, any user with a screen reader would have no idea that it ever occured, and their reader would keep on reading whatever text they were previously focused on.

One way to think about ARIA is that it is analogous to HTML. The difference between a plain old document of just text and an HTML document is that HTML adds a layer metadata and information that a browser uses to change how the document’s text and other elements are displayed. HTML can also change how things function, like a form or link, but ignore those for a second. HTML doesn’t change the text or what the document says, it just changes what it looks like and how it is laid out.

ARIA is just like that. It adds an additional layer of metadata to the HTML document. Instead of changing how it looks and behaves, it just adds additional information that is useful for screen readers. That’s it. ARIA is ONLY useful for screen readers. It doesn’t change anything about a page visually. For example, the attribute aria-hidden="true" doesn’t visually hide anything, but it does “hide” the element from screen readers.

When Should I Use ARIA?

HTML does the job just fine most of the time. If there is a native HTML element for something you want, like a <header>, <nav>, <button>, or <form>, just use it. ARIA should be used when there is a scripting event or a custom element that requires more than standard HTML to function. In those cases, browsers, screen readers, and other renderers must be able to determine the following attributes:

  • label (or name)
  • role
  • properties
  • state (for widgets that can change state)

and must be notified of any changes to these attributes, particularly state.

If you’re going to use ARIA, you must be thorough! Go all in or don’t use it at all. Imagine a user that is reliant on but also very experienced with screen reader technologies. The following situations are in order of preference:

  1. An ARIA-compliant site. All of the controls work the way they’re supposed to, and interactions are easy and follow expected conventions.
  2. A site with no ARIA code at all. It’s a pain in the neck to get around, but it’s something that the user is unfortunately kind of used to. Things aren’t easy, but at least all of their keyboard shortcuts don’t break.
  3. A site that has some ARIA in places, but not all. What a mess! The site behaves in unpredictable ways. Some controls work and some require switching to another set of shortcuts and keystrokes. The experience is extremely frustrating and everything has to be learned one element at a time.

The Web Accessibility initiative has a wonderful write-up on why no ARIA is better than bad ARIA.

A helpful way to remember this is the ARIA axioms:

  • NEVER use ARIA unless you have to.
  • ALWAYS use ARIA when you have to.
  • You’re probably doing it wrong.

ARIA Lifecycle and Why It Matters

Web browsers are designed to load and draw the screen as quickly as possible. As soon as the HTML and CSS are downloaded, the browser instantly builds a DOM (Document Object Model) and applies all of the relevant CSS rules to it. Then it draws that DOM to the screen before it even tries to load, parse, and run additional JavaScript code, unless specifically designed to do it differently. Occasionally, that JavaScript code has to do with measuring the active window’s size in order to apply certain styles or effects, which can lead to really awkward jitter as the page has to quickly be redrawn just after it has loaded. You’ve probably seen it countless times as pages struggle to load on mobile devices and elements appear only to quickly disappear.

Similarly, web browsers and screen readers parse a page’s initial HTML code to create an Accessibility Tree. This happens as soon as the DOM is created, and before the JavaScript is executed. What this means is that if you want a browser or screen reader to be aware of any element, that element must be present in the intial HTML.

Imagine you want an “alert” widget that pops up on the screen when something important happens. If you didn’t need to worry about accessibility, you can do this any number of ways. You could just create elements on the fly and add them to the DOM using JavaScript, like this:

// Bad, inaccessible way to add a popup widget.
function showAlert(alertMessage) {
  // Creates a new div. This will NOT be parsed in the Accessibility Tree.
  const newAlertDiv = document.createElement('div')
  const newAlertText = document.createTextNode(alertMessage)
  newAlertDiv.appendChild(newAlertText)

  // Add that new div to the some container that holds and styles all the alerts.
  const alertsContainer = document.getElementById('alertsContainer')
  alertsContainer.appendChild(newAlertDiv)
}

In order to make the same sort of behavior happen accessibly:

  1. The accessible elements must exist when the HTML DOM and Accessibility Tree are created.
  2. The accessible elements must be given the correct role attribute so that behaviors and event listeners can be added properly.
  3. The elements must be used and updated in a way that will be recognized by screen readers.

For this example, we would load the page with something like this:

<div id='alertContainer' role='alert' aria-live='polite'></div>

By creating an empty element with the proper role, the Accessibility Tree will add a listener automatically. Whenever the content of an alert widget is updated, the screen reader is advised and will read whatever is in the <div> as soon as it’s done reading whatever element it’s currently on. That specific behavior based on the polite value; if we changed the attribute to aria-live='assertive', then it would read the alert immediately, interrupting the screen reader. With this setup done, the new accessible version of the code is even simpler.

// Good, accessible code PROVIDED that the HTML is preloaded and tagged correctly.
function showAlert(alertMessage) {
  // Add the message to the container. ARIA's 'alert' role can handle the rest!
  document.getElementById('alertContainer').innerHTML(alertMessage)
}

For working examples of this and other widgets, see the Widget Example Library below.

ARIA Labels and Names

When a screen reader comes to an element, what will it say? It depends. “Accessible Names” are computed using the following priorities:

  1. aria-labelledby - If this attribute exists, it will override any other name and label methods.
  2. aria-label - Second choice. Note that this text is invisible except to screen readers.
  3. Native Text - The text inside an element’s tags (like in a <button>) or standard alternatives (<label> on form, alt on an image).
  4. title - As a last resort, the title may be used. Don’t rely on title because it generally only shows up when users hover over something, and keyboard and mobile users don’t have a hover mechanism.

aria-labelledby

The aria-labelledby property is a reference or pointer to another element where the current element’s name is. For example, if you had an image on your page with a caption under it that sighted users could read, you can use that caption as your alt text instead of adding it again to the image.

<!-- Bad example: A screen reader would read the alt text twice: once on the image and again right below it. -->
<img src="pollock_painting.png" alt="Jackson Pollock's 'drip technique' is an example of abstract art.">
<div class="citation">Jackson Pollock's 'drip technique' is an example of abstract art.</div>

<!-- Better example: When the screen reader finds the image, it will read the proper citation once. -->
<img src="pollock_painting.png" aria-labelledby="pollock_citation">
<div class="citation" id="pollock_citation">Jackson Pollock's 'drip technique' is an example of abstract art.</div>

<!-- Best example: When a semantic HTML equivalent exists, skip ARIA altogether -->
<figure>
  <img src="pollock_painting.png">
  <figcaption>Jackson Pollock's 'drip technique' is an example of abstract art.</figcaption>
</figure>

One additional strength of aria-labelledby is that you can chain multiple labels together. This is especially helpful for things like complex forms

<span id="males"> ... <span id="frank"> ... <span id="ranking"> 
<input type="text" aria-labelledby="males frank ranking">

aria-label

The aria-label property is a way to add a label to an element that does not normally appear on screen. Since aria-label is prioritized over native text, screen readers will use this instead of whatever text is already inside the element.

<!-- Screen readers should say 'Close Window' instead of 'X' -->
<button onClick="closeWindow" aria-label="Close Window">X</button>

<!-- This can be used to make links more descriptive, since links are often read in a list and lose some context -->
<a href="http://w3.org" aria-label="The World Wide Web Consortium">W3C</a>

ARIA Roles

Every HTML element has a specific role on a page, which tells a screen reader how and when to access it and what properties it ought to have. For instance, an image has different behavior from a link, and a menu is navigated differently from a table.

Landmark Roles

Landmarks are expected areas on a web page or app, and often screen readers have quick shortcuts to navigate between them. The most common landmarks are also common semantic HTML tags, so for example if you are using the <nav> tag, a screen reader will understand that it is a navigation menu the same as if you applied a role attribute, like <div role='navigation'>. Where possible, it is preferable to just use the HTML tags.

HTML Tag Required Only 1 Per Page ARIA Equivalent Supported by Screen Readers
<header> Yes Yes role=”banner” Yes
<nav> Yes No** role=”navigation” Yes
<main> Yes Yes role=”main” Yes
N/A No No role=”search” Yes
<h1> Yes Yes N/A Yes: Usually with an <h1> shortcut
<h2> - <h6> No No N/A Yes
<aside> No No role=”complementary” Yes
<section> No No role=”region” Mixed
<article> No No role=”article” Mixed
<form> No No role=”form” Mixed: Only if role=”form” present
<footer> Yes Yes role=”contentinfo” Yes

Interactivity Modes

Screen readers respond differently based on the kind of mode they’re in, which is triggered by certain role attributes.

Document Mode

The default role for a web page is role='document'. This means that the whole HTML document is broken into pieces, where lists of headers, links, and menus are combined. Links are treated specially, images’ alt text is read, and certain landmark sections are expected. If no other role attribute is applied, document is assumed.

Presentation Mode

When the attribute role='presentation' is used on an element, ALL special treatment of the document is stripped out. This means that all HTML tags are treated as <div>s or <span>s, and all text is treated as plain text. All other ARIA states and properties are ignored.

<!-- Instead of "Header Level 1: ARIA Guidebook", the reader would just say "ARIA Guidebook" -->
<h1 role='presentation'>ARIA Guidebook</h1>

<!-- Instead of saying "Link: University of Central Florida", the reader would just say "UCF" -->
<a role="presentation" href="https://ucf.edu" aria-label="University of Central Florida">UCF</a>

Application Mode

Application mode (role='application') allows developers to rework how screen readers interact with the page or app content. It turns off almost all of the default screen reader behavior in favor of custom-coded solutions. While it is sometimes necessary, avoid it when you can and limit it’s scope when you can’t.

  • All keyboard navigation features are disabled except Tab, Enter/Return, space bar, and arrow keys.
  • The following elements can NOT be focused on without explicit tabindex='0': <p>, <h1>-<h6>, <div>, <span>, lists, tables, etc.
  • Elements cannot be interacted without explicit code.

Some widgets are Applications by default: dialogs, alertdialogs, and tablists. When using these, you may need to revert the content inside them back to documents.

<div role='alertdialog'>
  <!-- Without the role='document' attribute below, the link would not be interactive for screen readers. -->
  <div role='document'>
    Alert! There is an error. <a href="../path/to/logs">See error logs.</a>
  </div>
</div>

Math Role

While there are other ways to render mathematical and other equations to the screen, complicated equations are often saved as images with no alt text, making them inaccessible. The role='math' attribute allows screen readers to take equations and render them properly and often allows users to traverse through the equations. Without getting too much into the weeds, here is a small example:

<div role="math" aria-label="a squared plus b squared equals c squared">
  <math xmlns="http://www.w3.org/1998/Math/MathML">
    <mrow>
      <msup>
        <mi>a</mi>
        <mn>2</mn>
      </msup>
      <mo>+</mo> 
      <msup>
        <mi>b</mi>
        <mn>2</mn>
      </msup>
      <mo>=</mo>
      <msup>
        <mi>c</mi>
        <mn>2</mn>
      </msup>
    </mrow>
  </math>
</div>

Which would render as:

a 2 + b 2 = c 2


We recommend using MathJax as a preprocesser to make it easier for faculty to enter equations, so they don’t have to type in so much convoluted HTML code. It also has a built-in Accessibility Components which, among other things, has a process to render formulas as text output for screen readers, which can automatically be attached like the aria-label in the example above.

Pseudo HTML Roles

If at all possible, you’ll want to use the proper semantic HTML syntax for available tags. At times, you may need to retrofit existing code, and change existing elements to become accessible. For example, if you want a page header, you should simply use an <h1> tag. However, if for some reason, that isn’t feasible (like poorly-written existing JavaScript code relying on the exact number of divs in a page or some such nonsense), you can make any element behave as an <h1> using ARIA, for example:

<p role='heading' aria-level='1'>This text is a header now</p>

Again, using a role attribute to override the semantic HTML tag is BAD PRACTICE and should be avoided where possible. But in a pinch, it can turn an inaccessible element into an accessible one. Available Pseudo HTML roles are:

  • button
  • checkbox
  • columnheader
  • combobox
  • contentinfo
  • form
  • grid
  • gridcell
  • heading
  • img
  • link
  • listbox
  • listitem
  • option
  • radio
  • radiogroup
  • row
  • rowgroup
  • rowheader
  • scrollbar
  • textbox

Widget Roles

If there are interactive elements on your page (like a text field, check box, or slider), they are most likely some form of <input> or <button> element. But many of these elements behave in very different ways, and need different controls for users who are constrained to a keyboard. Instead of inventing your own custom controls, your users will be able to use the ones they’re used to, as long as their device can tell what kind of widget it is. W3.org has full documentation on interface widgets and roles.

Individual Widgets

Individual widgets can be used in isolation as a standalone element OR as a part of a larger, composite widget.

Widget Role Required Attributes Optional Attributes Definition
alert None None A message with important, and usually time-sensitive, information. See alertdialog and status.
alertdialog None None A type of dialog that contains an alert message, where initial focus goes to an element within the dialog. See alert and dialog.
button None aria-expanded
aria-pressed (for toggle buttons)
An input that allows for user-triggered actions when clicked or pressed.
checkbox aria-checked None A checkable input that has three possible values: true, false, or mixed.
dialog None None A pop-up that interrupts the current process in order to prompt the user to enter information or requires some response. See alertdialog.
gridcell Must be contained or owned by row aria-readonly
aria-required
aria-selected
A cell in a grid or treegrid.
link None aria-expanded An interactive reference to an internal or external resource that, when activated, navigates to that resource. See button.
log None None A type of live region where new information is added in meaningful order and old information may disappear. See marquee.
marquee None None A type of live region where non-essential information changes frequently. See log.
menuitem Must be contained or owned by group, menu, or menubar None An option in a set of choices contained by a menu or menubar.
menuitemcheckbox Must be contained or owned by
menu, or menubar
aria-checked A menuitem with a checkable state whose possible values are true, false, or mixed.
menuitemradio Must be contained or owned by group, menu, or menubar aria-checked A checkable item in a set of other elements with role menuitemradio, only one of which can be checked at a time.
option Must be contained or owned by listbox aria-checked
aria-posinset
aria-selected
aria-setsize
A selectable item in a <select> list.
progressbar None aria-busy
aria-valuemax
aria-valuemin
aria-valuenow
aria-valuetext
An element that displays the progress status for tasks that take a long time.
radio Must be contained or owned by radiogroup aria-checked A checkable item in a set of other elements with role radio, only one of which can be checked at a time.
scrollbar aria-controls
aria-orientation
aria-valuemax
aria-valuemin
aria-valuenow
aria-valuetext An object that controls the scrolling of content within a viewing area, whether or not the content is fully displayed within the viewing area.
slider aria-valuemax
aria-valuemin
aria-valuenow
aria-orientation An input element where the user selects a value from within a given range.
spinbutton aria-valuemax
aria-valuemin
aria-valuenow
aria-required A range input that lets users select from discrete options. Similar to <select> with <option>s, but visually more… spinny.
status If controlled by another element, that element should use aria-controls aria-live
aria-atomic
A container whose content is advisory information for the user but is not important enough to justify an alert, often but not necessarily presented as a status bar. See alert.
tab Must be contained or owned by tablist aria-selected A grouping label providing a mechanism for selecting the tab content that is to be rendered to the user.
tabpanel Related tab should use aria-controls or the tabpanel should use aria-labelledby to connect them. None A container for the resources associated with a tab, where each tab is contained in a tablist.
textbox   aria-activedescendant
aria-autocomplete
aria-errormessage
aria-haspopup
aria-invalid
aria-multiline
aria-placeholder
aria-readonly
aria-required
A type of input that allows free-form text as its value.
timer None aria-live A type of live region containing a numerical counter for elapsed time from a start point, or time remaining until an end point.
tooltip Should be referenced using aria-describedby None A contextual popup that displays a description for an element.
treeitem Must be contained or owned by group or tree aria-expanded
aria-haspopup
An option item of a tree. This is an element within a tree that may be expanded or collapsed if it contains a sub-level group of tree item elements.

Composite Widgets

Composite widget roles are applied to parent elements that contain one or more child elements, similar to <ol> or <ul> with their <li> children in basic HTML.

Widget Role Required Attributes Optional Attributes Definition
combobox aria-controls
aria-expanded
aria-activedescendant
aria-autocomplete
aria-errormessage
aria-haspopup
aria-invalid
aria-readonly
aria-required
An input that controls another element, such as a listbox or grid, that can dynamically pop up to help the user set the value of the input.
grid Must contain or own rows or a rowgroup with its own rows. aria-multiselectable
aria-readonly
A collection of rows with cells that can be navigated horizontally and vertically using arrow keys.
listbox Must contain or own options or a group with its own options. aria-errormessage
aria-expanded
aria-invalid
aria-multiselectable
aria-readonly
aria-required
Widget that allows selection of one or more items from a list. See combobox and list.
menu Must contain or own menuitems, menuitemcheckboxs, menuitemradios, or a group with its own menuitems, menuitemcheckboxs, or menuitemradios aria-orientation defaults to vertical A type of widget that offers a list of choices to the user.
menubar Must contain or own menuitems, menuitemcheckboxs, menuitemradios, or a group with its own menuitems, menuitemcheckboxs, or menuitemradios aria-orientation defaults to horizontal A presentation of menu that usually remains visible and is usually presented horizontally.
radiogroup Must contain or own radios aria-checked
aria-errormessage
aria-invalid
aria-readonly
aria-required
A group of radio buttons.
tablist Must contain or own tabs aria-multiselectable
aria-orientation
A list of tab elements, which are references to tabpanel elements.
tree Must contain or own treeitems or a group with its own treeitems. aria-errormessage
aria-invalid
aria-multiselectable
aria-required
A widget that allows the user to select one or more items from a hierarchically organized collection.
treegrid Must contain or own rows or a rowgroup with its own rows. aria-readonly A grid whose rows can be expanded and collapsed in the same manner as for a tree.

Extraneous Roles

There are a handful of specific element roles that are similar to widgets in that they are used for small, limited use cases, but they are not interactive in the same way. It may be helpful to think of them as a unique HTML tag that hasn’t been added to the HTML spec yet and can only be accessed via ARIA attributes, similar to the role="search" landmark for a search bar.

  • The definition role may help screen readers curate lists of terms in a text, but isn’t widely supported yet.
  • The note is similar to an <aside> tag or complementary role, but isn’t a landmark. It is read in context.
  • The directory role used to be used for Table of Contents or similar elements, but is now deprecated.
  • Abstract roles are NOT used in code, but are included in the spec. They include invisible roles that implied when other roles are used, such as composite, landmark, section, and widget.

ARIA Properties and States

The primary difference between properties and states is that properties (like aria-labelledby) are unlikely to change during a page or application’s lifecycle, where states (like aria-checked) are designed to change.

Global Properties and States

Some states and properties can be applied to ANY element globally, whether or not those elements have specific ARIA roles.

  • The P/S column is to help distinguish whether a specific tag is an ARIA property or and ARIA state.
  • An ID Reference List is a space-separated list of IDs, for example 'firstID secondID thirdID'.
  • When the values are an enumerated list, the value in all caps is the DEFAULT.
Name P/S Values Notes
aria-atomic P true FALSE Determines if an entire region is presented as a unit when aria-relevant is triggered.
aria-controls P ID Reference List Lists the element(s) whose contents or presence are controlled by the current element. See aria-owns.
aria-describedby P ID Reference List Lists the element(s) that describe the current element. Where labels should be concise, descriptions are verbose.
aria-details P ID Reference Lists the element that describes the current element. Can be an external link.
aria-dropeffect P copy execute link move NONE popup ALMOST DEPRECATED Conveys to users what happens when dragging and dropping an element.
aria-flowto P ID Reference List Lists the next element(s) for a reading order that differs from default document reading order.
aria-keyshortcuts P string Space-separated list of keyboard shortcuts that can activate a command or textbox widget.
aria-label P string Used to label everything EXCEPT caption, code, deletion, emphasis, generic, insertion, paragraph, presentation, strong, subscript, or superscript elements.
aria-labelledby P ID Reference List Lists element(s) that describe the current element. Cannot be used on same elements as aria-label.
aria-live P assertive OFF polite Determines at what priority a screen reader should present changes to the element.
aria-owns P ID Reference List Lists the child element(s) of the current element that can’t be inferred by the DOM. See aria-contains.
aria-relevant P additions all removals text ADDITIONS TEXT Determines what is updated in an aria-atomic element when the accessibility tree is modified.
aria-roledescription P string Defines a human-readable description of an ARIA role for an element.
aria-busy S true FALSE Indicates that an element is being modified and that screen readers may need to wait before the user is notified.
aria-grabbed S true false UNDEFINED ALMOST DEPRECATED Indicates if an element is currently grabbed in a drag-and-drop interaction.
aria-hidden S true false UNDEFINED Indicates whether an element is exposed to a screen reader. It does NOT affect visibility on screen.

Widget Properties and States

A widget is anything that receives user input or processes user actions. For ARIA, that includes objects with certain roles like alert, button, menu, progressbar, textbox, tooltip, etc. See the Widget Roles section above for a full list.

  • The P/S column is to help distinguish whether a specific tag is an ARIA property or and ARIA state.
  • When the values are an enumerated list, the value in all caps is the DEFAULT.
Name P/S Values Notes
aria-autocomplete P inline list both NONE Indicates whether inputting text could trigger display of one or more predictions for a combobox, searchbox, or textbox.
aria-haspopup P true FALSE menu listbox tree grid dialog Indicates the availability and type of interactive popup element, such as menu or dialog, that can be triggered by an application, button, combobox, gridcell, link, menuitem, slider, tab, textbox, or treeitem.
aria-level P integer Defines the hierarchical level of a heading, listitem, or row.
aria-multiline P true FALSE Indicates whether a textbox or searchbox accepts multiple lines of input or only a single line.
aria-multiselectable P true FALSE Indicates that the user may select more than one item from a grid, listbox, tablist, or tree
aria-orientation P horizontal vertical UNDEFINED Indicates the orientation of a scrollbar, select, separator, slider, tablist, or toolbar.
aria-readonly P true FALSE Indicates whether a checkbox, combobox, grid, gridcell, listbox, radiogroup, slider, spinbutton, or textbox is editable
aria-required P true FALSE Indicates that user input is required on a checkbox, combobox, gridcell, listbox, radiogroup, spinbutton, textbox, or tree before a form may be submitted.
aria-sort P ascending descending NONE other Indicates if items referenced by a columnheader or rowheader are sorted in ascending or descending order.
aria-valuemax P number Defines the maximum allowed value for a range, scrollbar, separator, slider, or spinbutton.
aria-valuemin P number Defines the minimum allowed value for a range, scrollbar, separator, slider, or spinbutton.
aria-valuenow P number Defines the minimum allowed value for a meter, range, scrollbar, separator, slider, or spinbutton.
aria-valuetext P string Defines the human-readable text alternative of aria-valuenow for a meter, progressbar, scrollbar, slider, or spinbutton.
aria-checked S true false mixed UNDEFINED Indicates the current “checked” state of a checkbox, menuitemcheckbox, option, radio, or switch. See aria-pressed and aria-selected.
aria-disabled S true FALSE Indicates whether an application, button, composite, gridcell, group, input, link, menuitem, scrollbar, separator, or tab is disabled, meaning not editable but otherwise operable.
aria-expanded S true false UNDEFINED Indicates whether a grouping element owned or controlled by an application, button, checkbox, combobox, gridcell, link, listbox, menuitem, row, rowheader, tab, or treeitem is expanded or collapsed.
aria-hidden S true false UNDEFINED Indicates whether an element is exposed to screen readers. Does NOT affect visual display. Applies to ANY element.
aria-invalid S true FALSE grammar spelling Indicates if user input for an application, checkbox, combobox, gridcell, listbox, radiogroup, slider, spinbutton, textbox, or tree fails validation.
aria-pressed S true false mixed UNDEFINED Indicates the current state of toggled buttons. See aria-checked and aria-selected.
aria-selected S true false UNDEFINED Indicates if a gridcell, option, row, or tab is selected. See aria-checked and aria-pressed.

Widget Example Library

Before creating ANY widget using ARIA, you should absolutely check out the ARIA design patterns provided by the Web Accessibility Initiative. Helpful shortcuts for those patterns are provided below.

Name Description Example
Accordion Description Example
Alert Description Example
Alert Dialog (Modal Interrupt) Description Example
Breadcrumb Navigation Description Example
Button Description Example 1: Standard Button
Example 2: Button with IDL Interface
Carousel (Slide Show) Description Example 1: Button Navigation
Example 2: Tab Navigation
Checkbox Description Example 1: Boolean
Example 2: Mixed-State
Combobox Description Example 1: Select-Only
Example 2: List with Inline Autocomplete
Example 3: List with Manual Selection
Example 4: List without Autocomplete
Example 5: Combobox with Grid Popup
Example 6: Date Picker Combobox
Dialog (Modal) Description Example 1: Modal Dialog
Example 2: Date Picker Dialog
Disclosure (Show/Hide) Description Example 1: Show/Hide Image Description
Example 2: Show/Hide FAQ Answers
Example 3: Show/Hide Navigation Menu
Example 4: Show/Hide Navigation Menu with Top-Level Links
Feed Description Example
Grid (Interactive Table) Description Example 1: Layout Grid
Example 2: Data Grid
Example 3: Advanced Data Grid
Landmark Description Example 1: Main Landmark
Example 2: Navigation Landmark
Example 3: Search Landmark
Example 4: Banner Landmark
Example 5: Contentinfo Landmark
Example 6: Complementary Landmark
Example 7: Form Landmark
Example 8: Region Landmark
Link Description Example
Listbox Description Example 1: Scrollable Listbox
Example 2: Listboxes with Rearrangeable Options
Example 3: Listbox with Grouped Options
Menu and Menubar Description Example 1: Editor Menubar
Example 2: Navigation Menubar
Menu Button Description Example 1: Action Menu Button with aria-activedescendant
Example 2: Action Menu Button with element.focus()
Example 3: Navigation Menu Button
Meter Description Example
Radio Group Description Example 1: Radio Group with tabindex
Example 2: Radio Group with aria-activedescendant
Example 3: Rating Radio Group
Slider Description Example 1: Color Viewer Slider
Example 2: Vertical Temperature Slider
Example 3: Rating Slider
Example 4: Media Seek Slider
Slider (Multi-Thumb) Description Example
Spinbutton Description Example
Switch Description Example 1: Standard Switch
Example 2: Switch Using HTML <button>
Example 3: Switch Using Checkbox <input>
Table Description Example 1: Standard Table
Example 2: Sortable Table
Tabs Description Example 1: Tabs with Automatic Activation
Example 2: Tabs with Manual Activation
Toolbar Description Example
Tooltip Description HOLY COW there is a lot of debate on this one!
Example 1: Simple Implementation
Example 2: Location-Aware Implementation with live demo
Treeview Description Example 1: File Directory Using Computed Properties
Example 2: File Directory Using Declared Properties
Example 3: Site Navigation
Treegrid Description Example