WCAG 2.1 AA Complete Checklist

Every Web Content Accessibility Guidelines 2.1 Level AA success criterion — explained in plain English with practical guidance for developers and designers.

Scan Your Site Free →

What is WCAG 2.1 AA?

The Web Content Accessibility Guidelines (WCAG) 2.1 are the international standard for web accessibility, published by the W3C. Level AA is the benchmark required for ADA compliance, Section 508, and most international laws — including the ADA Title II deadline for U.S. government-adjacent websites.

WCAG 2.1 AA builds on Level A with 17 additional criteria, covering areas like color contrast, text resizing, focus visibility, and captions for live audio. Failing to meet these criteria exposes your organization to legal risk and locks out millions of users.

50
Total AA Criteria
30
Level A Criteria
20
Level AA Criteria
4
POUR Principles

Use this checklist as a reference during development, QA, or legal review. Click any criterion to expand its explanation and actionable guidance. Then scan your site free to see exactly which criteria your pages pass or fail.

Jump to Principle

👁️

Principle 1: Perceivable

Information and UI components must be presentable to users in ways they can perceive.

1.1 Text Alternatives
1.1.1 Non-text Content A

All non-text content (images, icons, charts, audio controls) must have a text alternative that serves the equivalent purpose. Decorative images use empty alt="". Complex images (charts, graphs) need extended descriptions.

Developer tip: Every <img> needs an alt attribute. If the image conveys information, describe it. If it's purely decorative, use alt="". Never omit the attribute entirely.
1.2 Time-based Media
1.2.1 Audio-only and Video-only (Prerecorded) A

Prerecorded audio-only content must have a text transcript. Prerecorded video-only content must have either an audio description or a text alternative.

Developer tip: For podcast audio, provide a full transcript. For silent video walkthroughs, add descriptive text or voiceover.
1.2.2 Captions (Prerecorded) A

Captions are required for all prerecorded audio content in synchronized media (video + audio). Auto-generated captions alone do not meet this requirement unless they are accurate.

Developer tip: Use WebVTT (.vtt) or SRT caption files with your <video> element's <track kind="captions">.
1.2.3 Audio Description or Media Alternative (Prerecorded) A

Prerecorded video with audio must have an audio description or a full text alternative that describes the visual content conveyed.

Developer tip: If the dialogue already fully describes the visual action (e.g., a screencast with narration), a text transcript may suffice.
1.2.4 Captions (Live) AA

Live audio content in synchronized media must have real-time captions. This applies to live webinars, streams, and broadcasts.

Developer tip: Use a live captioning service or CART (Communication Access Realtime Translation) for live events.
1.2.5 Audio Description (Prerecorded) AA

Audio descriptions must be provided for all prerecorded video content in synchronized media. This is in addition to 1.2.3 — at AA, a text alternative is not sufficient; an actual audio description track is required.

Developer tip: Add an audio description track via <track kind="descriptions"> or provide an alternate version with descriptions baked into the audio.
1.3 Adaptable
1.3.1 Info and Relationships A

Information, structure, and relationships conveyed through presentation must also be available programmatically (via HTML semantics or ARIA). A heading that looks bold shouldn't just be a <span style="font-weight:bold"> — it needs to be an <h1>–<h6>.

Developer tip: Use semantic HTML elements: <nav>, <main>, <header>, <table> with <th scope>, <label> for form fields.
1.3.2 Meaningful Sequence A

When the sequence of content affects meaning, the correct reading order must be determinable from the source code — not just from the visual layout. CSS positioning shouldn't reorder logical reading flow.

Developer tip: Tab through your page in DOM order (not visual order). The experience should make logical sense.
1.3.3 Sensory Characteristics A

Instructions must not rely solely on sensory characteristics like shape, color, size, visual location, or sound. "Click the green button" or "see the diagram on the right" are not accessible instructions.

Developer tip: Always combine sensory cues with text labels: "Click the Submit button (green)" or reference elements by their label text.
1.3.4 Orientation AA

Content must not restrict its view and operation to a single display orientation (portrait or landscape) unless the specific orientation is essential for the content (e.g., a piano app).

Developer tip: Avoid CSS that locks orientation. Test in both portrait and landscape on mobile devices.
1.3.5 Identify Input Purpose AA

For form inputs that collect personal information, the purpose can be programmatically determined using HTML autocomplete attributes. This enables assistive technologies to present custom labels and icons.

Developer tip: Add autocomplete values like name, email, tel, street-address to relevant input fields.
1.4 Distinguishable
1.4.1 Use of Color A

Color must not be the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element. Error states, required fields, and links must have additional indicators.

Developer tip: Add underlines to links, use icons or asterisks for required fields, and use text labels alongside color-coded status indicators.
1.4.2 Audio Control A

If audio plays automatically for more than 3 seconds, users must be able to pause/stop it or control the volume independently of the system volume.

Developer tip: Never autoplay audio. If you must, provide a visible pause button within the first few tab stops.
1.4.3 Contrast (Minimum) AA

Text and images of text must have a contrast ratio of at least 4.5:1 against their background. Large text (18pt / 14pt bold) requires 3:1. Decorative text and logotypes are exempt.

Developer tip: Use a contrast checker (WebAIM, Figma plugins). Gray-on-white text is the most common failure. Aim for 4.5:1 minimum; 7:1 is ideal.
1.4.4 Resize Text AA

Text must be resizable up to 200% without assistive technology and without loss of content or functionality. Pages that break layout or truncate content when browser zoom is set to 200% fail this criterion.

Developer tip: Use relative units (rem, em) for font sizes. Test at 200% browser zoom. Fixed-height containers with overflow:hidden are a common culprit.
1.4.5 Images of Text AA

If the same visual presentation can be achieved with real text, images of text must not be used — except for logotypes and situations where a particular visual presentation is essential.

Developer tip: Replace image-based banners with CSS-styled text. Use web fonts for custom typography instead of rasterizing text into images.
1.4.10 Reflow AA

Content must reflow to a single column when the viewport is narrowed to 320 CSS pixels without requiring horizontal scrolling (except for content that inherently requires two-dimensional layout, like maps or data tables).

Developer tip: Test at 320px viewport width. Use responsive design, fluid grids, and max-width containers. Avoid fixed-width layouts.
1.4.11 Non-text Contrast AA

UI components (buttons, inputs, checkboxes, focus indicators) and meaningful graphical objects must have a 3:1 contrast ratio against adjacent colors.

Developer tip: Check form field borders, icon colors, and custom button outlines. A light gray checkbox border on white background typically fails.
1.4.12 Text Spacing AA

No content or functionality is lost when users override: line height to 1.5×, letter spacing to 0.12em, word spacing to 0.16em, and spacing after paragraphs to 2em.

Developer tip: Use the Text Spacing bookmarklet to test. Avoid fixed-height containers around text blocks.
1.4.13 Content on Hover or Focus AA

Content that appears on hover or keyboard focus (tooltips, dropdowns) must be: (1) dismissible without moving focus, (2) hoverable over the appearing content, and (3) persistent until dismissed.

Developer tip: Ensure tooltips don't disappear when the mouse moves from the trigger to the tooltip itself. Allow Esc to dismiss hover-triggered content.
⌨️

Principle 2: Operable

UI components and navigation must be operable.

2.1 Keyboard Accessible
2.1.1 Keyboard A

All functionality must be operable via keyboard. No keyboard traps. Custom interactive widgets (carousels, date pickers, custom dropdowns) must implement keyboard interaction patterns.

Developer tip: Test your entire site without a mouse. Use Tab, Enter, Space, arrow keys. Follow ARIA APG patterns for custom components.
2.1.2 No Keyboard Trap A

If keyboard focus moves to a component, focus can be moved away using standard key presses (Tab, Esc). If non-standard keys are needed, users must be advised.

Developer tip: Modals/dialogs should trap focus intentionally (within the dialog) but must provide a close mechanism via Esc. After closing, return focus to the trigger.
2.1.4 Character Key Shortcuts A

If single-character keyboard shortcuts are implemented, users must be able to turn them off, remap them to a non-character key, or activate them only when a UI component is focused.

Developer tip: Single-key shortcuts (like "G" to go home) conflict with screen reader shortcuts. Prefer modifier-key shortcuts (Ctrl+Alt+H) or disable them for AT users.
2.2 Enough Time
2.2.1 Timing Adjustable A

When time limits are set, users must be able to: turn off the limit, adjust it (at least 10× default), or be warned and given at least 20 seconds to extend it.

Developer tip: Session timeouts, auto-advancing carousels, and auto-refreshing pages all need user controls. Give at least a 20-second warning with an extension option.
2.2.2 Pause, Stop, Hide A

Moving, blinking, scrolling, or auto-updating content that lasts over 5 seconds must have controls to pause, stop, or hide it.

Developer tip: Add pause buttons to carousels, auto-playing videos, and ticker animations. CSS animations that loop indefinitely may need prefers-reduced-motion media queries.
2.3 Seizures and Physical Reactions
2.3.1 Three Flashes or Below Threshold A

Pages must not contain anything that flashes more than three times per second, unless the flash is below the general flash and red flash thresholds. Flashing content can trigger photosensitive seizures.

Developer tip: Avoid strobing animations. Use prefers-reduced-motion to disable animations for sensitive users. Test with the PEAT tool.
2.4 Navigable
2.4.1 Bypass Blocks A

A mechanism must be available to bypass blocks of content that are repeated on multiple pages (e.g., navigation menus). This is typically a "Skip to main content" link.

Developer tip: Add a visually-hidden skip link as the first focusable element: <a class="skip-link" href="#main">Skip to main content</a>. Show it on focus.
2.4.2 Page Titled A

Web pages must have titles that describe the topic or purpose. Each page in a multi-page site should have a unique, descriptive title.

Developer tip: Format: "Page Name — Site Name". Avoid generic titles like "Home" or "Page 1". Update titles on client-side navigation in SPAs.
2.4.3 Focus Order A

If a web page can be navigated sequentially, the focus order must preserve meaning and operability. Tab order should follow the logical reading order of the page.

Developer tip: Avoid using positive tabindex values (they break natural DOM order). Use tabindex="0" to include elements and tabindex="-1" to exclude them from tab order.
2.4.4 Link Purpose (In Context) A

The purpose of each link must be determinable from the link text alone or from the link text plus its programmatically determined context (surrounding sentence, list item, table cell, or heading).

Developer tip: Avoid "click here", "read more", "learn more" as standalone link text. Use aria-label or visually-hidden text to differentiate repeated "Read more" links.
2.4.5 Multiple Ways AA

More than one way must be available to locate a web page within a set of pages (except where the page is a step in a process). Examples: site map, search, navigation menu, related links.

Developer tip: Ensure your site has at least two of: site-wide navigation, search, sitemap, breadcrumbs, or table of contents.
2.4.6 Headings and Labels AA

Headings and labels must describe the topic or purpose. Vague headings like "More" or "Click Here" and unlabeled form fields are failures.

Developer tip: Every form field needs a visible <label> or an aria-label. Headings should clearly describe the following section content.
2.4.7 Focus Visible AA

Any keyboard-operable interface must have a visible focus indicator. Removing the default browser focus outline without a custom replacement is a failure.

Developer tip: Never use outline: none without replacing it. Use :focus-visible to show focus rings only for keyboard users while hiding them for mouse clicks.
2.5 Input Modalities
2.5.1 Pointer Gestures A

All functionality that uses multi-point or path-based gestures (pinch-to-zoom, swipe) must also be operable with a single pointer (tap or click), unless the gesture is essential.

Developer tip: Carousels that only work by swiping need arrow buttons. Map zoom that requires pinch needs +/- buttons.
2.5.2 Pointer Cancellation A

For single-pointer operations, at least one of: no down-event trigger, abort/undo available, up-event reversal, or the down-event trigger is essential.

Developer tip: Trigger actions on mouseup/touchend, not mousedown/touchstart. This lets users cancel by moving the pointer away before releasing.
2.5.3 Label in Name A

For UI components with visible text labels, the accessible name must contain the visible label text. This enables voice control users to activate controls by saying the visible label.

Developer tip: If a button says "Submit" visually but has aria-label="Send form", a voice user saying "Click Submit" won't be able to activate it. The accessible name must include the visible text.
2.5.4 Motion Actuation A

Functionality triggered by device motion (shaking, tilting) must also be operable via UI components, and users must be able to disable the motion response.

Developer tip: If you use the DeviceMotion API, always provide a UI button alternative and a setting to disable motion triggers.
💡

Principle 3: Understandable

Information and the operation of the UI must be understandable.

3.1 Readable
3.1.1 Language of Page A

The default human language of each web page must be programmatically determinable. Screen readers use this to select the correct speech engine and pronunciation rules.

Developer tip: Always set <html lang="en"> (or the appropriate language code). Missing lang is one of the most common and easily-fixed failures.
3.1.2 Language of Parts AA

When content on a page switches language (a French quote on an English page), that passage must have a lang attribute identifying the language change.

Developer tip: <blockquote lang="fr">…</blockquote>. Proper nouns, technical terms, and common foreign words that have been adopted into the language are exempt.
3.2 Predictable
3.2.1 On Focus A

When a UI component receives focus, it must not initiate a change of context. Tabbing to a dropdown should not automatically submit a form or navigate to a new page.

Developer tip: Avoid onFocus handlers that trigger navigation or major UI changes. Context changes should require explicit user action (Enter, click).
3.2.2 On Input A

Changing the setting of a UI component must not automatically cause a change of context unless the user has been advised beforehand. Selecting a value in a <select> should not immediately navigate away.

Developer tip: Don't use onChange on select elements to navigate. Instead, add a "Go" button. Or warn users: "Selecting a country will reload the page."
3.2.3 Consistent Navigation AA

Navigation mechanisms that appear on multiple pages must occur in the same relative order each time, unless a change is initiated by the user.

Developer tip: Don't reorder nav items on different pages. The "Contact" link should always be in the same position in the navigation relative to other items.
3.2.4 Consistent Identification AA

Components with the same functionality across a set of pages must be consistently identified. A search field called "Search" on one page and "Find" on another violates this criterion.

Developer tip: Use consistent accessible names for repeated components. The same icon button should always have the same label across pages.
3.3 Input Assistance
3.3.1 Error Identification A

If an input error is automatically detected, the item in error must be identified and the error described to the user in text. Red border alone is not sufficient.

Developer tip: Use aria-describedby to link error messages to the input. Announce errors with aria-live="polite" or by moving focus to the first error.
3.3.2 Labels or Instructions A

Labels or instructions must be provided when content requires user input. Format hints like "MM/DD/YYYY" or required field indicators must be present before submission.

Developer tip: Show format requirements before users submit (not just after errors). Use placeholder as supplemental, not as a label — placeholders disappear when typing begins.
3.3.3 Error Suggestion AA

If an input error is detected and suggestions for correction are known, those suggestions must be provided to the user — unless doing so would jeopardize security.

Developer tip: Instead of "Invalid email", say "Email must include @ and a domain (e.g., name@example.com)". Specific error messages reduce user frustration and support calls.
3.3.4 Error Prevention (Legal, Financial, Data) AA

For pages that cause legal commitments, financial transactions, or data submissions, at least one of the following must be true: reversible, checked for errors, or confirmable before submission.

Developer tip: Add confirmation dialogs for purchases, deletion actions, and form submissions. Provide a review step before final submission in multi-step forms.
🔩

Principle 4: Robust

Content must be robust enough to be reliably interpreted by a wide variety of user agents, including assistive technologies.

4.1 Compatible
4.1.1 Parsing A

HTML must have complete start and end tags, elements nested according to spec, no duplicate attributes, and unique IDs. Malformed HTML causes AT to fail silently.

Developer tip: Run your HTML through the W3C Validator. Duplicate id attributes and improperly nested elements are common sources of AT failures.
4.1.2 Name, Role, Value A

All UI components must have accessible names, roles, and values that can be programmatically determined and set. Custom widgets built from <div> elements without ARIA are the most common failure.

Developer tip: Use native HTML elements whenever possible (<button>, <input>, <select>). For custom widgets, apply role, aria-label/aria-labelledby, and state attributes (aria-expanded, aria-checked).
4.1.3 Status Messages AA

Status messages (success notifications, errors, loading indicators, search result counts) must be programmatically determinable through role or properties so they can be announced by AT without receiving focus.

Developer tip: Use aria-live="polite" for non-urgent status messages and role="alert" (or aria-live="assertive") for errors. Toast notifications, form submission confirmations, and cart update counts all need live regions.

See How Your Site Scores

Don't guess — scan your site free and get an instant WCAG 2.1 AA compliance report. Find out exactly which of these 50 criteria your pages pass or fail.

Scan My Site Free →