Add ARIA Labels
Add ARIA labels to buttons and links for better screen reader navigation.
What this covers: Add ARIA labels to buttons and links for better screen reader navigation, including what screen readers announce, three fixes.
Who it’s for: Site owners and developers who need to meet accessibility standards and avoid legal risk.
Key outcome: You’ll have every icon-only button and link has an aria-label describing its action (e.g., “close menu”, “search”), and page landmark regions (nav, main, aside, footer) have aria-label when there are multiple of the same type.
Time to read: 5 minutes
Part of: Accessibility series
🔧 Skill Level: Developer required
ARIA implementation requires HTML knowledge. If you’re using WordPress, check that your theme is accessibility-ready (look for “Accessibility Ready” tag in theme directory).
Where and how to add ARIA for screen readers.
ARIA labels tell screen readers what your buttons and links actually do—because “Button 47” tells nobody anything.
A screen reader user just complained: “Your buttons make no sense. I hear ‘Button 47’ or ‘Link Link Link.'” They’re navigating by keyboard and audio. Your icon-only buttons with no text? Silent. Your generic “Click here” links? Useless out of context.
This isn’t a minor inconvenience. Over 7 million Americans use screen readers. When your checkout button announces “Button 47,” they leave. When your navigation makes no sense, they can’t use your site at all. That’s revenue lost and, increasingly, lawsuit risk—accessibility plaintiffs won 98% of cases in 2023.
ARIA labels help screen readers understand interactive elements, making your site accessible to blind users.
What Screen Readers Announce
When a screen reader hits a button, it says:
- The accessible name (what you control)
- The role (button, link, checkbox)
No accessible name? “Button 47” is the fallback when there’s nothing to read.
Three Fixes
1. Use Text Inside Buttons
Simplest. If the button has text, screen readers announce it:
2. aria-label for Icon Buttons
Icon-only buttons need an accessible name:
3. Descriptive Link Text
“Click here” tells you nothing when read out of context:
Click here
View pricing plans
Screen reader users often navigate by links alone. “Click here, click here, click here” is useless.
Hidden Text (Visually Hidden)
Sometimes you want text for screen readers but not visible:
The .sr-only class hides text visually but keeps it accessible:
.sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}
Common ARIA Mistakes (And When Not to Use It)
The first rule of ARIA is: don’t use ARIA if native HTML can do the job. A <button> element already announces itself as a button. Adding role="button" to it is redundant. Adding role="button" to a <div> is worse—it announces “button” but doesn’t get keyboard focus, Enter/Space handling, or form submission behavior. You’ve created a lie.
Common mistakes that hurt more than they help:
- Overriding native semantics: Adding
role="link"to an<a>tag, oraria-labelto an element that already has clear visible text. The screen reader now ignores the visible text and reads only your label—confusing if they don’t match. - Using aria-label on non-interactive elements: Screen readers may ignore
aria-labelon<div>or<span>elements without a role. The label goes nowhere. - Placeholder as label: Using
placeholderinstead of<label>on form inputs. Placeholders disappear when you type—screen readers may not announce them at all. - Duplicate landmarks: Two
<nav>elements without distinguishingaria-labelvalues. The screen reader says “navigation” twice with no way to tell them apart.
Diagnosis approach: Before adding any ARIA attribute, ask: can I fix this with native HTML instead? Use a <button> instead of a styled <div>. Use a <label> instead of aria-label. Use <nav aria-label="Main"> only when you have multiple nav regions. Native HTML is more robust, works without JavaScript, and doesn’t break when ARIA is implemented incorrectly.
Quick Audit
- Every icon-only button has
aria-label? - No “Click here” or “Read more” without context?
- Form inputs have associated labels?
- Images have alt text (or
alt=""for decorative)?
Testing
- macOS: VoiceOver (Cmd + F5)
- Windows: NVDA (free) or JAWS
- Browser: Chrome DevTools – Accessibility panel
The standard: WCAG 2.1 Level A, 4.1.2 – All UI components must have an accessible name.
Confirming Screen Readers Announce Correctly
- All buttons and links have accessible names
- Form inputs have associated labels
- ARIA roles are used correctly (not overused)
- Screen reader announces elements as expected
Sources
- W3C – ARIA Authoring Practices Guide
- W3C – WCAG 2.1 Specification
- WebAIM – The WebAIM Million (Annual Accessibility Analysis)
ARIA Labels Questions Answered
What are ARIA labels and when do I need them?
ARIA (Accessible Rich Internet Applications) labels provide text descriptions for screen readers when HTML alone is insufficient. Use them on icon-only buttons, custom widgets, navigation landmarks, and form inputs that lack visible labels. The first rule of ARIA: do not use ARIA if native HTML can do the job.
What is the difference between aria-label and aria-labelledby?
aria-label provides an invisible text label directly on the element. aria-labelledby points to another visible element whose text content becomes the label. Use aria-labelledby when a visible label already exists on the page. Use aria-label when no visible text describes the element.
Can too many ARIA attributes hurt accessibility?
Yes. Incorrect or redundant ARIA creates confusing screen reader experiences. Adding role=”button” to a native button element is redundant. Adding aria-label to an element that already has visible descriptive text creates conflicting announcements. Only add ARIA to solve a specific, tested accessibility gap.
How do I test if my ARIA labels are working correctly?
Turn on a screen reader (VoiceOver on Mac with Cmd+F5, NVDA on Windows) and navigate your page. Every interactive element should announce a meaningful name and role. Use Chrome DevTools Accessibility panel to inspect the computed accessible name for any element.
✓ Your ARIA Labels Are Correctly Implemented When
- Every icon-only button and link has an aria-label describing its action (e.g., “Close menu”, “Search”)
- Page landmark regions (nav, main, aside, footer) have aria-label when there are multiple of the same type
- Form inputs without visible labels have aria-label or aria-labelledby pointing to descriptive text
- Dynamic content areas use aria-live=”polite” to announce updates to screen readers
- axe DevTools or WAVE reports zero ARIA-related errors across all page templates
Test it: Run the axe DevTools browser extension on every page template — the “ARIA” category should show zero violations, and each aria-label should make sense when read aloud in isolation.