How to fix: Form fields must have labels
Every input, textarea and select needs an associated label so users know what to enter and screen readers can announce the field.
The fix
Associate every form field with a <label> (via for/id) or an aria-label.
Who this affects
A screen-reader user tabbing into an unlabelled checkout field hears "edit, blank" and has to guess whether the box wants a house number or a postcode, then find out at validation. Someone using Dragon or macOS Voice Control cannot say "click email" to move there, because there is no name to address. A properly associated label also makes the label text itself clickable, which is the difference between a comfortable and a fiddly checkbox on a phone.
Before and after
<input type="email" placeholder="Email">
<label for="email">Email</label>
<input id="email" type="email">
Where this usually comes from
- The visible label rendered as a <span> or <div> for styling, with nothing connecting it to the input.
- for and id drifting apart, or the same id emitted twice when one form component renders in both a page and a modal.
- Search and filter inputs that carry only an adjacent magnifier icon and no text.
- A <label> hidden with display:none; axe treats a hidden explicit label as no label at all.
- Radio and checkbox groups where the question lives in a <legend> or a nearby paragraph and never reaches the individual inputs.
Checking it yourself
Click the visible label text: if the caret does not jump into the field, or the checkbox does not toggle, there is no association. Then select the input in Chrome DevTools and read the Name in the Accessibility pane, since aria-label and aria-labelledby also satisfy the requirement and the click test will not find those. Firefox's Accessibility panel has a Text Labels check that lists every unlabelled field on the page at once.
A scanner finds this one automatically. What it cannot judge, and how the score is built, is on how we test.
Related fixes
Check your site for this issue
Scan any page free against WCAG 2.2 AA and get every automatically detected issue with its fix.