WCAG 2.5.3: Label in Name
Voice-control users operate a page by speaking what they see: “Click Send.” That only works if the words on the button are also in its accessible name. This criterion requires that the accessible name of a control contains its visible text label. The most common failure is a well-meaning aria-label that says something different from the text on screen.
The success criterion, in full
For user interface components with labels that include text or images of text, the name contains the text that is presented visually.
The W3C adds a note: a best practice is to have the text of the label at the startof the name. “Name” here means the accessible name — the string assistive technologies compute for the component — and “label” means the text (or image of text) presented visually to identify it.
Who this helps
Speech input users
People with motor disabilities — repetitive strain injury, spinal cord injury, tremor, limb difference — often drive the entire computer by voice with Dragon, Voice Control, or Voice Access. They target controls by speaking the visible text. A mismatched accessible name makes the control unreachable by voice.
Screen reader users with some vision
Many screen reader users can see the screen. When the button visibly says 'Search' but the screen reader announces 'Magnifier', the mismatch is disorienting and erodes trust in what is being announced.
People with cognitive disabilities
Consistency between what is seen, what is heard, and what must be said reduces cognitive load. One control, one name, everywhere.
Anyone using voice assistants hands-free
Situational users — driving, cooking, holding a child — increasingly rely on voice interaction. Label-in-name failures lock them out just as thoroughly.
Picture the failure from the user’s side: the page shows a button labelled “Send”. The user says “Click Send.” Nothing happens, because a developer set aria-label="Submit message". The user tries again, louder. Then they fall back to a numbered grid overlay, speaking coordinates instead of words. A one-attribute mistake turned a two-second task into a workaround.
Accessible name vs. visible label
Every interactive component has an accessible name computed by the browser from, in priority order: aria-labelledby, then aria-label, then the associated <label> or the element’s own text content (with title and placeholder as last resorts. The visible label is whatever text a sighted user reads on or next to the control.
When you write no ARIA at all, the accessible name is the visible text, and 2.5.3 passes automatically. The criterion only bites when the two diverge — almost always because aria-label or aria-labelledby overrides the visible text with different words.
- The name may extend the label. Visible “Read more” with accessible name “Read more about pricing” passes — the visible words are all there, at the start.
- The name may not replace the label. Visible “Send” with accessible name “Submit message” fails — the word the user would speak is missing.
- Images of text count as visible labels. A button rendered as an image reading “Checkout” must have “Checkout” in its alt text / accessible name.
- Icon-only controls are out of scope — no visible text, nothing to match. They still need a sensible accessible name under 4.1.2 Name, Role, Value.
Pass and fail examples
Pass: no ARIA override
A button contains the text “Download invoice” and has no aria-label. The accessible name is the visible text. Saying “Click Download invoice” works.
Pass: name extends the visible label
A link shows “Read more” and its accessible name is “Read more about our security practices”. The visible words appear, at the start of the name — pass, and better link purpose too.
Fail: aria-label replaces the visible text
A button shows “Send” but has aria-label="Submit message". “Send” is nowhere in the accessible name. “Click Send” fails for voice users.
Fail: aria-labelledby points at the wrong text
A search field’s visible label reads “Search products”, but aria-labelledby references a heading that says “Catalog”. The computed name omits the visible label entirely.
Fail: image-of-text button with unrelated alt
An image button visibly reads “Start free trial” but its alt text is “cta-banner-v2”. The visible words are absent from the name — a double failure with 1.1.1 Non-text Content.
Code examples
The classic aria-label mismatch
If you add an aria-label to a control that already shows text, start it with the visible words — or better, do not add one at all.
<!-- ✗ Fails: name "Submit message" does not contain visible "Send" -->
<button aria-label="Submit message">Send</button>
<!-- ✓ Passes: no override — the name is the visible text -->
<button>Send</button>
<!-- ✓ Passes: name extends the label, visible text first -->
<button aria-label="Send message to support">Send</button>Extending repeated links accessibly (React)
The common pattern of disambiguating “Read more” links is fine — as long as the visible text stays at the start of the name.
// ✗ Fails: visible "Read more" is missing from the name
function ArticleCard({ title, href }) {
return <a href={href} aria-label={"Full article: " + title}>Read more</a>
}
// ✓ Passes: name starts with the visible label, then adds context
function ArticleCard({ title, href }) {
return <a href={href} aria-label={"Read more: " + title}>Read more</a>
}
// ✓ Also passes: visually hidden extension keeps the DOM text intact
function ArticleCard({ title, href }) {
return (
<a href={href}>
Read more<span className="sr-only"> about {title}</span>
</a>
)
}Form fields: keep label, name, and instructions aligned
<!-- ✗ Fails: visible label says "Work email", name says "E-mail address" -->
<label for="em">Work email</label>
<input id="em" type="email" aria-label="E-mail address" />
<!-- ✓ Passes: the <label> element is the accessible name — one source of truth -->
<label for="work-email">Work email</label>
<input id="work-email" type="email" autocomplete="email" />Common failures
- aria-label text written independently of the visible text — 'Go' on screen, 'Submit search query' in the name.
- Localisation drift: the visible label gets translated or reworded during a redesign, but the hard-coded aria-label is never updated.
- aria-labelledby pointing to a nearby heading or tooltip instead of the control's own visible label.
- Adding context before the visible words ('Product page link: Read more') instead of after them — the label should be at the start of the name.
- Image buttons or images of text whose alt attribute is a filename or marketing description rather than the words shown in the image.
- Icon + text buttons where the accessible name is built from the icon's label only (e.g. name 'magnifier' for a button that visibly says 'Search').
- Design systems that expose a label prop for the accessible name separate from children, letting the two drift apart unnoticed.
How to test for 2.5.3
- 1
Run an automated scan first
axe DevTools and similar engines include a check (label-content-name-mismatch) that compares each control's visible text with its computed accessible name and flags names that omit the visible words. This catches most aria-label mismatches instantly.
- 2
Inspect computed names in DevTools
For each control with visible text and any aria-label/aria-labelledby, select it and open the Accessibility pane (Chrome/Edge/Firefox). Confirm the 'Name' value contains the visible text, ideally at the start.
- 3
Test with real voice control
Enable Voice Control on macOS/iOS or Voice Access on Windows/Android, or use Dragon if available. Speak 'Click <visible label>' for key controls — navigation, search, form submission. If the control does not activate, its name does not match.
- 4
Listen with a screen reader while looking at the screen
Tab through interactive elements with NVDA or VoiceOver running. Whenever what you hear does not include the words you see on the control, you have found a 2.5.3 candidate.
- 5
Audit ARIA usage in the codebase
Grep for aria-label and aria-labelledby on elements that also render visible text (buttons, links, labelled inputs). Each hit is a place where the name can drift from the label — verify or remove the override.
Then work through the rest of the WCAG 2.2 checklist — 2.5.3 pairs naturally with 2.4.6 Headings and Labels, which asks whether those same labels are descriptive.
Frequently asked questions
What does WCAG 2.5.3 Label in Name require?
For user interface components whose labels include text or images of text, the accessible name — what assistive technologies announce and voice-control software matches against — must contain the text that is presented visually. If a button visibly says 'Send', its accessible name must include the word 'Send'. The name can contain more than the visible text, but it cannot omit or contradict it. It is a Level A criterion introduced in WCAG 2.1 and unchanged in WCAG 2.2.
Why does Label in Name matter for speech input users?
Voice-control software such as Dragon, Windows Voice Access, and Apple Voice Control lets users operate a page by speaking what they see: 'Click Send'. The software matches that phrase against each control's accessible name. If a button shows 'Send' but its aria-label is 'Submit message', saying 'Click Send' finds nothing — the user is talking to a control that, as far as the software knows, does not exist. The mismatch also confuses sighted screen reader users, who see one word and hear another.
Does the accessible name have to exactly equal the visible label?
No — it must contain it. An accessible name of 'Send message' for a button showing 'Send' passes, because 'Send' appears within the name. The W3C additionally recommends, as a best practice, putting the visible text at the start of the accessible name, because some speech-input tools work most reliably when the spoken phrase matches the beginning of the name. Exact match is the safest and simplest approach: for most controls, simply do not override the visible text at all.
Which components does 2.5.3 apply to?
Any user interface component with a label that includes text or an image of text: buttons, links, form fields with visible labels, tabs, menu items, and controls whose label is rendered as an image of words (like a logo-styled 'Checkout' button image). It does not apply to icon-only controls with no visible text — a magnifying-glass button with no text has no visible label to match, so 2.5.3 is satisfied vacuously (though 4.1.2 still requires it to have an accessible name, such as 'Search').
Is punctuation or capitalization a problem for Label in Name?
Generally no. The intent is that the words a sighted user reads are present in the name. Differences in case ('SUBMIT' vs 'Submit'), and symbols or punctuation that are not typically spoken (an ellipsis, a trailing colon, an asterisk marking a required field), do not cause failures. What matters is the spoken-word correspondence: a user saying the visible words should hit the control. Changing, reordering, or dropping actual words is where failures happen.
How do I check a control's accessible name?
Use the browser's accessibility inspector: in Chrome or Edge DevTools, select the element and open the Accessibility pane to see the 'Computed name' and which attribute or content produced it. Automated tools like axe DevTools include a specific 'label-in-name' style check (label-content-name-mismatch) that flags controls whose visible text is missing from the name. Finally, test the real experience: enable Voice Control (macOS/iOS) or Voice Access (Windows/Android) and speak the visible label of key controls.
Related Success Criteria
Functionality that uses multipoint or path-based gestures has alternatives.
Functions triggered by single pointer can be cancelled or undone.
Functionality triggered by device motion can be disabled and has alternatives.
Target size is at least 44 by 44 CSS pixels except in specific cases.
Content does not restrict use of input modalities.