Skip to content
easeweb
Search topics

Step indicators that mark the current step only by its look

A checkout's step indicator fills the circle of the step you are on and ticks the finished ones, but nothing in the code says which is which, so a screen reader reads every step the same way.

WCAG 2.2
SC 1.3.1A
Required by
Section 508 · EN 301 549 (EU)
Broken <li class="current">
The accessibility problem illustrated: No vision:Which step am I on?
01

The problem

Screen reader users can't tell which step of a form they are on, or which steps are done, because only the step indicator's fill and ticks show it.

02

Try it

Press Continue and Back to move through the checkout.

The panel reads the top of the step as a screen reader does. Can you tell which step you are on, and which are done?

Broken Can you fix this?

BrokenThe current step drawn by a class

Checkout

  1. Cart
  2. 2 Delivery
  3. 3 Payment
  4. 4 Review

Reading from the top, a screen reader says:

  1. Checkout, heading
  2. list, 4 items
  3. Cart, link
  4. 2 Delivery
  5. 3 Payment
  6. 4 Review

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Mark the current and finished steps in the code, or name the step in its heading, and draw the look from the same step value.

  1. 1Mark the current step with aria-current="step" or hidden text, or name it and its number in the step's heading.
  2. 2Don't leave a tick or a fill as the only sign that a step is done: say it in words.
  3. 3Set the look, the markers and the heading from one step value, and move them all when the step changes.
Before The current step drawn by a class
<h1>Checkout</h1><ol class="steps" role="list">  <li class="done">    <a href="/checkout/cart">      <span class="mark"><svg aria-hidden="true" viewBox="0 0 16 16">…</svg></span>      Cart    </a>  </li>  <li class="current">    <span class="mark">2</span>    Delivery  </li>  <li>    <span class="mark">3</span>    Payment  </li>  <li>    <span class="mark">4</span>    Review  </li></ol>
After

Aria-current on the current step, and hidden text on the finished ones

<h1>Checkout</h1><ol class="steps" role="list">  <li class="done">    <a href="/checkout/cart">      <span class="mark"><svg aria-hidden="true" viewBox="0 0 16 16">…</svg></span>      Cart<span class="visually-hidden">, completed</span>    </a>  </li>  <li aria-current="step">    <span class="mark">2</span>    Delivery  </li>  <li>    <span class="mark">3</span>    Payment  </li>  <li>    <span class="mark">4</span>    Review  </li></ol>

Fixing this with an AI coding assistant? Get this guide as Markdown, or get every guide in your coding agent.

04

Design ideas

A step indicator can be drawn many ways and still say where you are.

Four more ways to draw the same four steps. Press Next, and Tab to a finished step: three say which step you are on in words or in code, and one only draws it.

In the design file

  • Draw the three looks, finished, current and still to come, and name each one in the file.
  • Give the current step more than a fill, such as a bold name or a bar under it, so it still shows in Windows high-contrast mode.
  • Write the word a screen reader should say for the tick, such as “completed”, next to it.
  • Draw the phone layout with the step in words, such as “Step 2 of 4”, not dots alone.
  • Write the ratios next to the colours, at least 4.5:1 for the step names and 3:1 for the rings.

Passes

  • Step 2 of 4: Delivery

    Back to Cart
    The step in words, over a segmented bar “Step 2 of 4: Delivery” in bold above four rounded segments, the first two filled in #1f5f8b. The words carry the step, so the bar only repeats them, and it fits a phone where four named circles don’t.
    1. Cart, completed
    2. Delivery
    3. Payment
    4. Review
    Step names in a row, with chevrons No circles at all: the four names in a line, as many shop checkouts draw them. The current one is bold with a 3px bar under it, a shape as well as a colour; finished steps are links in #1f5f8b (6.84:1), steps to come are #5b6670 (5.87:1). The current step is marked in code, as on any indicator.
    1. Cart, completed Linen tote, $48
    2. DeliveryNow
    3. Payment
    4. Review
    A column that shows each answer A vertical list beside the form: each finished step shows what was given under its name, “Linen tote, $48”, so the list says in words what is done and doubles as a summary, and a “Now” tag marks the current step in text everyone reads. It takes a column, so it suits a wide screen.

Fails

  • Dots, the current one stretchedWCAG 1.3.1 Popular in sign-up flows: four 8px dots, the current one stretched into a 24px pill in #1f5f8b. It names no step and gives no number, on screen or in code, so a screen reader says nothing at all and nobody knows what comes next. Write “Step 2 of 4” beside the dots.
05

Verify the fix

5 checks, no mouse.

Test with: Screen reader, Keyboard, Forced colors

0 of 5 checked

Record the OS, browser and assistive-technology versions, the build, the date, and the actual result of each step. Repeat after the checkout's steps or its step component change.

Limits

This is a starting pattern, not a guarantee for every process. Screen readers word aria-current differently, some before the name and some after, and support varies between screen readers and browsers; test with the ones your visitors use. An indicator that marks the right step still leaves people lost in a process that is confusing in itself, or one that asks for the same details twice; see checkout forms that ask for the same address twice. The menu's own current-page link uses the same attribute with another value; see navigation that marks the current page only by its look.

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