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"
Disabled and focusable checkbox (preferred)
- An input using
aria-disabled="true
will be focusable with the tab key - Use JS to preventDefault()
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
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