Accessibility

ARIA label

An ARIA label is the aria-label attribute, which gives an element an accessible name when no visible text does.

Screen readers announce that name in place of the element's own text. WAI-ARIA 1.2 says to prefer visible text, and aria-labelledby when the words already exist on the page, so reach for aria-label last.

At a glance

What it isAn attribute, aria-label="...", that sets an element's accessible name
Use it forIcon-only buttons and links, and landmarks that need a name (a dialog, a form or a region must have one)
Prefer insteadVisible text, or aria-labelledby pointing at text already on the page (WAI-ARIA 1.2)
Never onA plain div or span: their generic role prohibits a name, so the attribute is ignored
Watch forWCAG 2.5.3 Label in Name (Level A): the visible words must appear in the accessible name
Detected byOverlayQA Accessibility Audit

Why it matters

A control's accessible name is what a screen reader announces and what a speech-input user says to activate it. A button that holds only an icon has no name until one is supplied, so "Close", "Search" and "Delete" all come out as "button". aria-label fixes that. It also overrides any text the element already has, which is where it goes wrong: WCAG 2.5.3 fails a control whose visible label is missing from its accessible name, because a voice command that reads the screen no longer matches (W3C, Understanding 2.5.3).

ARIA is everywhere and still misused. WebAIM's 2026 scan found it on 82.7% of the top one million home pages, and pages that used it averaged 59.1 detectable errors against 42 on pages that did not (WebAIM Million, 2026). The W3C's first rule of ARIA use is to reach for a native HTML element or attribute with the semantics built in before adding ARIA at all (Using ARIA).

When should you use aria-label?

Examples

MarkupWhat a screen reader gets
<button aria-label="Close"> <svg aria-hidden="true"> ... </svg> </button>The name "Close". Good: the icon has no text of its own
<button aria-label="Submit"> Send message </button>The name "Submit". Fails WCAG 2.5.3: "Send message" is not in the name
<div aria-label="Main menu"> ... </div>No name. A generic element cannot take one; use <nav aria-label="Main">
<h2 id="plans">Plans</h2> <section aria-labelledby="plans">The name "Plans". Good: the heading already exists, so labelledby reuses it

Common mistakes

Frequently asked questions

What is the difference between aria-label and aria-labelledby?

aria-label holds the name as a string you type. aria-labelledby points at the id of text already on the page and uses that text as the name. WAI-ARIA 1.2 says to use aria-labelledby when the label text is visible, and user agents give it precedence when both are present.

Does aria-label work on a div?

No. A plain div or span has the generic role, which prohibits an accessible name, so the attribute is ignored. Give the element a role, such as navigation or region, or use the semantic HTML element instead.

Should I add aria-label to a button that already has text?

No. The visible text is already the accessible name. If you must add context, keep the visible words inside the new name, or WCAG 2.5.3 Label in Name fails and speech-input users cannot activate the control by saying what they see.

Is aria-label read by screen readers?

Yes. A screen reader announces the accessible name, and aria-label sets it, so the value is read in place of the element's own content. It is never shown on screen.

Sources: WAI-ARIA 1.2, aria-label, W3C, Using ARIA, WCAG 2.2, 2.5.3 Label in Name, WebAIM Million 2026.

Last updated October 22, 2026