Skip to main content
Beta: Front-End Checklist is currently in beta. Some issues are still being fixed. Thanks for your patience.

Remove focusable elements from aria-hidden containers

Ensures aria-hidden elements do not contain focusable content to avoid "ghost" focus.

Utilities
Quick take
Typical fix time 10 min
  • Elements with `aria-hidden="true"` must not contain focusable children
  • Focusing on a hidden element creates a 'ghost' focus for screen reader users
  • Use `tabindex="-1"` or `inert` to properly hide interactive elements
Why it matters: When a keyboard user tabs into an `aria-hidden` element, the screen reader remains silent, leaving the user with no idea where their focus is or what they can interact with.

Rule Details

When an element is marked with aria-hidden="true", it is removed from the accessibility tree, but it is not removed from the keyboard tab order. WAI-ARIA 1.2 (opens in new tab) makes that distinction explicit, which is why this failure often shows up alongside broader focus-management issues.

Code Example

<!-- ✅ Correct: Focusable element is also removed from tab order -->
<div aria-hidden="true">
  <button tabindex="-1">Hidden Button</button>
</div>
 
<!-- ✅ Correct: Using the inert attribute (modern browser support) -->
<div inert>
  <button>Hidden Button</button>
</div>
 
<!-- ❌ Incorrect: Focusable but hidden from AT (Ghost Focus) -->
<div aria-hidden="true">
  <button>I can be focused but not heard</button>
</div>

Why It Matters

  • Avoid Ghost Focus: Prevents the keyboard focus from disappearing into "silent" regions where no information is announced.
  • User Clarity: Ensures every focusable element has a corresponding announcement by the screen reader, maintaining user confidence.
  • Logical Flow: Maintains a consistent and predictable navigation path for keyboard-only users.
  • Reduces Frustration: Eliminates instances where users might think their browser or the website has crashed because focus seems to have disappeared.

Exceptions

  • Prefer native HTML semantics over ARIA when both are possible; some apparent ARIA failures disappear when the underlying element is corrected.
  • A missing ARIA attribute is not automatically the strongest finding if the control is already semantically broken, unnamed, or keyboard-inaccessible.
  • Do not add ARIA only to satisfy the rule if the feature should instead be implemented with a native element or a simpler interaction pattern.

Standards

  • Align the implementation with WAI-ARIA 1.2 and verify the rendered experience, not only the source code.
  • Align the implementation with MDN: ARIA and verify the rendered experience, not only the source code.

Support Notes

  • The inert attribute is the cleanest modern fix, but older browser targets may still need a fallback that removes descendants from the tab order manually.
  • Verify the rendered focus behavior in the project target browsers because browser and assistive-technology combinations still differ in how they expose hidden content.

Verification

Automated Checks

  • Inspect the browser accessibility tree or accessibility pane for the relevant element, role, or accessible name.
  • Run an automated accessibility checker such as axe or Lighthouse where applicable.

Manual Checks

  • Test the affected UI with keyboard-only navigation and confirm the rule holds in the rendered experience.
  • Re-test one representative user flow with a screen reader if this rule affects a key interaction.

Use with AI

Copy these prompts to use with your AI assistant, or install the MCP server to use directly from Claude, Cursor, or Windsurf.

Check

Verify implementation

Scan `aria-hidden="true"` containers for focusable elements like links, buttons, or inputs.

Fix

Auto-fix issues

Add `tabindex="-1"` to focusable children inside `aria-hidden` containers or use the `inert` attribute.

Explain

Learn more

Explain why focusable elements inside aria-hidden containers cause confusion for keyboard and screen reader users.

Review

Code review

Review the rendered markup and interactive states that affect Remove focusable elements from aria-hidden containers. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.

Sources

References used to support the guidance in this rule.

Further Reading

Tools and supplementary material for exploring the topic in more depth.

axe DevTools
deque.comTool

Rules that often go hand-in-hand with this one.

Provide accessible names for ARIA command elements

Checks that command elements like buttons and links have accessible names for screen reader support.

Accessibility
Avoid focusable descendants in role="text" elements

Checks that elements with role='text' have no focusable descendants

Accessibility
Do not use aria-hidden on the document body

Ensures the document body is not set to aria-hidden, which would hide the entire page from screen readers.

Accessibility
Provide accessible names for tree items

All elements with role="treeitem" must have a descriptive accessible name so screen reader users can navigate hierarchical tree widgets.

Accessibility

Was this rule helpful?

Your feedback helps improve rule quality. This stays internal for now.

Loading feedback...
0 / 385