Brief Note on Description List Support

TL;DR: Description list support is generally good (with Safari being the outlier), even if you may not like how it is supported.

This post builds on my 2020 tests when iOS 14 finally added (partial) support for description lists (VoiceOver on iOS 14 Supports Description Lists).

The <dl> has existed since HTML+, or 1993, when it was called definition list. After 30 years, developers still seem confused about how they are exposed. This post means I hopefully don’t have to write lengthy emails, Slack posts, threads, or letters sealed with wax and my signet.

Testing Results

This is not meant to indicate if the browser / screen reader combination is adhering to the specification. Nor your idea of how it should. Instead the table only indicates how the construct is conveyed with qualifiers based on my opinion. I care little if it is consistent from screen reader to screen reader, only that it is consistent within one combination.

The browser and screen reader combinations represent the generally recommended pairings for the platform (which is similar to the most common pairings).

Takeaways

With the qualifiers out of the way, here are the key takeaways:

Key

I am getting weird in how I style these things, so I made a key:

Testing Results

The crunchy bits, which include a lot of footnotes, some kind of round-up per row, and maybe not enough detail for you (it takes a lot of effort to test all these). A pain to read no matter your device because I refactored it so many times I no longer see a table, just my diminished ego.

Added 4 December: If you find this table confounding (I mean, I do), Ben Myers made a prettier layout that does not suffer from trying to convert from Excel and just being tired.

Updated 7 December: I made the table(s) suck less.

Firefox / NVDA
Navigation 1. No ARIA 2. ARIA 1.1 Term/Definition Roles 3. ARIA 1.3 (Draft) Association List Roles Round-up
read-all (NVDA + A) Yup 1, 2 Yup 1, 2 Yup 1, 2 Each pattern announces the same.
virtual cursor () Yup 1, 3 Yup 1, 3 Yup 1, 3 Each pattern announces the same.
list navigation (L) Yup 1 Yup 1 Yup 1 Each pattern announces the same.
list item navigation (I) Sure 4 Sure 4 Sure 4 Each pattern announces the same.
Chrome / JAWS
Navigation 1. No ARIA 2. ARIA 1.1 Term/Definition Roles 3. ARIA 1.3 (Draft) Association List Roles Round-up
read-all (JAWS + ) Sure 5, 6 Sure 5, 6 Sure 5, 6 Each pattern announces the same.
virtual cursor () Sure 3, 7 Sure 3, 7 Sure 3, 7 Each pattern announces the same.
list navigation (L) Sure 7 Sure 7 Sure 7 Each pattern announces the same.
list item navigation (I) Sure 8 Sure 8 Sure 8 Each pattern announces the same.
Edge / Narrator
Navigation 1. No ARIA 2. ARIA 1.1 Term/Definition Roles 3. ARIA 1.3 (Draft) Association List Roles Round-up
read-all (Narrator + R) Sure 5, 6 Sure 5, 6 Sure 5, 6 Each pattern announces the same.
virtual cursor () Sure 3, 5 Sure 3, 5 Sure 3, 5 Each pattern announces the same.
Safari / VoiceOver / macOS
Navigation 1. No ARIA 2. ARIA 1.1 Term/Definition Roles 3. ARIA 1.3 (Draft) Association List Roles Round-up
read-all (VO + A) Sure 2, 5 Yup 2, 9 Nope 2, 10 Applying ARIA 1.1 term and definition roles adjusts count. Applying ARIA 1.3 roles breaks list announcement completely.
virtual cursor () Nope 10, 11 Nope 10, 11 Nope 10, 11 Each pattern announces the same.
list navigation (VO + X) Sure 12 Yup 13 Nope 10 Applying ARIA 1.1 term and definition roles adjusts count. Applying ARIA 1.3 roles breaks list announcement completely.
Chrome / TalkBack
Navigation 1. No ARIA 2. ARIA 1.1 Term/Definition Roles 3. ARIA 1.3 (Draft) Association List Roles Round-up
read-all (swipe L, “Read from next item”) Wut 10, 14 Sure 10, 14, 15 Wut 10, 14 Adding the term role gets it announced.
virtual cursor (swipe right) Wut 10, 14 Sure 10, 14, 15 Wut 10, 14 Adding the term role gets it announced.
list navigation (Alt + O) Sure 16 Sure 16 Sure 16 Each pattern announces the same.
list navigation (Alt + I) Sure 4 Wut 4, 15 Sure 4 Uses term role to add more context.
Safari / VoiceOver / iPadOS
Navigation 1. No ARIA 2. ARIA 1.1 Term/Definition Roles 3. ARIA 1.3 (Draft) Association List Roles Round-up
read-all (two finger swipe down) Sure 15, 17, 18 Nope 19 Sure 15, 17, 18 Uses term and definition roles to break lists.
virtual cursor (swipe right) Sure 15, 17, 18 Wut 17 Sure 15, 17, 18 Uses term and definition roles to break lists.
list navigation (X) Nope 10 Nope 10 Nope 10 Does not recognize them as lists for keyboard navigation.
  1. Announced as a list with 8 items.
  2. Announces each DT and DD with a pause.
  3. Arrow key stops at each DT and DD.
  4. Only navigates DTs.
  5. Announced as a definition list with 4 items.
  6. Announces each DT and DD together.
  7. Announced as a list with 4 items.
  8. Only DTs get announced.
  9. Announced as a description list with 8 items.
  10. Does not announce list.
  11. Each DT and DD is exposed as a text element.
  12. Announces as a description list with 4 items.
  13. Announces as a description list with 8 items.
  14. Announces DD with trailing “definition”.
  15. Announces DT with trailing “term”.
  16. Announces as list, no count.
  17. Announces as description list, no count.
  18. Announces DD with trailing “description”.
  19. Announces as a single string, no pauses, no roles, no list items.

The Tests

I only put together three tests for six roles and three elements, so the permutations are not thorough. I confirmed that adding <div>s as children of the <dl> did not affect announcement, but I could not be bothered to add more columns to the table saying as much.

You can build on these for your own use. Visit them at Codepen or view the debug version. Each passed checks (as appropriate) by the Nu HTML Checker and survived, as well as automated accessibility testing tools WAVE, Axe, and ARC (dismissing false positives).

I again encourage you to try your own combinations of patterns for testing.

See the Pen Description List Tests by Adrian Roselli (@aardrian) on CodePen.

My testing suite:

Update: 25 March 2024

Tim White performed some testing with JAWS and VoiceOver and, unlike my post, he included VoiceOver with Chrome. Much briefer tests and therefore likely easier to read. He also posted a video of each test to YouTube, something I could not be arsed to do.

No comments? Be the first!

Leave a Comment or Response

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>