2.1.3 Keyboard (No Exception)
What it requires
All functionality of the content must be operable through a keyboard interface, with no exception. This is the stricter sibling of 2.1.1 Keyboard (Level A). Where 2.1.1 permits a narrow exception for functions that genuinely require path-dependent, timed input (such as free-hand drawing), 2.1.3 removes that exception entirely: every action a user can take must be reachable and completable with the keyboard alone, regardless of whether the underlying input depends on the path or timing of movement.
"Keyboard interface" means the device-independent input layer, not a physical keyboard — so switch devices, on-screen keyboards, and speech tools that emit keystrokes all benefit when this criterion is met.
- People with motor or mobility disabilities who cannot use a mouse or trackpad and rely on a keyboard, switch, or sip-and-puff device.
- Blind and low-vision users whose screen readers are driven almost entirely by keyboard commands.
- People using speech-recognition software, which typically maps voice commands to keyboard events.
- Anyone with a broken pointer, a preference for keyboard efficiency, or alternative input hardware.
How to detect it
| Check | How | Catches |
|---|---|---|
| Tab through everything | Use Tab/Shift+Tab, Enter, Space, and arrow keys to reach and trigger every control. | Mouse-only buttons, custom widgets with no key handlers. |
| Drag, slider & canvas actions | Confirm sliders, sortable lists, drawing or signature canvases, and drag-and-drop all have a keyboard path. | The exact functions 2.1.3 forbids leaving keyboard-inaccessible. |
| No keyboard trap | Verify focus can always move away again (relates to 2.1.2). | Embedded widgets/dialogs that trap focus. |
| Screen-reader pass | Drive the page with NVDA/VoiceOver using keys only. | Actions invisible to AT or unreachable in reading order. |
| Automated tools | axe, Lighthouse, WAVE flag some causes (e.g. tabindex misuse,
non-focusable controls). |
Partial only — true operability must be verified manually. |
How to fix it
- Build interactive controls from native elements
(
<button>,<a href>,<input>), which are keyboard-operable by default. - For custom widgets, add the matching ARIA role, make them focusable, and wire
keydownhandlers for Enter, Space, and arrows. - Give every pointer-only gesture (drag, swipe, free-draw) an equivalent keyboard mechanism — arrow-key nudging, move-up/move-down buttons, or text input.
- Never rely on the 2.1.1 timing exception; under AAA there is none.
- Manage focus deliberately on open/close so nothing becomes unreachable.
<!-- Drag-to-reorder list with a keyboard equivalent -->
<li>
Item A
<button type="button" aria-label="Move Item A up">▲</button>
<button type="button" aria-label="Move Item A down">▼</button>
</li>
Copy-paste tests
Automated coverage
These axe-core rules flag failures of this criterion: scrollable-region-focusable.
Run them via the axe DevTools browser extension or axe-core in CI. Automated tools only
catch SOME failures — true keyboard operability must be verified by hand.
Run this in the browser console
// Surface likely mouse-only / pointer-driven controls for review.
const suspects = [...document.querySelectorAll(
'[onmousedown],[onmouseup],[onclick],[ondblclick],[draggable="true"],' +
'[role="slider"],[role="button"],canvas,[contenteditable="true"]'
)].filter(el => {
const t = el.tagName.toLowerCase();
const native = ['a','button','input','select','textarea'].includes(t);
const focusable = native || el.tabIndex >= 0;
return !focusable || ['canvas'].includes(t) || el.draggable;
});
suspects.forEach(el => { el.style.outline = '2px solid red'; });
console.table(suspects.map(el => ({
tag: el.tagName.toLowerCase(),
role: el.getAttribute('role') || '',
tabindex: el.getAttribute('tabindex'),
draggable: el.draggable,
text: (el.textContent || '').trim().slice(0, 40)
})));
What to check manually: with the mouse unplugged, confirm every outlined control — plus sliders, drag-and-drop, and any drawing/signature canvas — can be reached and fully operated using only Tab, Enter, Space, and arrow keys, and that focus is never trapped.