docs.rodeo

MDN Web Docs mirror

ARIA: checkbox role

{{AccessibilitySidebar}} 

The checkbox role is for checkable interactive controls. Elements containing role="checkbox" must also include the aria-checked attribute to expose the checkbox’s state to assistive technology.

<span
  role="checkbox"
  aria-checked="false"
  tabindex="0"
  aria-labelledby="chk1-label"></span>
<label id="chk1-label">Remember my preferences</label>

[!NOTE] The first rule of ARIA is if a native HTML element or attribute has the semantics and behavior you require, use it instead of re-purposing an element and adding ARIA. Instead use the native HTML checkbox of <input type="checkbox"> (with an associated {{HTMLElement('label')}} ), which natively provides all the functionality required:

<input type="checkbox" id="chk1-label" name="RememberPreferences" />
<label for="chk1-label">Remember my preferences</label>

Description

The native HTML checkbox (<input type="checkbox">) form control had two states (“checked” or “not checked”), with an indeterminate state settable via JavaScript. Similarly, an element with role="checkbox" can expose three states through the aria-checked attribute: true, false, or mixed.

Since a checkbox is an interactive control, it must be focusable and keyboard accessible. If the role is applied to a non-focusable element, use the tabindex attribute to change this. The expected keyboard shortcut for activating a checkbox is the Space key.

The developer is required to change the value of the aria-checked attribute dynamically when the checkbox is activated.

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 checkbox. To deal with this limitation, browsers, automatically apply role presentation to all descendant elements of any checkbox element as it is a role that does not support semantic children.

For example, consider the following checkbox element, which contains a heading.

<div role="checkbox"><h6>Name of my checkbox</h6></div>

Because descendants of checkbox are presentational, the following code is equivalent:

<div role="checkbox"><h6 role="presentation">Name of my checkbox</h6></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="checkbox">Name of my checkbox</div>

Associated WAI-ARIA Roles, States, and Properties

Keyboard interactions

Key Function
Space Activates the checkbox

Required JavaScript

Required event handlers

Examples

The following example creates an otherwise non-semantic checkbox element using CSS and JavaScript to handle the checked or unchecked status of the element.

HTML

<span
  role="checkbox"
  id="chkPref"
  aria-checked="false"
  onclick="changeCheckbox()"
  onKeyDown="changeCheckbox(event.code)"
  tabindex="0"
  aria-labelledby="chk1-label"></span>
<label
  id="chk1-label"
  onclick="changeCheckbox()"
  onKeyDown="changeCheckbox(event.code)"
  >Remember my preferences</label
>

CSS

[role="checkbox"] {
  padding: 5px;
}

[role="checkbox"]:focus {
  border: 2px solid #0198e1;
}

[aria-checked="true"]::before {
  content: "[x]";
}

[aria-checked="false"]::before {
  content: "[ ]";
}

JavaScript

function changeCheckbox(code) {
  const item = document.getElementById("chkPref");
  const checked = item.getAttribute("aria-checked");

  if (code && code !== "Space") {
    return;
  } else if (checked === "true") {
    item.setAttribute("aria-checked", "false");
  } else {
    item.setAttribute("aria-checked", "true");
  }
}

{{EmbedLiveSample("Examples", 230, 250)}} 

Accessibility concerns

When the checkbox role is added to an element, the user agent should do the following:

Assistive technology products should do the following:

People implementing checkboxes should do the following:

[!NOTE] Opinions may differ on how assistive technology should handle this technique. The information provided above is one of those opinions and may change.

Best practices

The first rule of ARIA is: if a native HTML element or attribute has the semantics and behavior you require, use it instead of re-purposing an element and adding an ARIA role, state or property to make it accessible. As such, it is recommended to use the native HTML checkbox using form control instead of recreating a checkbox’s functionality with JavaScript and ARIA.

See also

In this article

View on MDN