Shortcut
- Restrict single-character shortcuts. Make shortcuts consistent with convention.
Focus
- change the default color of the outline
- change the default color of the element
- remove the box and underline text
Focus order
- Elements must receive focus in an order that preserves meaning and operability (left to right, top to bottom)
- Not jumping around between sections
- No keyboard trap. Focus can be moved away using the keyboard or
tabindex
-1
indicates the element can't tab to with keyboard, but can set focus programmatically.
0
indicates tab to element, focus order determined by the HTML.
1+
indicates focus order is the value of the attribute regardless the place of html element.
- Don't fix focus order issues by setting tabindex to positive numbers.
- Use html structure to control focus order
- Set tabindex on elements that would not usually receive keyboard focus
Bypass blocks
- Clear page structure by using html5 structural elements like
<main>
- Skip link
.skip-link {
display: inline-block;
position: absolute;
top: 0;
left: -100000px;
}
.skip-link:focus {
left: 0;
}
Forms
Clear labels
- user input must have labels
- labels must be linked to the form control
<label for="name">Your name</label>
<input id="name" type="text">
- aria labelling. If label is not seen visually, we can use
aria-label
or aria-labelledby
.
<input id="txtSearch" aria-label="Search" aria-labelledby="butnSearch" type="text" />
<button id="btnSearch">Search</button>
- label placement
- input attribute: types, readonly, disabled
- disabled value is not submitted to server, readonly value is submitted to server.
- browsers offer to autocomplete info, improves suggestion accuracy
- use autocomplete attribute for input purpose
<input type="text" autocomplete="username" />
Required fields
required
attribute present an in-broweser validation, whereas aria-required
doesn't but will be read by screen reader
<input type="text" required>
<input type="text" aria-required="true">
Presenting error messages
- covers all form error messages
- identify the input control with the error.
aria-invalid, aria-describedby="error1"
<input id="name" type="text" aria-invalid="true" aria-required="true" aria-describedby="error1">
<span id="error1"> This field is required.</span>
- add validation summary. when user submits the form, it immediately jumps to the validation summary if error occurs. It can be achieved by
- setting keyboard focus to the validation summary
- making the validation summary a live region. It does not change focus. But validation error will be read aloud.
<div id="validation-summary" role="alert"></div>
aria-live
: The [aria-live=POLITENESS_SETTING]
is used to set the priority with which screen reader should treat updates to live regions.