Skip to content
easeweb
Search topics

Disabled buttons that can't be found or say why

A Place order button is greyed out until the terms box is ticked, but it is either disabled only by a class, so it is announced as ready, or disabled outright, so Tab skips it and nothing says what is missing.

WCAG 2.2
SC 4.1.2A
Required by
Section 508 · EN 301 549 (EU)
Broken <button type="submit" disabled>Place order</button>
The accessibility problem illustrated: Tab skips it, and nothing says why.
01

The problem

Keyboard and screen reader users either hear that a greyed-out button is ready when it isn't, or never find it, and nobody is told what they still need to do.

02

Try it

Press Tab to move from the checkbox to Place order, then press Enter before ticking the box.

Can you reach the button, and does anything tell you what is missing? The panel shows what a screen reader announces.

Broken Can you fix this?

Delivery and returns

Screen reader says:

(Tab through the form)

A recreated demo. The broken version is intentionally inaccessible.

03

The fix

Expose the state in code, keep the button where people can find it, and say in text what is still needed.

  1. 1Never draw a control as disabled without disabled or aria-disabled on the element that takes focus.
  2. 2Keep a control people need to find in the Tab order: leave it enabled, or use aria-disabled.
  3. 3Say in visible text what is missing, beside the button or as an error beside its cause.
Before

A button greyed out by a class

<label><input type="checkbox" name="terms"> I accept the terms</label><button type="submit" class="btn is-disabled">Place order</button>
After

A button that stays enabled and explains when pressed

<label><input type="checkbox" name="terms" id="terms" aria-describedby="terms-error">  I accept the terms</label><p id="terms-error" class="error" hidden>Tick the box to accept the terms.</p><button type="submit">Place order</button>

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

04

Verify the fix

6 checks, no mouse.

Test with: Keyboard, Screen reader, Forced colors, Zoom

0 of 6 checked

Record the OS, browser and assistive-technology versions, the build, the date, and the actual result of each step. Repeat after the shared button component changes.

Limits

This is a starting pattern, not a guarantee for every form. Screen readers word aria-disabled and disabled differently ("dimmed", "unavailable", "disabled"), and some read aria-describedby only after a pause or on request. The error wording and its place on the page depend on the rest of your form. Test the whole journey, from an empty form to a placed order, with the assistive technology your users have.

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