| id | 80af7b | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| name | Focusable element has no keyboard trap | ||||||||||||||||||||||||||||||||
| rules_format | 1.1 | ||||||||||||||||||||||||||||||||
| rule_type | composite | ||||||||||||||||||||||||||||||||
| description | This rule checks for keyboard traps. This includes use of both standard and non-standard keyboard navigation to navigate through all content without becoming trapped. | ||||||||||||||||||||||||||||||||
| accessibility_requirements |
|
||||||||||||||||||||||||||||||||
| input_rules |
|
||||||||||||||||||||||||||||||||
| acknowledgments |
|
This rule applies to any HTML or SVG element that is focusable.
For each test target, the outcome of at least one of the following rules is "passed":
- Focusable Element Has No Keyboard Trap Via Standard Navigation
- Focusable Element Has No Keyboard Trap Via Non-Standard Navigation
This rule only requires navigation in one direction (either forward or backward), not both, and not a specific one. It is clear that not being able to escape a focus trap in any direction is a failure of Success Criterion 2.1.2 No keyboard trap. However, it is less clear that being able to escape in only one direction is enough to satisfy it. If Success Criterion 2.1.2 No keyboard trap requires the possibility to escape the trap in a specific way (e.g. forward standard keyboard navigation) or in both directions, this rule may pass while the criterion is not satisfied.
There are no assumptions.
There are no accessibility support issues known.
- Understanding Success Criterion 2.1.2: No Keyboard Trap
- G21: Ensuring that users are not trapped in content
- F10: Failure of Success Criterion 2.1.2 and Conformance Requirement 5 due to combining multiple content formats in a way that traps users inside one format type
These focusable elements do not create a trap for keyboard navigation.
<a href="#">Link 1</a> <button>Button1</button>This element is made focusable by the tabindex attribute. It does not create a trap for keyboard navigation.
<div tabindex="1">Text</div>This element is made focusable by the tabindex attribute, even if it is not part of the sequential focus navigation. It does not create a trap for keyboard navigation.
<div tabindex="-1">Text</div>These focusable button elements have scripts that create a keyboard trap. The document includes help information in a paragraph before the button elements and the method advised works to escape the keyboard trap.
<script src="/test-assets/focusable-no-keyboard-trap/keyboard.js"></script>
<p>Press Ctrl+M to Exit</p>
<a id="link1" href="#">Link 1</a>
<button id="btn1" onfocus="trapOn = true" onblur="moveFocusToButton('btn2')" onkeydown="escapeTrapOnCtrlM(event)">
Button 1
</button>
<button id="btn2" onfocus="trapOn = true" onblur="moveFocusToButton('btn1')" onkeydown="escapeTrapOnCtrlM(event)">
Button 2
</button>
<a id="link2" href="#">Link 2</a>These focusable button elements have scripts that create a keyboard trap. The document includes help information within the trap and the method advised works to escape the keyboard trap.
<script src="/test-assets/focusable-no-keyboard-trap/keyboard.js"></script>
<a id="link1" href="#">Link 1</a>
<button id="btn1" onfocus="trapOn = true" onblur="moveFocusToButton('btn2')" onkeydown="escapeTrapOnCtrlM(event)">
Button 1
</button>
<p>Press Ctrl+M to Exit</p>
<button id="btn2" onfocus="trapOn = true" onblur="moveFocusToButton('btn1')" onkeydown="escapeTrapOnCtrlM(event)">
Button 2
</button>
<a id="link2" href="#">Link 2</a>These focusable button elements have scripts that create a keyboard trap. The document includes help information in a "help" link that once clicked exposes the instructions to escape the keyboard trap.
<script src="/test-assets/focusable-no-keyboard-trap/keyboard.js"></script>
<div onkeydown="escapeTrapOnCtrlM(event)">
<a id="link1" href="#">Link 1</a>
<button id="btn1" onfocus="trapOn = true" onblur="moveFocusTo('helpLink')">
Button 1
</button>
<a id="helpLink" href="#" onclick="showHelpText()">How to go the next element</a>
<div id="helptext"></div>
<button id="btn2" onblur="moveFocusTo('btn1')">
Button 2
</button>
</div>
<a id="link2" href="#">Link 2</a>The focusable button labeled "Button3" creates a keyboard trap when navigating forward, as it moves focus back to "Button1" preventing users to focus "Button3". However, when navigating backward, all focusable elements receive focus as expected. Therefore, according to the background notes, this behavior is considered compliant with the rule, despite being recognized as a poor practice in terms of keyboard accessibility.
<button onblur="setTimeout(() => this.nextElementSibling.focus(), 10)">
Button1
</button>
<button onblur="setTimeout(() => this.previousElementSibling.focus(), 10)">
Button2
</button>
<button>
Button3
</button>This focusable element creates a keyboard trap bringing focus to the button. Note that if one of the links is removed, the focus may jump to the browser UI before the timeout expires, at which point the this.focus() trap cannot trigger anymore.
<a href="#">Link 1</a>
<button onblur="setTimeout(() => this.focus(), 10)">
Button1
</button>
<a href="#">Link 2</a>This button element is between other button elements creating a keyboard trap.
<button onblur="setTimeout(() => this.focus(), 10)">Button 1</button>
<button>Button 2</button>
<button onblur="setTimeout(() => this.focus(), 10)">Button 3</button>These focusable button elements create a keyboard trap with no instructions.
<script src="/test-assets/focusable-no-keyboard-trap/keyboard.js"></script>
<a id="link1" href="#">Link 1</a>
<button id="btn1" onfocus="trapOn = true" onblur="moveFocusToButton('btn2')" onkeydown="escapeTrapOnCtrlM(event)">
Button 1
</button>
<button id="btn2" onfocus="trapOn = true" onblur="moveFocusToButton('btn1')" onkeydown="escapeTrapOnCtrlM(event)">
Button 2
</button>
<a id="link2" href="#">Link 2</a>These focusable button elements create a keyboard trap with instructions that don't give advice on the method for proceeding.
<script src="/test-assets/focusable-no-keyboard-trap/keyboard.js"></script>
<p>Go to the next element</p>
<a id="link1" href="#">Link 1</a>
<button id="btn1" onfocus="trapOn = true" onblur="moveFocusToButton('btn2')" onkeydown="escapeTrapOnCtrlM(event)">
Button 1
</button>
<button id="btn2" onfocus="trapOn = true" onblur="moveFocusToButton('btn1')" onkeydown="escapeTrapOnCtrlM(event)">
Button 2
</button>
<a id="link2" href="#">Link 2</a>These focusable button elements create a keyboard trap with help text, where the method advised doesn't work.
<script src="/test-assets/focusable-no-keyboard-trap/keyboard.js"></script>
<a id="link1" href="#">Link 1</a>
<button id="btn1" onfocus="trapOn = true" onblur="moveFocusToButton('btn2')">
Button 1
</button>
<p>Press Ctrl+M to Exit</p>
<button id="btn2" onfocus="trapOn = true" onblur="moveFocusToButton('btn1')">
Button 2
</button>
<a id="link2" href="#">Link 2</a>There is no focusable element.
<h1>Page 1</h1>There is no focusable element.
<button type="button" disabled>Click Me!</button>There is no focusable element.
<button type="button" style="display:none;">Click Me!</button>There is no focusable element.
<a href="#" style="visibility:hidden;">Link 1</a> <button style="visibility:hidden;">Button1</button>