Skip to content
easeweb
Search topics

Lists built from divs, icons and typed numbers

A plan card draws its features as divs with check icons and its setup steps as paragraphs with typed numbers, so a screen reader hears loose lines: no list, no count, and nothing to jump to or skip past.

WCAG 2.2
SC 1.3.1A
Required by
Section 508 · EN 301 549 (EU)
Broken <div class="feature"><svg class="icon-check" …>Unlimited projects</div>
The accessibility problem illustrated: Drawn as a list. Read as loose lines.
01

The problem

Screen reader users hear the plan's features and steps as loose lines, with no count, no end, and no way to jump to them or past them.

02

Try it

Listen to the plan card, then jump to its list the way a screen reader user would.

The panel shows what NVDA or JAWS reads from the top of the card. “Press L” is the key that jumps to the next list. Does anything say a list starts, how long it is, or where it ends? Broken 2 is the steps, with numbers typed into paragraphs.

Broken Can you fix this?

Team plan
Unlimited projects
50 GB of storage
Shared calendars
Priority support

Reading the card from the top, a screen reader says:

Team plan, heading level 3Unlimited projects50 GB of storageShared calendarsPriority support

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Mark each group of items as a list, with ul and ol or with list roles, and number ordered steps once.

  1. 1Anything drawn as a list is a list: ul, ol or dl, or role="list" with role="listitem" items.
  2. 2Use an ordered list when the order matters, and number it once.
  3. 3Keep only items directly inside the list, and no role on it that overrides it.
Before

Features drawn with icons

<h3>Team plan</h3><div class="features">  <div class="feature"><svg class="icon-check" aria-hidden="true">…</svg>Unlimited projects</div>  <div class="feature"><svg class="icon-check" aria-hidden="true">…</svg>50 GB of storage</div>  <div class="feature"><svg class="icon-check" aria-hidden="true">…</svg>Shared calendars</div>  <div class="feature"><svg class="icon-check" aria-hidden="true">…</svg>Priority support</div></div>
After

Ul and ol elements

<h3>Team plan</h3><ul class="features">  <li><svg class="icon-check" aria-hidden="true">…</svg>Unlimited projects</li>  <li><svg class="icon-check" aria-hidden="true">…</svg>50 GB of storage</li>  <li><svg class="icon-check" aria-hidden="true">…</svg>Shared calendars</li>  <li><svg class="icon-check" aria-hidden="true">…</svg>Priority support</li></ul> <h3>Getting started</h3><ol class="steps">  <li>Create your team.</li>  <li>Invite up to 10 people.</li>  <li>Connect your calendar.</li></ol>

Why this fix: Use native HTML first

Fixing this with an AI coding assistant? Get this guide as Markdown

04

Verify the fix

4 checks, no mouse.

Test with: Screen reader

0 of 4 checked

Record the OS, browser and assistive-technology versions, the build, the date, and the actual result of each step. Repeat whenever a shared list component, the CMS editor or the styles that remove markers change.

Limits

This is a starting pattern, not a guarantee for every application. Class names and the … inside the icons are placeholders. Screen readers word lists differently, "list, 4 items", "list with 4 items" or "4 items", so listen for the count and the end rather than the exact phrasing. This guide covers whether content shown as a list is marked up as one. It doesn't cover tables, headings, or lists that can be reordered by dragging. Test the complete journey with your target assistive technology.

This is a recreated teaching example, not a finding about a named client. The code is a starting pattern: test it in your own product. No completed assistive-technology test is claimed here.

Keep this fixed as your code changes.

Turn guides like this into rules your coding agents and CI follow, then have the result retested with a keyboard and screen readers.

How retests work