Skip to Content

Blog > Creating an Accessible Accordion with HTML Description Lists

Creating an Accessible Accordion with HTML Description Lists

Karl Groves. - 17/04/2025

When designing web components, accessibility is paramount to ensure inclusiveness for all users, including those with disabilities. A common interactive element that greatly benefits from an accessible implementation is the accordion—a user interface component that allows users to expand and collapse content sections. In this tutorial, we will dive deep into building an accessible accordion using HTML description lists (<dl>).

Why Use Description Lists for Accordions?

HTML description lists (<dl>) are designed to pair terms and their descriptions, making them a natural fit for structuring an accordion.
Each term (<dt>) can serve as a clickable header, with its paired description (<dd>) acting as the collapsible content.
This semantic approach is not only meaningful for browsers and search engines but also improves accessibility when combined with proper ARIA attributes.


Structuring the Accordion with HTML

The backbone of our accordion is a <dl> element containing multiple <dt> and <dd> pairs:

<dl class="accordion">
  <dt>
    <button aria-expanded="false" aria-controls="section1" id="accordion1">
      Section 1
    </button>
  </dt>
  <dd id="section1" role="region" aria-labelledby="accordion1">
    <p>Content for section 1.</p>
  </dd>
  <dt>
    <button aria-expanded="false" aria-controls="section2" id="accordion2">
      Section 2
    </button>
  </dt>
  <dd id="section2" role="region" aria-labelledby="accordion2">
    <p>Content for section 2.</p>
  </dd>
</dl>

The buttons are linked to their respective content sections using aria-controls and aria-labelledby attributes, providing clear relationships for screen readers.


Adding Styles with CSS

Styling ensures that collapsed sections are hidden and expanded sections are clearly visible:

.accordion {
  border: 1px solid #ccc;
  border-radius: 4px;
  padding: 0;
  max-width: 400px;
}

.accordion button {
  width: 100%;
  padding: 10px;
  text-align: left;
  font-size: 16px;
  cursor: pointer;
  transition: background-color 0.3s;
}

.accordion dd {
  display: none;
  padding: 10px;
  background-color: #fafafa;
}

.accordion dd[aria-hidden="false"] {
  display: block;
}

Implementing Toggle Behavior with JavaScript

The following JavaScript snippet controls the expand/collapse behavior while maintaining accessibility attributes:

const buttons = document.querySelectorAll('.accordion dt button');

buttons.forEach((button) => {
  button.addEventListener('click', () => {
    const expanded = button.getAttribute('aria-expanded') === 'true';
    button.setAttribute('aria-expanded', !expanded);
    
    const content = document.getElementById(button.getAttribute('aria-controls'));
    content.setAttribute('aria-hidden', expanded ? 'true' : 'false');
  });
});

Enhancing Accessibility Further

To fully support accessibility, consider:

  • Keyboard Navigation: Ensure users can navigate using Tab and activate with Enter/Space.
  • Focus Management: Set appropriate focus states when expanding content.
  • Screen Reader Announcements: Use aria-live for dynamic announcements.

Final Result

The full, working example can be seen at https://codepen.io/afixt/pen/vEBgYWy

See the Pen
Accessible Accordion Based on Description Lists (DL)
by AFixt (@afixt)
on CodePen.

Learn More

For more tips and training on accessible web development, check out LearningAccessibility.com

Related Blog Posts

The major technical reasons why accessibility overlays don’t work

The Overlay Factsheet describes an accessibility overlay as follows: The fundamental constraint you will notice as you dive into the details below is that post-rendered remediation is working against the framework, not with it. React (and similar frameworks) own the DOM. The framework expects to be the single source of truth for element structure, attributes, […]

Karl Groves - 10/04/2026

VPAT Quality: How to Spot a VPAT That Wasn’t Properly Tested

A VPAT that claims “Supports” across the board is a red flag, not a success. I’ve reviewed hundreds of VPATs—Voluntary Product Accessibility Templates—over the years, and the pattern is unmistakable: many are filed without substantive testing. Organizations create them to satisfy procurement…

Karl Groves - 07/04/2026

Beware of “AI” accessibility audits

And, even moreso: beware of companies who sell them. I performed my first professional accessibility audit in 2006. Since that time, I’ve performed hundreds of accessibility audits for everything from small websites to massive standalone kiosks in Manhattan. I’ve done audits for small one-person e-commerce stores and massive software companies like Google, Adobe, Microsoft, and […]

Karl Groves - 27/03/2026

Introducing AFixt Accessibility Program Management

A Complete Solution Built on the W3C Accessibility Maturity Model Being successful in accessibility isn’t a one-off project. Like all compliance domains, it’s an organizational capability that must be built, measured, and sustained across every function of a business, ranging from how you recruit employees to how you procure software and from how your developers […]

Karl Groves - 20/03/2026

What I Like About WCAG 3.0

The W3C published an updated Working Draft of WCAG 3.0 on September 4, 2025, and I’ve spent considerable time pulling it apart. The accessibility community has been tracking this specification since the first public working draft dropped in January 2021, and after years of watching the sausage get made this latest draft finally feels like […]

Karl Groves - 03/03/2026