Skip to content
Search topics

Loading spinners that screen readers never announce

A spinner and a "Loading…" line appear on screen, but nothing tells a screen reader that the page is busy or that the results have arrived.

Broken
Busy. Nobody hears it.
The accessibility problem illustrated.
01

The problem

Screen reader users press a button and hear nothing, so they can't tell whether it worked, is still working, or failed.

02

Try it

Press Enter on Show orders and listen.

The panel shows what a screen reader announces while the orders load. Is the wait ever put into words?

Broken Can you fix this?

Screen reader says: (Press Show orders)

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Write the loading and finished messages into a live region that was there before the request.

  1. 1Render the live region empty on page load, then change its text.
  2. 2Announce the start, the result and any error, in words.
  3. 3Keep focus where it is; don't announce by moving it.
Before A spinner and text in a plain container
<button type="button" id="show-orders">Show orders</button><div id="orders-state"></div><ul id="orders"></ul>
After

A status region that waits its turn

<button type="button" id="show-orders">Show orders</button><p id="orders-state" role="status"></p><ul id="orders"></ul>

04

Verify the fix

4 checks, no mouse.

Test with: Screen reader, Keyboard

0 of 4 checked

Record the OS, browser and assistive-technology versions, the build, the date, and the actual result of each step. Repeat after the data layer or loading component changes.

Limits

Live regions behave differently across screen readers and browsers, especially for regions that are hidden, moved, or inside dialogs. This pattern covers one loading action on one page. Test your real flows, including route changes and infinite scroll, with the screen readers your users use.

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