a11ymedicaccessibility clinic

Cheat sheet

WCAG 2.2 in plain language

All 55 success criteria a site needs for level AA (plus the two AAA ones a11ymedic can test), each in a sentence or two, with a typical failure and the people it helps most. 25 of them have automated a11ymedic checks; the rest need a person, and the tip says how.

  1. Perceivable21 criteria
  2. Operable21 criteria
  3. Understandable13 criteria
  4. Robust2 criteria

1. Perceivable

People must be able to get the information with the senses they have: text for images, captions for video, enough contrast, and structure that still makes sense when the visual layout is gone.

1.1.1Level A

Non-text Content

Every image, icon, chart or embedded object that carries meaning needs a text alternative. Decorative images need an empty alt so screen readers skip them.

Fails when: A product photo with no alt attribute, so a screen reader reads the file name "IMG_2041.jpg".

a11ymedic checks: image-alt image-alt-quality input-image-alt area-alt role-img-alt object-alt

Also check by hand: A tool can see that alt exists, not that it is right. Read each alt text out loud without looking at the image and ask if it gives the same information.

HelpsScreen reader usersLow visionCognitive and learning

1.2.1Level A

Audio-only and Video-only (Prerecorded)

A recorded podcast or audio clip needs a transcript. A silent video that shows information needs a text description or an audio track that explains it.

Fails when: A podcast episode page that only offers the audio player and no transcript.

Check by hand: List every audio and silent video file on the site and confirm each one links to a transcript or text description.

HelpsDeaf and hard of hearingScreen reader users

1.2.2Level A

Captions (Prerecorded)

Recorded video with sound needs synchronized captions that include speech and important sounds. Captions are text tracks, not part of the image.

Fails when: A product demo video served with a <video> element that has no <track kind="captions">.

a11ymedic checks: video-caption

Also check by hand: Turn the sound off and watch the video. Check that the captions are accurate, in sync, and mention sounds that matter such as an alarm or laughter.

HelpsDeaf and hard of hearing

1.2.3Level A

Audio Description or Media Alternative (Prerecorded)

When a recorded video shows information that is not spoken, provide audio description or a full text alternative that describes what happens on screen.

Fails when: A tutorial video where the presenter says "click here, then here" and never names what is clicked.

Check by hand: Listen to the video with your eyes closed. Anything you miss must be in an audio description or a text version.

HelpsScreen reader usersLow vision

1.2.4Level AA

Captions (Live)

Live video with audio, such as a webinar or a live stream, needs real time captions.

Fails when: A live product launch stream with no captions at all.

Check by hand: Before a live event, confirm who provides captions (a human captioner or a captioning service) and test that they show in the player.

HelpsDeaf and hard of hearing

1.2.5Level AA

Audio Description (Prerecorded)

At level AA a text alternative is not enough: recorded video needs audio description of important visual information that the soundtrack does not already explain.

Fails when: A marketing video that shows prices and dates only as on screen text with music playing.

Check by hand: Script the video so speakers describe what is shown, or produce a described version and link to it next to the player.

HelpsScreen reader usersLow vision

1.3.1Level A

Info and Relationships

Structure that you can see must also exist in the code: headings are real headings, lists are real lists, tables have header cells, and labels are connected to their fields.

Fails when: A bold <div class="title"> that looks like a heading but is not an <h2>, so screen reader users cannot jump to it.

a11ymedic checks: label radio-group heading-order page-has-heading-one empty-heading landmark-one-main landmark-unique region list listitem definition-list duplicate-id aria-hidden-focus aria-required-parent table-headers th-scope-valid empty-table-header

Also check by hand: Turn off CSS (or use reader view) and check that the page still reads in a sensible order with headings, lists and tables intact.

HelpsScreen reader users

1.3.2Level A

Meaningful Sequence

When the order of content matters, the order in the code must match it. CSS that moves things around visually must not scramble the reading order.

Fails when: A card where CSS order puts the price above the title, but the HTML puts the price after an unrelated footer.

Check by hand: Read the page with a screen reader or tab through it, and compare the order you hear with the order you see.

HelpsScreen reader users

1.3.3Level A

Sensory Characteristics

Instructions must not rely only on shape, color, size, position or sound. Name the thing as well as describing where it is.

Fails when: "Press the round button on the right to continue" with no visible name on the button.

Check by hand: Search your copy for words like "left", "right", "above", "green" or "round" and make sure each instruction also names the control.

HelpsScreen reader usersLow visionColor blindness

1.3.4Level AA

Orientation

Do not lock the page to portrait or landscape unless the orientation is essential, such as a piano app. People with mounted devices cannot rotate them.

Fails when: A web app that shows "Please rotate your device" and blocks the content in landscape.

Check by hand: Open the page on a phone and rotate it both ways. Everything should remain usable.

HelpsMotor and dexterity

1.3.5Level AA

Identify Input Purpose

Fields that ask for the user's own data (name, email, phone, address) need the correct autocomplete value so browsers can fill them and tools can show familiar icons.

Fails when: An email field with no autocomplete attribute, or with autocomplete="e-mail", which is not a valid token.

a11ymedic checks: autocomplete-valid input-purpose

Also check by hand: Fill the form with browser autofill. Each personal field should fill correctly on the first try.

HelpsCognitive and learningMotor and dexterity

1.4.1Level A

Use of Color

Color must not be the only way to show information. Add text, an icon, an underline or a pattern so people who cannot tell colors apart still get the message.

Fails when: Form errors shown only by turning the field border red, with no error text.

Check by hand: View the page in grayscale (most browsers' developer tools can emulate it) and check that nothing important disappears.

HelpsColor blindnessLow vision

1.4.2Level A

Audio Control

Sound that plays automatically for more than 3 seconds needs a way to pause or mute it. Better: do not autoplay sound at all.

Fails when: A hero video with autoplay and sound, which talks over the user's screen reader.

a11ymedic checks: autoplay-media

Also check by hand: Load each page with the volume up. If you hear anything you did not start, check that a pause or mute control is the first thing on the page.

HelpsScreen reader usersCognitive and learning

1.4.3Level AA

Contrast (Minimum)

Text needs a contrast ratio of at least 4.5:1 against its background. Large text (24px, or 18.66px bold) needs 3:1.

Fails when: Light gray #999999 text on white, which is 2.84:1.

a11ymedic checks: color-contrast

Also check by hand: Text over photos, videos and complex gradients cannot be measured from code alone. Check the worst spot by eye or with a color picker.

HelpsLow visionColor blindness

1.4.4Level AA

Resize Text

People must be able to zoom text to 200 percent without losing content or features. Never disable pinch zoom in the viewport meta tag.

Fails when: <meta name="viewport" content="width=device-width, maximum-scale=1, user-scalable=no">

a11ymedic checks: meta-viewport

Also check by hand: Zoom the browser to 200 percent and check that no text is cut off, overlapped or hidden behind fixed elements.

HelpsLow vision

1.4.5Level AA

Images of Text

Use real text instead of pictures of text, except for logos. Real text can be resized, recolored, translated and read by screen readers.

Fails when: A banner with the sale terms baked into a JPEG instead of written in HTML.

Check by hand: Try to select the text with the mouse. If you cannot, it is probably an image and should be rebuilt as HTML and CSS.

HelpsLow visionCognitive and learning

1.4.6Level AAA

Contrast (Enhanced)

The stricter version of 1.4.3: text needs 7:1 against its background, and large text needs 4.5:1.

Fails when: Gray #767676 on white passes AA at 4.54:1 but fails AAA.

a11ymedic checks: color-contrast-enhanced

Also check by hand: Run the check with level AAA turned on and look at text over images by eye.

HelpsLow visionColor blindness

1.4.10Level AA

Reflow

Content must fit a 320 CSS pixel wide viewport without horizontal scrolling (data tables, maps and similar content are exceptions). This is what 400 percent zoom looks like on a laptop.

Fails when: A fixed 1200px wide layout that forces people who zoom to scroll sideways on every line.

Check by hand: Set the browser window to 1280px wide and zoom to 400 percent, or emulate a 320px wide screen, and read the whole page.

HelpsLow vision

1.4.11Level AA

Non-text Contrast

Parts of controls (input borders, checkbox outlines, focus rings) and meaningful graphics (chart lines, icons) need 3:1 contrast against what is next to them.

Fails when: A text field whose only visible border is #e0e0e0 on white.

Check by hand: Use a color picker on field borders, icon strokes, chart lines and focus indicators, and check each one against its neighbor color.

HelpsLow visionColor blindness

1.4.12Level AA

Text Spacing

When people increase line height to 1.5, paragraph spacing to 2 times the font size, letter spacing to 0.12 and word spacing to 0.16, no content may be cut off or overlap.

Fails when: A button with a fixed height where text clips when letter spacing is increased.

Check by hand: Apply a text spacing bookmarklet or user stylesheet with those values and look for clipped or overlapping text.

HelpsLow visionCognitive and learning

1.4.13Level AA

Content on Hover or Focus

Tooltips and popovers that appear on hover or focus must be dismissable with Escape, stay open while the pointer moves over them, and stay until the user moves away.

Fails when: A tooltip that disappears when the mouse moves onto it, so people using screen magnifiers can never read it.

Check by hand: Hover and focus every tooltip, move the pointer onto it, and press Escape. It should stay readable and close only when asked.

HelpsLow visionCognitive and learning

2. Operable

Everything must work with a keyboard, a mouse, a touch screen, a switch or a voice command, with enough time, nothing that flashes dangerously, and a clear way to find where you are.

2.1.1Level A

Keyboard

Everything you can do with a mouse must also work with a keyboard alone. Use real buttons and links, which handle Enter and Space for free.

Fails when: A <div onclick="save()"> that a keyboard can neither focus nor activate.

a11ymedic checks: keyboard-click-handler link-as-button

Also check by hand: Put the mouse away and complete every task on the page with Tab, Shift+Tab, Enter, Space and the arrow keys.

HelpsKeyboard onlyScreen reader usersMotor and dexterity

2.1.2Level A

No Keyboard Trap

If focus can move into a component with the keyboard, it must be able to move out again.

Fails when: An embedded video player or code editor that swallows the Tab key so focus never leaves it.

Check by hand: Tab into every widget, embed and modal, then try to Tab and Escape out of it.

HelpsKeyboard only

2.1.4Level A

Character Key Shortcuts

Single key shortcuts (a letter, number or symbol with no modifier) must be possible to turn off or remap, or work only when the related part has focus.

Fails when: A web mail app where pressing "d" deletes a message, which fires when a voice control user dictates a word.

Check by hand: List every keyboard shortcut. Any shortcut without Ctrl, Alt or Cmd needs a setting to disable or change it.

HelpsKeyboard onlyMotor and dexterity

2.2.1Level A

Timing Adjustable

If there is a time limit, users must be able to turn it off, adjust it or extend it, with a warning before time runs out.

Fails when: <meta http-equiv="refresh" content="30"> reloading the page every 30 seconds while someone is still reading.

a11ymedic checks: meta-refresh

Also check by hand: Look for session timeouts and countdowns. Check that users get a warning and can ask for more time with a single action.

HelpsCognitive and learningMotor and dexterity

2.2.2Level A

Pause, Stop, Hide

Anything that moves, blinks, scrolls or auto updates for more than 5 seconds needs a way to pause, stop or hide it.

Fails when: An auto advancing carousel with no pause button.

a11ymedic checks: autoplay-media blink-marquee motion-reduced

Also check by hand: Watch the page for 10 seconds without touching it. Everything that moves on its own needs a visible pause control.

HelpsCognitive and learning

2.3.1Level A

Three Flashes or Below Threshold

Nothing may flash more than 3 times in any one second. Flashing can trigger seizures.

Fails when: A promo video with a strobe effect that flashes 6 times per second.

Check by hand: Review videos and animations for flashing. When in doubt, remove the effect: there is no safe way to warn about it afterwards.

HelpsCognitive and learning

2.3.3Level AAA

Animation from Interactions

Motion triggered by interaction (parallax, zooming transitions, large slides) must be possible to turn off. Respect the prefers-reduced-motion setting.

Fails when: A page transition that slides the whole screen even when the operating system is set to reduce motion.

a11ymedic checks: motion-reduced

Also check by hand: Turn on the reduce motion setting of your operating system and use the site. Large movements should stop or become simple fades.

HelpsCognitive and learning

2.4.1Level A

Bypass Blocks

Provide a way to skip repeated blocks such as the header and navigation: a skip link, landmarks, or headings.

Fails when: A site with 40 navigation links before the content and no skip link or <main> element.

a11ymedic checks: bypass skip-link

Also check by hand: Load the page and press Tab once. A "Skip to content" link should appear and move focus to the main content.

HelpsKeyboard onlyScreen reader users

2.4.2Level A

Page Titled

Every page needs a <title> that describes its topic or purpose. It is the first thing a screen reader announces.

Fails when: Every page of a single page app keeps the title "React App".

a11ymedic checks: document-title

Also check by hand: Open several pages in tabs and read the titles. Each should be unique and put the specific part first.

HelpsScreen reader usersCognitive and learning

2.4.3Level A

Focus Order

Keyboard focus must move in an order that keeps the meaning. Positive tabindex values and CSS reordering often break this.

Fails when: tabindex="3" on a footer link, so it receives focus before the main form.

a11ymedic checks: tabindex

Also check by hand: Tab through the page and watch the focus. It should follow the visual reading order, and dialogs should receive focus when they open.

HelpsKeyboard onlyScreen reader users

2.4.4Level A

Link Purpose (In Context)

The purpose of each link must be clear from its text, or from its text together with the sentence or list item around it.

Fails when: Ten links on a page that all say "Read more".

a11ymedic checks: area-alt link-name link-text-generic

Also check by hand: Open the list of links in a screen reader (or read only the link texts) and check that each one makes sense on its own.

HelpsScreen reader usersCognitive and learning

2.4.5Level AA

Multiple Ways

Offer more than one way to find a page in a set of pages: navigation plus search, a site map, or a table of contents.

Fails when: A documentation site where the only way to reach a page is a deep nested menu.

Check by hand: Pick a deep page and try to reach it in two different ways from the home page.

HelpsCognitive and learningLow vision

2.4.6Level AA

Headings and Labels

Headings and labels must describe the topic or purpose of what follows. An empty or vague heading does not help.

Fails when: An <h2> that contains only an icon, or a field labeled "Field 1".

a11ymedic checks: page-has-heading-one empty-heading

Also check by hand: Read only the headings of the page in order. They should work as a table of contents.

HelpsCognitive and learningScreen reader users

2.4.7Level AA

Focus Visible

Keyboard focus must be visible. Never remove the outline without a replacement style. Use :focus-visible to show it only for keyboard users.

Fails when: *:focus outline: none in a reset stylesheet, with no other focus style anywhere.

a11ymedic checks: focus-visible

Also check by hand: Tab through the page. You should always be able to see which element has focus, on every background color.

HelpsKeyboard onlyLow vision

2.4.11Level AANew in 2.2

Focus Not Obscured (Minimum)

When an element receives keyboard focus, it must not be completely hidden by sticky headers, cookie banners, chat widgets or other content the author added.

Fails when: A sticky footer bar that covers the focused link when tabbing near the bottom of the screen.

Check by hand: Tab through a long page with every sticky header, footer and banner visible, and check that the focused element is never fully covered.

HelpsKeyboard onlyLow vision

2.5.1Level A

Pointer Gestures

Anything that needs a multi point or path based gesture (pinch, two finger swipe, drawing a shape) must also work with a single tap or click.

Fails when: A map that can only be zoomed with a pinch gesture and has no plus and minus buttons.

Check by hand: Use the feature with one finger or a mouse click only, no dragging paths and no multi touch.

HelpsMotor and dexterity

2.5.2Level A

Pointer Cancellation

Actions should fire on the up event (click), not the down event, so people can slide off a control to cancel a mistaken press.

Fails when: A delete button that fires on mousedown, so a slip of the hand deletes the item.

Check by hand: Press a control, keep the button held, move the pointer away and release. Nothing should happen.

HelpsMotor and dexterity

2.5.3Level A

Label in Name

When a control has visible text, its accessible name must contain that text, ideally at the start. Voice control users say what they see.

Fails when: A button that shows "Search" but has aria-label="Find products", so saying "click Search" does nothing.

a11ymedic checks: label-in-name

Also check by hand: For each button and link with an aria-label, compare the label with the visible text. The visible words should appear in the label.

HelpsMotor and dexterityScreen reader users

2.5.4Level A

Motion Actuation

Features triggered by shaking or tilting the device must also have a regular control, and the motion trigger must be possible to turn off.

Fails when: "Shake to undo" with no undo button.

Check by hand: Find every feature that uses device motion and check for a button that does the same thing.

HelpsMotor and dexterity

2.5.7Level AANew in 2.2

Dragging Movements

Anything you can do by dragging must also be possible with single clicks or taps, such as up and down buttons or a menu to move an item.

Fails when: A kanban board where cards can only be moved between columns by dragging.

Check by hand: Try every drag and drop interaction with clicks only. Sliders should also accept clicks on the track or arrow keys.

HelpsMotor and dexterity

2.5.8Level AANew in 2.2

Target Size (Minimum)

Click and tap targets must be at least 24 by 24 CSS pixels, or have enough space that a 24 pixel circle centered on them does not touch another target. Links inside sentences are exempt.

Fails when: Three 16 by 16 pixel social icons placed 4 pixels apart.

a11ymedic checks: target-size

Also check by hand: Without layout, size depends on CSS a tool may not see. Run the check in a real browser (overlay or headless) or measure small icons in developer tools.

HelpsMotor and dexterityLow vision

3. Understandable

Text and controls must behave in a predictable way: the page declares its language, nothing changes by surprise, and forms explain what they need and how to fix a mistake.

3.1.1Level A

Language of Page

The <html> element needs a valid lang attribute so screen readers pick the right voice and pronunciation, and browsers translate and hyphenate correctly.

Fails when: <html> with no lang, so a Portuguese page is read with English pronunciation.

a11ymedic checks: html-has-lang html-lang-valid

Also check by hand: Check that the lang value matches the language the page is actually written in, especially on translated pages.

HelpsScreen reader usersCognitive and learning

3.1.2Level AA

Language of Parts

Passages in a different language from the page need their own lang attribute.

Fails when: A French quote on an English page with no lang="fr", read aloud with English rules.

a11ymedic checks: valid-lang

Also check by hand: Look for quotes, product names in other languages and language switchers, and give each one the correct lang.

HelpsScreen reader users

3.2.1Level A

On Focus

Moving focus to an element must not cause a big change on its own, such as opening a new window or submitting a form.

Fails when: A field that opens a popup window as soon as it receives focus.

Check by hand: Tab through the page slowly. Focus alone should never submit, navigate or open something.

HelpsCognitive and learningKeyboard only

3.2.2Level A

On Input

Changing a setting (selecting an option, checking a box) must not cause an unexpected change of context unless the user was told in advance.

Fails when: A country <select> that navigates to another site as soon as an option is chosen with the arrow keys.

Check by hand: Change every select, radio and checkbox with the keyboard. Nothing should navigate or submit until the user presses a button.

HelpsCognitive and learningScreen reader users

3.2.3Level AA

Consistent Navigation

Navigation that repeats on several pages must appear in the same relative order each time.

Fails when: A main menu whose items change order from one section of the site to another.

Check by hand: Compare the header and navigation on a few different page templates.

HelpsCognitive and learningLow vision

3.2.4Level AA

Consistent Identification

Components with the same function must be labeled the same way across pages.

Fails when: A search button labeled "Search" on one page and "Find" on another.

Check by hand: List common controls (search, cart, login, close) and check that their names and icons match everywhere.

HelpsCognitive and learningScreen reader users

3.2.6Level ANew in 2.2

Consistent Help

If help options (contact details, a chat, a help link) appear on several pages, they must be in the same relative place each time.

Fails when: A "Contact us" link in the header on most pages but in the footer on the checkout pages.

Check by hand: Visit several page templates and check that help links and contact options keep the same position.

HelpsCognitive and learning

3.3.1Level A

Error Identification

When an input error is detected, identify the field and describe the error in text.

Fails when: A form that only shakes and turns red when submitted with an empty required field.

Check by hand: Submit each form empty and with wrong values. Each error should name the field and appear as text, linked with aria-describedby.

HelpsScreen reader usersCognitive and learningColor blindness

3.3.2Level A

Labels or Instructions

Fields need visible labels or instructions, including required formats. A placeholder alone is not a label because it disappears while typing.

Fails when: A date field with only placeholder="Date" and no hint about the expected format.

a11ymedic checks: label

Also check by hand: Read each form without filling it. You should know what every field wants and which ones are required.

HelpsCognitive and learningScreen reader users

3.3.3Level AA

Error Suggestion

When you know how to fix an input error, tell the user, unless that would compromise security.

Fails when: "Invalid date" instead of "Enter the date as DD/MM/YYYY, for example 05/09/2026".

Check by hand: Trigger each validation error and check that the message says how to fix it, not only that something is wrong.

HelpsCognitive and learning

3.3.4Level AA

Error Prevention (Legal, Financial, Data)

For submissions with legal or financial effects, or that change stored data, let users review, confirm, or undo before it is final.

Fails when: A one click button that transfers money with no confirmation step and no way to cancel.

Check by hand: Walk through checkout, payment and account deletion flows and look for a review step, a confirmation or an undo.

HelpsCognitive and learningMotor and dexterity

3.3.7Level ANew in 2.2

Redundant Entry

Do not ask for the same information twice in one process. Fill it in automatically or let the user select it, unless re-entry is essential.

Fails when: A checkout that asks for the shipping address and then asks for the same address again for billing with no "same as shipping" option.

Check by hand: Go through each multi step flow and note every field you type twice.

HelpsCognitive and learningMotor and dexterity

3.3.8Level AANew in 2.2

Accessible Authentication (Minimum)

Logging in must not depend on a memory or puzzle test, such as transcribing characters, unless there is an alternative. Allow paste and password managers.

Fails when: A password field with onpaste="return false", which breaks password managers.

a11ymedic checks: paste-blocked

Also check by hand: Log in using a password manager and by pasting a password and a one time code. Check that any puzzle has an accessible alternative.

HelpsCognitive and learning

4. Robust

The code must expose the correct name, role and state of every part so browsers and assistive technologies, today and tomorrow, can present it reliably.

4.1.2Level A

Name, Role, Value

Every control needs an accessible name, the correct role, and states that update when they change (expanded, checked, selected). Native HTML elements do this for you.

Fails when: An icon only <button> with an SVG and no text, announced as just "button".

a11ymedic checks: input-image-alt area-alt button-name link-name aria-dialog-name aria-widget-name label duplicate-id aria-valid-role aria-valid-attr aria-valid-attr-value aria-required-attr aria-hidden-focus aria-hidden-body aria-prohibited-label presentation-role-conflict nested-interactive keyboard-click-handler link-as-button frame-title frame-title-unique

Also check by hand: Use a screen reader on custom widgets (menus, tabs, accordions) and check that states such as expanded and selected are announced when they change.

HelpsScreen reader usersKeyboard only

4.1.3Level AA

Status Messages

Status updates that appear without moving focus ("Saved", "3 results", "Added to cart") must be announced, usually with role="status" or aria-live.

Fails when: An "Item added to cart" toast that screen readers never announce.

Check by hand: With a screen reader running, trigger each toast, counter and inline update, and listen for an announcement.

HelpsScreen reader users