Organizing content effectively on the web is about more than just layout—it’s about usability and inclusivity. When users are forced to scroll through long pages of uninterrupted text, the experience becomes inefficient and frustrating.
Enter accordion components: interactive UI elements that allow content sections to be expanded or collapsed. When implemented correctly, accordion accessibility streamlines navigation and improves content organization. However, if accessibility is overlooked, these helpful components can quickly become barriers.
This guide explores how to design accessible accordion components that enhance the user experience and meet all users’ needs—regardless of their abilities. We’ll cover best practices for structure, semantics, ARIA attributes, keyboard support, and implementation strategies to help you build inclusive, user-friendly interfaces.
Why Accordion Accessibility Matters
Accordions are essential: they reduce visual clutter and allow users to interact with content on their terms. Whether it’s an FAQ page, a product feature breakdown, or technical documentation, accordions help surface only the content that matters at the moment.
However, it’s crucial to remember that not all users interact with content similarly. Screen reader users, keyboard-only users, and others with varying access needs must be able to operate accordions just as easily as those using a mouse or touchscreen. Accessible design isn’t just a nice-to-have—it’s an essential component of responsible development.
The Building Blocks of an Accordion Accessibility-Friendly Component
1. Structure: Header and Panel
Every accordion should be composed of two core parts:
Header (Trigger)
A clickable element (typically a <button>
) that users activate to show or hide content. It usually includes a descriptive label and may feature visual indicators like arrows or plus/minus icons.
Panel (Content)
The content is associated with the header. It should be hidden from view and keyboard focus when collapsed and fully accessible when expanded.
For effective accordion accessibility, each header must be clearly linked to its corresponding panel—visually for sighted users and programmatically for assistive technologies.
2. Keyboard Navigation
One of the most common accessibility pitfalls with accordion components is insufficient keyboard support. If users can’t operate your interface without a mouse, it’s not accessible.
Your accordion must support the following interactions:
- Tab / Shift + Tab: Move between focusable elements, including accordion headers.
- Enter or Space: Expand or collapse the currently focused header.
- Arrow Up / Arrow Down: Navigate between accordion headers.
- Home / End: Jump to the first or last header within the accordion group.
By supporting these interactions, you ensure that keyboard users have the same level of control as mouse users.
3. Use Semantic HTML
Semantic HTML provides the backbone of accessibility. It ensures assistive technologies can understand the structure and function of your content without additional cues.
Best Practices for Accordion Accessibility
- Use heading elements (
<h3>
,<h4>
, etc.) to maintain the document outline. - Place a
<button>
inside the heading to toggle visibility. - Wrap panel content in a
<div>
that follows its associated button.
Why <button>
and not <div>
or <a>
?
Buttons are keyboard-focusable by default, accessible to screen readers, and support interactions like Enter and Space. Enter and Space. If you rely on <div>
or <a>
for toggling, you’ll need extra code to achieve the same level of accordion accessibility.
4. Implementing ARIA Attributes
ARIA (Accessible Rich Internet Applications) attributes enhance accessibility when native HTML doesn’t fully express an element’s role or state. In custom accordions, these attributes help communicate dynamic behavior to assistive technologies.
ARIA Attributes for Accordion Accessibility
aria-expanded
: Indicates the panel’s expanded (true) or collapsed (false) state. Applied to the button.aria-controls
: Points to the id of the panel controlled by the button.aria-labelledby
: Applied to the panel, this links it back to its header button for context.aria-hidden
:Use decorative icons or non-informative content to prevent screen readers from announcing them.
These attributes ensure that screen reader users receive clear, relevant information about the accordion’s behavior and structure.
Implementation Examples
Option 1: Native HTML with <details>
and <summary>
For a semantic-first approach, HTML offers a native accordion-like behavior:
<details>
<summary>Shipping Information</summary>
<div>
<p>We offer free shipping on orders over $50...</p>
</div>
</details>
Pros
- Minimal code
- Built-in keyboard support
- Accessible by default in modern browsers
Cons
- Styling can be limited
- Inconsistent support across all assistive technologies
This is a great lightweight option for simple use cases but may fall short in more complex interfaces.
Option 2: Custom JavaScript Accordion with ARIA
If you need more control, a custom accordion allows full styling and behavior management—just be sure to handle accordion accessibility properly.
HTML Structure
<h3>
<button aria-expanded="false" aria-controls="panel1" id="accordion1">
Shipping Info
</button>
</h3>
<div id="panel1" role="region" aria-labelledby="accordion1" hidden>
<p>We offer free shipping on orders over $50...</p>
</div>
JavaScript snippet
const buttons = document.querySelectorAll('button[aria-expanded]'); buttons.forEach((button) => { const toggleAccordion = () => { const expanded = button.getAttribute('aria-expanded') === 'true'; button.setAttribute('aria-expanded', String(!expanded)); const panel = document.getElementById(button.getAttribute('aria-controls')); panel.hidden = expanded; }; button.addEventListener('click', toggleAccordion); button.addEventListener('keydown', (event) => { if (event.key === 'Enter') { toggleAccordion(); } }); });
This implementation not only handles basic interaction but also improves navigation for keyboard users. Combined with semantic structure and ARIA, it creates a robust and inclusive experience.
Best Practices to Keep in Mind
- Use Clear Labels: Avoid generic labels like “Section 1.” Use descriptive headers that make sense out of context.
- Provide Visual Cues: Arrows or plus/minus icons help users understand that a section is expandable. Consider animations that reinforce open/close behavior.
- Maintain Focus Indicators: Never remove focus outlines unless you’re replacing them with custom indicators that are just as visible.
- Be Selective with Accordions: Don’t hide critical content. It should be visible by default if the information is essential (e.g., pricing, legal disclaimers).
Testing Accessibility
Even well-intended implementations can miss the mark without testing. Include accessibility testing as part of your development workflow:
- Keyboard-Only Testing: Navigate the accordion entirely by keyboard.
- Screen Reader Testing: Use tools like NVDA, JAWS, or VoiceOver to check for correct announcements.
- Automated Tools: Run your component through tools like WAVE, or Lighthouse to identify missing attributes or ARIA misuse.
- Manual Code Review: Double-check that all attributes, labels, and roles are properly implemented.
Final Thoughts
Accessible accordions do more than organize content—they foster a better, more inclusive web. By prioritizing structure, semantics, ARIA roles, and thoughtful interaction design, you empower all users to engage with your content meaningfully.
If you’re unsure where to start or want to ensure your components meet accessibility standards, consider working with an experienced accessibility partner like 216digital. We specialize in helping teams build digital experiences that work for everyone—by default, and with accordion accessibility baked in.