33.1% of form inputs on home pages lack a proper accessible label
3.3.2 Labels or Instructions
In Plain Language
[3.3.2 Labels or Instructions](https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html) is a Level A criterion that fires whenever content requires user input: every form control must be accompanied by a label or instruction that tells the user what to enter[1]. The label or instruction has to be presented to the user -- a field whose only cue is a placeholder that vanishes the moment the user focuses it does not satisfy the criterion.
When a field has a format constraint -- date, phone, postal code, password rules -- the instruction has to name the format up front ("Format: MM/DD/YYYY", "10 digits", "at least 8 characters"). Making the user submit the form to learn the format is a 3.3.2 failure, not a UX preference.
Why It Matters
- 3.3.2 is distinct from 1.3.1 and 4.1.2. 1.3.1 asks whether the label/input relationship is exposed programmatically (a
<label for>pointing at anid, oraria-labelledby). 4.1.2 asks whether the control has an accessible name at all (aria-labelalone is enough). 3.3.2 asks whether a human-visible label or instruction is presented to the user -- a control can pass 4.1.2 viaaria-labelyet fail 3.3.2 because sighted users get nothing to read[1]. - Screen-reader users depend on the accessible name computed from the label to distinguish one field from another. Without a label element or equivalent, the computed name falls back to the placeholder (inconsistent across browsers and assistive tech) or to nothing at all, and the field is announced as "edit text".
- Placeholder text fails as a label substitute for four independent reasons: it disappears the instant the user types, so anyone who pauses loses the cue; it is styled by default with low contrast that trips 1.4.3 for low-vision users; it is not reliably exposed to the accessibility API as the accessible name; and auto-fill can overwrite it without the user realising a field existed.
- Users with cognitive and learning disabilities lose orientation when a label disappears on focus -- the field becomes an unlabeled box, and recovering the prompt requires blurring and re-focusing. A persistent visible label removes the memory load entirely.
- WebAIM Million 2026 found that 33.1% of form inputs on the analysed home pages were not properly labelled through
<label>,aria-label,aria-labelledby, ortitle[2] -- a third of the form surface of the top million sites ships without the basic association 3.3.2 requires.
Examples
✔ Each input has a visible label that describes what to enter
<label for="name">Full name</label>
<input id="name" type="text">
<label for="email">Email address</label>
<input id="email" type="email">
✘ Placeholder disappears on focus -- no persistent label, no programmatic association
<!-- FAILS: no label element, placeholder is not a label -->
<input type="text" placeholder="Full name">
<input type="email" placeholder="Email address">
<!-- Placeholder vanishes on focus, no screen reader label -->
✔ Labels plus format hints linked via aria-describedby
<label for="dob">Date of birth</label>
<input id="dob" type="text"
aria-describedby="dob-hint">
<p id="dob-hint" class="hint">
Format: MM/DD/YYYY
</p>
<label for="phone">Phone number</label>
<input id="phone" type="tel"
aria-describedby="phone-hint">
<p id="phone-hint" class="hint">
10 digits, e.g. 202-555-0100
</p>
✘ No format hints -- user must guess the expected date and phone format
<!-- FAILS: label exists but no format instruction -->
<label for="dob">Date of birth</label>
<input id="dob" type="text">
<!-- MM/DD/YYYY? DD-MM-YYYY? User has to guess. -->
How to Fix It
- Give every
<input>,<select>, and<textarea>a<label for="id">. Thefor/idassociation is the most reliable pattern in HTML: it survives DOM reordering, clicking the label focuses the input, and the label text becomes the accessible name with no ARIA required. Wrapping the input inside the<label>element is an equivalent pattern when an explicitidis inconvenient. - Use
aria-labelonly when the visible label is not text. The canonical case is an icon-only search field where the magnifying glass is the visible cue; addaria-label="Search"(oraria-labelledbypointing at an off-screen string) so the accessible name exists. Do not usearia-labelas a replacement for a visible label on a normal text field -- sighted users see nothing, which is exactly the 3.3.2 failure the criterion is written to catch[1]. - Put format hints in the DOM and wire them to the input with
aria-describedby. A visible "Format: MM/DD/YYYY" paragraph adjacent to the field, referenced byaria-describedby, is announced by screen readers after the label and remains visible for sighted users.placeholderis not a substitute -- it disappears on input and is not a reliable accessible description for assistive technology. - Mark required fields with a visible cue and
required. The visible cue (asterisk plus a "required fields marked with *" note, or the word "required" in the label) satisfies 3.3.2. Therequiredattribute (oraria-required="true"on custom widgets) exposes the constraint to assistive technology so the requirement is announced, not just seen. - Group related controls with
<fieldset>and<legend>. A set of radio buttons, a split date entry, or a billing-address block needs the shared context that individual labels cannot carry. The<legend>is prepended to each control's accessible name during announcement, which is how a screen-reader user learns that "Monday" belongs to "Preferred contact day" and not to "Delivery day".
References
- [1] W3C (2023). Understanding Success Criterion 3.3.2: Labels or Instructions. W3C, Accessed 2026-04-07. https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html ↩ ↩ ↩
- [2] WebAIM (2026). The WebAIM Million: An accessibility analysis of the top 1,000,000 home pages. WebAIM, Accessed 2026-04-07. https://webaim.org/projects/million/ ↩