Skip to content
A11ySignal

Checklist

WCAG 2.2 AA, as a list you can work down

All 55 Level A and AA success criteria — the set EN 301 549 and the European Accessibility Act point at. Split by the only distinction that changes how you spend your afternoon: what a scanner can prove, and what a person has to look at.

23 automatable · 32 need a person

How to use this

  1. 1. Run a scan first. It clears most of the 23 automatable criteria in a minute, and it is free for one page.
  2. 2. Work down the manual list with a keyboard and a screen reader. Budget an hour per template, not per page.
  3. 3. Write down what you could not fix and why. That list is your accessibility statement, and it is what an enforcement body reads first.

A scanner can prove these

Every one of these is checked automatically on every scan. A clean result here is real evidence, and it is the cheapest evidence you will get.

  • scanned1.1.1Level ANon-text Content

    Anything that is not text — an image, an icon, a chart — needs a text version that says the same thing.

    image-alt · input-image-alt · aria-meter-name · aria-progressbar-name

  • Audio with no video, and video with no audio, need an alternative that carries the same information.

    audio-caption

  • scanned1.2.2Level ACaptions (Prerecorded)

    Pre-recorded video with sound needs captions.

    video-caption

  • scanned1.3.1Level AInfo and Relationships

    Structure you show with layout — headings, lists, tables, groups — has to exist in the markup too.

    aria-hidden-body · aria-required-children · aria-required-parent · td-has-header

  • scanned1.3.4Level AAOrientation

    Do not lock the page to one screen orientation.

    css-orientation-lock

  • scanned1.3.5Level AAIdentify Input Purpose

    Fields that ask for the user’s own details should say which detail they want, in code.

    autocomplete-valid

  • scanned1.4.1Level AUse of Color

    Colour alone must not carry meaning.

    link-in-text-block

  • scanned1.4.2Level AAudio Control

    Audio that plays for more than three seconds by itself needs a way to stop it.

    no-autoplay-audio

  • scanned1.4.3Level AAContrast (Minimum)

    Text needs a contrast ratio of at least 4.5:1 against its background — 3:1 if it is large.

    color-contrast

  • scanned1.4.4Level AAResize Text

    Text has to survive being zoomed to 200% without losing content or function.

    meta-viewport

  • scanned1.4.12Level AAText Spacing

    The page must still work when the reader increases line height and letter spacing.

    avoid-inline-spacing

  • scanned2.1.1Level AKeyboard

    Everything you can do with a mouse, you must be able to do with a keyboard.

    frame-focusable-content · scrollable-region-focusable · server-side-image-map

  • scanned2.2.1Level ATiming Adjustable

    If something is on a timer, the user needs to be able to turn it off, adjust it, or extend it.

    meta-refresh

  • scanned2.2.2Level APause, Stop, Hide

    Anything that moves, blinks, scrolls or updates by itself for more than five seconds needs a pause control.

    blink · marquee

  • scanned2.4.1Level ABypass Blocks

    Give people a way past the blocks that repeat on every page.

    bypass

  • scanned2.4.2Level APage Titled

    Every page needs a title that says what the page is.

    document-title

  • scanned2.4.4Level ALink Purpose (In Context)

    A link's text has to say where it goes.

    area-alt · link-name

  • scanned2.5.3Level ALabel in Name

    The accessible name of a control must contain the words shown on it.

    label-content-name-mismatch

  • scanned2.5.8Level AATarget Size (Minimum)

    Tap targets need to be at least 24 by 24 CSS pixels, or spaced far enough apart.

    target-size

  • scanned3.1.1Level ALanguage of Page

    The page has to declare what language it is in.

    html-has-lang · html-lang-valid · html-xml-lang-mismatch

  • scanned3.1.2Level AALanguage of Parts

    Mark up passages that are in a different language from the page.

    valid-lang

  • scanned3.3.2Level ALabels or Instructions

    Every input needs a label, and instructions where the format is not obvious.

    form-field-multiple-labels

  • scanned4.1.2Level AName, Role, Value

    Every control must expose what it is, what it is called, and what state it is in.

    area-alt · aria-allowed-attr · aria-hidden-body · aria-required-attr

These need a person

No tool decides these. They are about meaning and behaviour — whether alt text says the right thing, whether focus order matches the page, whether a custom widget behaves like the pattern it imitates. Anyone claiming full coverage is not counting these.

  • Pre-recorded video needs either an audio description of what is shown, or a text alternative.

    Whether the audio conveys everything the video does is a human call.

  • by hand1.2.4Level AACaptions (Live)

    Live audio content needs live captions.

    Check by hand: use a live captioning service, or a human stenographer for anything high-stakes.

  • Pre-recorded video needs an audio description track.

    Check by hand: add an audio-description track, or re-record the narration to describe what happens.

  • by hand1.3.2Level AMeaningful Sequence

    The order the content is read in has to make sense.

    A scanner cannot know what order you intended. Read the page with CSS off.

  • by hand1.3.3Level ASensory Characteristics

    Do not explain something using only shape, size, position, or sound.

    This one is entirely a reading exercise. No tool detects it.

  • by hand1.4.5Level AAImages of Text

    Use real text, not pictures of text.

    A scanner cannot see text inside an image. This one needs eyes.

  • by hand1.4.10Level AAReflow

    Content must reflow into a 320px-wide window without a horizontal scrollbar.

    Check by hand: build the layout to reflow. if you are responsive already, you are most of the way there.

  • by hand1.4.11Level AANon-text Contrast

    Interface parts and meaningful graphics need 3:1 contrast, not just text.

    Check by hand: bring borders, focus rings and icons to at least 3:1 against what is behind them.

  • by hand1.4.13Level AAContent on Hover or Focus

    Content that appears on hover or focus must be dismissible, hoverable and persistent.

    Check by hand: keep it open while the pointer is over either the trigger or the popup.

  • by hand2.1.2Level ANo Keyboard Trap

    Keyboard focus must never get stuck somewhere the user cannot leave.

    Traps are found by tabbing through the page, not by scanning it.

  • by hand2.1.4Level ACharacter Key Shortcuts

    A shortcut made of a single letter must be turnable off or remappable.

    Check by hand: require a modifier (ctrl, alt, cmd), or only listen while the relevant control has focus, or let the user turn shortcuts off.

  • Nothing may flash more than three times a second.

    Check by hand: keep flashes below three per second, or below the general flash and red flash thresholds.

  • by hand2.4.3Level AFocus Order

    Focus has to move in an order that preserves meaning.

    Tab through the page and watch where the ring goes. That is the whole test.

  • by hand2.4.5Level AAMultiple Ways

    Offer more than one way to find a page.

    Check by hand: add search, a sitemap, or breadcrumbs. any two routes satisfy this.

  • by hand2.4.6Level AAHeadings and Labels

    Headings and labels have to describe what follows them.

    A tool sees that a heading exists, not whether it is descriptive.

  • by hand2.4.7Level AAFocus Visible

    You must be able to see where keyboard focus is.

    Check by hand: never remove the outline without replacing it. style `:focus-visible` instead of deleting `:focus`.

  • by hand2.4.11Level AAFocus Not Obscured (Minimum)

    A sticky header or footer must not completely hide the focused element.

    Check by hand: add `scroll-margin-top` matching the header height, or shrink the sticky element on scroll.

  • by hand2.5.1Level APointer Gestures

    Anything you do with a multi-finger or path-based gesture must also work with a single tap.

    Check by hand: add plain buttons alongside the gesture: zoom in / zoom out, previous / next.

  • by hand2.5.2Level APointer Cancellation

    An action must not fire on the press — the user needs a chance to back out.

    Check by hand: fire on `click` / the up event, or provide an undo.

  • by hand2.5.4Level AMotion Actuation

    If shaking or tilting the device does something, there must be a control that does it too.

    Check by hand: add the equivalent control, and let motion actuation be turned off.

  • by hand2.5.7Level AADragging Movements

    Anything that works by dragging must also work without dragging.

    Check by hand: add buttons, a menu, or a text input that does the same job.

  • by hand3.2.1Level AOn Focus

    Focusing something must not change the page by itself.

    Check by hand: act on activation — a click, enter, or an explicit go button — never on focus alone.

  • by hand3.2.2Level AOn Input

    Changing a value must not do something unexpected without warning.

    Check by hand: add a submit button, or tell the user in advance what the control will do.

  • by hand3.2.3Level AAConsistent Navigation

    Navigation that repeats across pages must stay in the same order.

    Check by hand: keep the relative order stable. adding an item is fine; shuffling is not.

  • by hand3.2.4Level AAConsistent Identification

    The same thing must be called the same thing everywhere.

    Check by hand: pick one name per concept and use it in every label, button, toast and heading.

  • by hand3.2.6Level AConsistent Help

    If help is offered on several pages, it has to be in the same place on each.

    Check by hand: keep help mechanisms in the same relative order on every page that has them.

  • by hand3.3.1Level AError Identification

    When input is rejected, say which field and what is wrong, in text.

    Check by hand: name the field and the problem: "postcode: use the format sw1a 1aa".

  • by hand3.3.3Level AAError Suggestion

    When you can tell what the user meant, suggest the fix.

    Check by hand: say what would be valid: "use dd/mm/yyyy, for example 24/06/2026".

  • Legal, financial and data-changing submissions must be reversible, checked, or confirmable.

    Check by hand: add a review step, an undo window, or an explicit confirmation. any one of the three satisfies it.

  • by hand3.3.7Level ARedundant Entry

    Do not make people type the same information twice in one process.

    Check by hand: auto-populate, offer a copy checkbox, or let the user pick a previous value.

  • Do not make people solve a puzzle or recall something to log in.

    Check by hand: allow paste and let password managers fill the field.

  • by hand4.1.3Level AAStatus Messages

    Messages that appear without moving focus must be announced.

    Check by hand: use `role="status"` (polite) or `role="alert"` (assertive) for anything urgent.

Criterion text is from the W3C Web Content Accessibility Guidelines 2.2. Level AAA is excluded: it is not what the EAA asks for, and W3C does not recommend it as a site-wide target. 31 AAA criteria have their own pages in the full reference.