Fix Invalid or Misspelled ARIA Attributes
Misspelled ARIA attributes are ignored by assistive technologies, making your accessibility efforts invisible.
What's Happening
ARIA attributes must match the exact specification. A typo like aria-lable instead of aria-label means screen readers see nothing at all. The browser doesn't throw an error - it silently ignores the invalid attribute. Your element appears accessible in your code but provides zero information to users who need it.
Diagnose
- Open Chrome DevTools (F12)
- Go to Elements panel
- Find the flagged element
- Look for attributes starting with
aria- - Check for typos or non-existent attribute names
Common misspellings:
aria-lable→aria-labelaria-labelled-by→aria-labelledbyaria-role→role(aria-role doesn't exist)aria-description→aria-describedbyaria-pressedon wrong elements
Fix
1. Correct Typos
<!-- Before: Misspelled attribute -->
<button aria-lable="Close dialog">×</button>
<!-- After: Correct spelling -->
<button aria-label="Close dialog">×</button>
2. Use Correct Attribute Names
<!-- Before: Non-existent attribute -->
<div aria-role="navigation">...</div>
<!-- After: Correct attribute -->
<div role="navigation">...</div>
3. Fix aria-labelledby (Common Source of Errors)
<!-- Before: Hyphenated incorrectly -->
<input aria-labelled-by="name-label">
<label id="name-label">Name</label>
<!-- After: No hyphen between "labelled" and "by" -->
<input aria-labelledby="name-label">
<label id="name-label">Name</label>
4. Replace Made-Up Attributes
Some attributes seem logical but don't exist:
<!-- Before: aria-description doesn't exist -->
<button aria-description="This saves your work">Save</button>
<!-- After: Use aria-describedby with a referenced element -->
<button aria-describedby="save-desc">Save</button>
<span id="save-desc" class="sr-only">This saves your work</span>
Framework Examples
<script setup lang="ts">
// Define labels as typed constants
const buttonLabel = 'Close dialog'
</script>
<template>
<!-- TypeScript won't catch ARIA typos in templates -->
<!-- Use eslint-plugin-vuejs-accessibility instead -->
<button :aria-label="buttonLabel">
<Icon name="close" />
</button>
</template>
eslint-plugin-vuejs-accessibility to catch these issues during development.Verify the Fix
- Re-run Lighthouse accessibility audit
- In DevTools Elements panel, confirm attribute names are valid
- Test with screen reader:
- Navigate to the element
- Confirm the accessible name/description is announced
- Use browser accessibility inspector (F12 → Accessibility tab)
Common Mistakes
- Assuming aria-role exists: The attribute is
role, notaria-role. - Hyphenating labelledby: It's
aria-labelledby(one word), notaria-labelled-by. - Inventing attributes: Only use attributes defined in the WAI-ARIA specification.
- Copying code without checking: Stack Overflow answers sometimes contain typos. Verify against MDN or W3C.
Valid ARIA Attributes Reference
The most commonly used valid attributes:
aria-label- Accessible name as a stringaria-labelledby- Accessible name from another element's IDaria-describedby- Additional description from another elementaria-hidden- Hide from assistive technologyaria-expanded- Expandable element statearia-pressed- Toggle button statearia-checked- Checkbox/switch statearia-disabled- Disabled statearia-live- Announce dynamic content changes
Related Issues
Invalid attribute issues often appear alongside:
- Required ARIA Attributes - Fix spelling first, then check completeness
- ARIA Hidden Focus - Incorrect attributes can create focus traps
- Link Name - Misspelled aria-label leaves links unnamed
Test Your Entire Site
ARIA typos often hide in component libraries or get copy-pasted across pages. Unlighthouse scans your entire site to find every invalid ARIA attribute, so you can fix typos in one place and ensure consistent accessibility across all pages.