Glossary
Form label
A form label is the text naming a field, associated with it so that assistive technology announces the two together and clicking the label focuses the field. The association is what matters: text positioned next to an input looks like a label and is not one. A field without an association is announced by its type alone, which for a screen reader user means being told there is a text box and nothing about what belongs in it.
The ways to associate one
A label element referencing the field's identifier, which is the standard approach and also makes the label clickable.
A label element wrapping the field, which associates implicitly and needs no identifier at all.
An ARIA attribute referencing the identifier of text elsewhere on the page, for cases where the visible text cannot be a label element.
An ARIA attribute carrying the name as a string, which works and means the name exists only for assistive technology and not on screen.
The first two are preferable because they keep the visible and announced names identical by construction.
Why a placeholder is not a label
It disappears as soon as anyone types, so the name is gone exactly when someone wants to check what they are filling in.
It is styled as low-contrast hint text by default, which frequently fails the contrast threshold.
Screen reader support for announcing it varies, so relying on it makes the field's name dependent on which product someone uses.
And it removes the click target a label provides, which matters most on small screens where fields are hardest to hit.
A placeholder is a hint. A label is a name. A field wants both, and needs the second.
Why the association breaks silently
A component library generates identifiers per instance while a hard-coded reference points at a fixed one, so only the first instance on a page is associated.
A server-rendered identifier changes on hydration, leaving the reference pointing at something that no longer exists.
A label is removed during a redesign and its reference stays, or the field's identifier is renamed and the label is not.
None of these changes anything visible: the text is rendered exactly where it was, and only the connection is gone.
Which is precisely why it belongs in an automated check — the failure is exact and invisible.
What else a field needs
An autocomplete attribute where the field collects something about the person, which lets browsers and password managers fill it correctly.
Error messages associated with the field rather than floating near it, so they are announced when focus reaches it.
A required state expressed in a way assistive technology reads, not only with a visual asterisk.
Instructions associated through a description reference rather than placed nearby and left unconnected.
How it is observed
Fields are checked for an accessible name from any of the association methods, which is what decides whether a screen reader has anything to announce.
Reference attributes are verified to point at identifiers that exist, since a reference to a missing identifier produces no name at all.
The autocomplete attribute is read separately, as is how form errors are handled.
Whether the announced name matches the visible one is checkable; whether it is a good name is a judgement.
Frequently asked questions
- Is a placeholder enough to label a field?
- No. It disappears when someone types, it is low-contrast by default, and support for announcing it varies. It is a hint, not a name.
- Why does only the first field on my page have a label?
- Usually a component generating identifiers per instance against a hard-coded reference. The first match works and every subsequent one points at the wrong element.
- Can I hide the label visually?
- Yes, with a technique that keeps it in the accessibility tree rather than removing it. Hiding it with display or visibility removes it from both.
Sources
Related
VeriFixScan crawls a site and applies its checks to every page it reaches, keeping the evidence behind each finding. Scanning one website is free.
Scan a website