3.3.2 Labels or Instructions
WCAG 2.2 · 3.3.2 A Understandable
What it requires
When content requires user input, labels or instructions must be provided so people know what is expected of them. Every form control needs a clear, visible label that describes its purpose, and any additional constraints — required fields, expected formats (such as a date pattern), or example values — must be conveyed in text rather than implied by placeholder colour, position, or shape alone. The criterion does not require a specific technique; it requires that the information needed to complete an input successfully is actually present and programmatically associated where relevant.
- Screen reader users — an unlabelled field is announced only by its type (“edit text”), leaving no clue what to enter.
- People with cognitive and learning disabilities — missing format hints or instructions make errors far more likely and harder to recover from.
- Low-vision users — placeholder-only labels vanish on focus or fail contrast, removing the only cue to a field’s purpose.
- Voice-input users — a visible label gives them a name to speak when targeting the control.
How to detect it
| Check | What to look for |
|---|---|
| Manual review | Every input, select, and textarea has a visible, persistent label that describes its purpose; required fields and format expectations are stated in text. |
| Keyboard / screen reader | Tab to each control: the accessible name announced matches the visible label, and instructions are read out (not skipped). |
| Placeholder test | Focus a field and type — if the only label was a placeholder, it disappears and the purpose is lost. That is a failure. |
| Zoom (200%) | Labels and instructions stay visible and associated with their control at high zoom and reflow. |
| Automated tools | axe and similar flag missing programmatic labels, but cannot judge whether an instruction is adequate — manual review is required. |
How to fix it
- Give every control a real
<label>tied to it viafor/id. - Keep the label visible and persistent — do not rely on a placeholder as the label.
- State requirements in text: mark required fields and describe expected formats.
- Associate extra hints programmatically with
aria-describedby. - Re-test with a screen reader to confirm the name and instructions are announced.
<label for="dob">Date of birth (required)</label>
<input id="dob" name="dob" type="text"
inputmode="numeric"
aria-describedby="dob-hint" required>
<p id="dob-hint">Format: DD/MM/YYYY, e.g. 31/12/1990</p>
Copy-paste tests
Automated coverage
The axe-core rule form-field-multiple-labels flags failures of this criterion. Run it via the axe DevTools browser extension or axe-core in CI. Automated tools only catch some failures, so manual review is still required.
Run this in the browser console
// Read-only: lists form controls lacking a visible label/instruction.
const suspects = [...document.querySelectorAll('input:not([type=hidden]), select, textarea')]
.filter(el => {
const id = el.id;
const hasLabel = id && document.querySelector(`label[for="${id}"]`);
const wrapped = el.closest('label');
const aria = el.getAttribute('aria-label') || el.getAttribute('aria-labelledby');
return !hasLabel && !wrapped && !aria;
});
suspects.forEach(el => el.style.outline = '2px solid red');
console.table(suspects.map(el => ({ tag: el.tagName, type: el.type, name: el.name, id: el.id })));
console.log('Review these controls for a label or instruction:', suspects);
What to check manually: confirm each label actually describes its field (not just present but meaningful), and that required formats or constraints (e.g. date format, password rules) are stated before the user submits.
Related
- WCAG 2.2 criteria index
- Learn catalog
- Accessible forms — labels, errors, and input purpose.