Video examples
iOS Voiceover
Android Talkback
Windows Jaws Chrome
Windows NVDA Chrome
MacOS Voiceover Safari
Code examples
Use semantic HTML
- This semantic HTML contains all accessibility features by default.
- It uses CSS pseudo attributes to create the checkbox indicator, no Javascript.
Don’t put interactive elements inside the label
Even though this is valid HTML, it creates unpredictable results with screenreaders. A (currently) reliable method is to keep interactive elements outside the label and reference it with aria-describedby="hint-id"
Fully disabled checkbox
- An input using
disabled
will not be focusable with the tab key - Arrow keys will still be able to browse disabled inputs
Disabled and focusable checkbox
It’s possible to use aria-disabled="true"
so screen reader users can focus the checkbox. Use preventDefault()
to prevent the checkbox from being checked.
When you can’t use semantic HTML
This custom checkbox requires extra attributes and event listeners.
Speciality checkboxes
Sometimes a design may call for a card type checkbox.
- Its core should still be a semantic checkbox input
- Use
aria-describedby
to read extra content after the the name, role and state
-
Delta (prounounced: dell-tah) is the fourth letter of the NATO alphabet.
-
Echo (prounounced: eck-oh) is the fifth letter of the NATO alphabet.
Developer notes
Name
label
text must describe the checkbox input.- Use
aria-describedby="hint-id"
for hints or additional descriptions aria-label="Checkbox input purpose"
can also be used (as a last resort)
Role
- By default, semantic HTML checkbox inputs identify as a checkbox
- Use
role="checkbox"
for custom elements
Group
- Semantic HTML
<fieldset>
wraps a checkbox group<legend>
describes the group’s purpose- Each
<label>
must includefor="input-id"
to be associated with its input
- Custom elements
- Use
role="group"
in the place of fieldset - Use
aria-labelledby="label-id"
to associate an element as a label aria-label="Group purpose"
can also be used if there’s no label with an ID
- Use
State
- Semantic HTML
- Use
checked
for native HTML - Use the
disabled
state for inactive checkboxes
- Use
- Custom element
- Use
aria-checked="true/false"
to express state - Use
aria-disabled="true"
to declare inactive elements
- Use
Focus
- Focus must be visible
- Custom elements will require keyboard event listeners