Overview
Every form input must have a programmatic label — either a <label> element, aria-label, or aria-labelledby.
WCAG Criterion:1.3.1
Conformance Level:Level A
Difficulty:Easy
Time to fix:~5 min
Category:Forms
The Problem
This pattern is inaccessible — avoid it.
The Fix
Use this accessible pattern instead.
Step-by-step
Add a <label> element with a for attribute matching the input's id.
Or use aria-label="Email address" on the input directly.
Do not use placeholder as the only label — it disappears when the user types.
Group related inputs with <fieldset> and <legend> (e.g., radio button groups).
Framework Notes
How to apply this fix in your stack.