| A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z | AA | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | |||||||||||||||||||||||||||
2 | WCAG 2.1 AA Audit Framework | ||||||||||||||||||||||||||
3 | ADA Title II Compliance | State and Local Government Entities | Hounder University | hounder.co | ||||||||||||||||||||||||||
4 | HOW TO USE: Test each criterion against your target pages or components. Mark Pass, Fail, or N/A. Rate every failure: Critical (blocks task completion), High (major barrier), Medium (degraded experience), Low (minor issue). Every Fail row should become a line item in your Accessibility Remediation Log. | ||||||||||||||||||||||||||
5 | Organization: | Auditor: | |||||||||||||||||||||||||
6 | Audit Date: | Tool(s) Used: | |||||||||||||||||||||||||
7 | Audit Type: | Automated Only ☐ Manual + Automated ☐ Full (including user testing) ☐ | |||||||||||||||||||||||||
8 | Criterion | Principle | Success Criterion Description | Common Failure | Pass | Fail | N/A | Severity (if Fail) | Page / Component / URL | Assigned To | Notes | ||||||||||||||||
9 | PERCEIVABLE | Users must be able to perceive all information and UI components. | ||||||||||||||||||||||||||
10 | 1.1.1 | Perceivable | Non-text content has a text alternative (alt text, label, caption) that serves equivalent purpose. | Missing or generic alt text (alt='image' or alt='photo') | Pass | N/A | Fail | Critical | Test with: axe, WAVE, manual screen reader check | ||||||||||||||||||
11 | 1.2.2 | Perceivable | Captions provided for all prerecorded audio in synchronized media. | No closed captions on video content | Automated captions don't count — must be accurate | ||||||||||||||||||||||
12 | 1.2.3 | Perceivable | Audio description or media alternative provided for prerecorded video. | No description of visual-only information in video | |||||||||||||||||||||||
13 | 1.2.5 | Perceivable | Audio descriptions provided for all prerecorded video in synchronized media. | Video narration doesn't describe on-screen visuals | |||||||||||||||||||||||
14 | 1.3.1 | Perceivable | Information, structure, and relationships are programmatically determinable. | Tables without headers; lists coded as plain paragraphs | Check heading hierarchy and landmark regions | ||||||||||||||||||||||
15 | 1.3.2 | Perceivable | Correct reading sequence determinable when presentation affects meaning. | CSS-repositioned content breaks logical reading order | Tab through page without CSS to verify order | ||||||||||||||||||||||
16 | 1.3.3 | Perceivable | Instructions don't rely solely on shape, color, size, or position. | "Click the green button" or "see the form on the right" as sole instruction | |||||||||||||||||||||||
17 | 1.3.4 | Perceivable | Content doesn't restrict view to a single display orientation. | Page locked to portrait or landscape only | |||||||||||||||||||||||
18 | 1.3.5 | Perceivable | Purpose of inputs collecting personal data can be programmatically determined. | Form fields missing autocomplete attributes | Required for name, email, address, phone fields | ||||||||||||||||||||||
19 | 1.4.1 | Perceivable | Color is not the only visual means of conveying information. | Error states shown only by red color with no other indicator | Add icon, text label, or border change | ||||||||||||||||||||||
20 | 1.4.2 | Perceivable | Mechanism to pause or stop audio that plays automatically. | Background audio with no pause/stop/mute control | |||||||||||||||||||||||
21 | 1.4.3 | Perceivable | Text has contrast ratio of at least 4.5:1 (3:1 for large text 18pt+ or 14pt bold). | Light gray text on white; brand colors with insufficient contrast | Test with: WebAIM Contrast Checker | ||||||||||||||||||||||
22 | 1.4.4 | Perceivable | Text resizable up to 200% without loss of content or function. | Content overflows, truncates, or disappears at 200% browser zoom | Test by zooming browser to 200% | ||||||||||||||||||||||
23 | 1.4.5 | Perceivable | Text used instead of images of text where possible. | Headings or buttons rendered as images containing text | |||||||||||||||||||||||
24 | 1.4.10 | Perceivable | Content reflows without horizontal scrolling at 320px viewport width. | Fixed-width layouts requiring horizontal scroll on mobile | Test at 320px viewport width | ||||||||||||||||||||||
25 | 1.4.11 | Perceivable | Non-text UI components have contrast ratio of at least 3:1 against adjacent colors. | Form borders, icon buttons, or focus rings with insufficient contrast | Applies to UI states: focus, hover, active | ||||||||||||||||||||||
26 | 1.4.12 | Perceivable | No loss of content when letter/word/line/paragraph spacing is overridden. | Text truncates or overlaps when spacing increased via browser | Test with bookmarklet or browser extension | ||||||||||||||||||||||
27 | 1.4.13 | Perceivable | Content shown on hover or focus can be dismissed, hovered over, and is persistent. | Tooltips disappear when user moves cursor toward them | |||||||||||||||||||||||
28 | OPERABLE | Users must be able to operate all interface components and navigation. | ||||||||||||||||||||||||||
29 | 2.1.1 | Operable | All functionality operable through keyboard interface without requiring specific timing. | Dropdown menus, modals, or custom components not keyboard accessible | Tab through entire page to test | ||||||||||||||||||||||
30 | 2.1.2 | Operable | Keyboard focus never trapped unless intentionally (with escape mechanism). | Focus trapped inside modal with no way to exit | Test: can you Tab or Esc out of every component? | ||||||||||||||||||||||
31 | 2.1.4 | Operable | Single-character keyboard shortcuts can be turned off, remapped, or activated only on focus. | Single-key shortcuts conflicting with screen reader or voice control commands | |||||||||||||||||||||||
32 | 2.2.1 | Operable | Users can turn off, adjust, or extend time limits. | Session timeout with no warning or extension option | 20-hour exception for real-time events | ||||||||||||||||||||||
33 | 2.2.2 | Operable | Users can pause, stop, or hide moving/blinking/auto-updating content. | Auto-advancing carousels with no pause; auto-refreshing data feeds | |||||||||||||||||||||||
34 | 2.3.1 | Operable | No content flashes more than three times per second. | Animated GIFs, video intros, or transitions exceeding flash threshold | |||||||||||||||||||||||
35 | 2.4.1 | Operable | Mechanism to skip blocks of repeated content. | No skip navigation link; no landmark regions for screen reader users | Add skip-to-main-content link at top of page | ||||||||||||||||||||||
36 | 2.4.2 | Operable | Web pages have titles that describe topic or purpose. | Pages titled "Home" or using site name alone with no page context | |||||||||||||||||||||||
37 | 2.4.3 | Operable | Focus order preserves meaning and operability. | Tab order jumps unpredictably; focus moves to bottom of page on modal open | |||||||||||||||||||||||
38 | 2.4.4 | Operable | Link purpose determinable from link text alone or context. | "Click here" or "Read more" links with no surrounding context that clarifies purpose | |||||||||||||||||||||||
39 | 2.4.5 | Operable | More than one way to locate a page within a set of pages. | No site search, sitemap, or secondary navigation | Exception: page is a step in a process | ||||||||||||||||||||||
40 | 2.4.6 | Operable | Headings and labels are descriptive. | Generic headings like "Section 1"; unlabeled or vague form fields | |||||||||||||||||||||||
41 | 2.4.7 | Operable | Keyboard-focused components have visible focus indicator. | Focus ring hidden by CSS outline:none or outline:0 | Removal of focus ring is one of the most common failures | ||||||||||||||||||||||
42 | 2.5.1 | Operable | All multipoint or path-based gestures have a single-pointer alternative. | Pinch-zoom, two-finger scroll, or swipe-only interactions with no tap alternative | |||||||||||||||||||||||
43 | 2.5.2 | Operable | Functions triggered on pointer down-event can be aborted or reversed. | Actions completing on mousedown/touchstart with no undo | |||||||||||||||||||||||
44 | 2.5.3 | Operable | Labels visible in UI match or contain the accessible name of the component. | Visible button label differs from programmatic accessible name | Causes failures for voice control users | ||||||||||||||||||||||
45 | 2.5.4 | Operable | Functionality triggered by device motion has UI control alternative and can be disabled. | Shake-to-undo or tilt features with no interface-based alternative | |||||||||||||||||||||||
46 | UNDERSTANDABLE | Information and the operation of the UI must be understandable. | ||||||||||||||||||||||||||
47 | 3.1.1 | Understandable | Default language of page is programmatically determined. | Missing lang attribute on <html> element | Automated tools catch this reliably | ||||||||||||||||||||||
48 | 3.1.2 | Understandable | Language of passages in a different language is identified. | Foreign-language content without lang attribute on containing element | |||||||||||||||||||||||
49 | 3.2.1 | Understandable | Focus does not trigger unexpected context changes. | Page refreshes or navigation triggered just by receiving focus | |||||||||||||||||||||||
50 | 3.2.2 | Understandable | Input does not trigger unexpected context changes without user initiation. | Form submits automatically on selection change with no submit button | |||||||||||||||||||||||
51 | 3.2.3 | Understandable | Navigation is presented consistently across pages. | Primary navigation changes position, order, or labeling between pages | |||||||||||||||||||||||
52 | 3.2.4 | Understandable | Components with same function identified consistently across pages. | Search icon labeled 'Search' on one page and 'Find' on another | |||||||||||||||||||||||
53 | 3.3.1 | Understandable | Input errors are automatically identified and described to users in text. | Form errors shown only by red border or exclamation icon with no text description | |||||||||||||||||||||||
54 | 3.3.2 | Understandable | Labels or instructions provided for user input. | Placeholder text used as only label (disappears on input); no visible field labels | |||||||||||||||||||||||
55 | 3.3.3 | Understandable | Error suggestions provided when input error is detected and known. | "Invalid entry" with no guidance on what format or value is required | |||||||||||||||||||||||
56 | 3.3.4 | Understandable | Submissions causing legal, financial, or data commitments can be checked, confirmed, or reversed. | No review or confirmation screen before irreversible form submission | |||||||||||||||||||||||
57 | ROBUST | Content must be robust enough to be interpreted by assistive technologies. | ||||||||||||||||||||||||||
58 | 4.1.1 | Robust | HTML parses without duplicate IDs, missing start/end tags, or invalid nesting. | Duplicate IDs causing ARIA relationships to break; unclosed elements | Automated tools catch this well | ||||||||||||||||||||||
59 | 4.1.2 | Robust | All UI components have accessible name, role, and state programmatically exposed. | Custom buttons, dropdowns, toggles, tabs, or accordions missing ARIA roles or states | No ARIA is better than bad ARIA — test with screen reader | ||||||||||||||||||||||
60 | 4.1.3 | Robust | Status messages are programmatically determinable without receiving focus. | Success messages, error banners, or loading states not announced to screen readers | Use role='status' or role='alert' or aria-live regions | ||||||||||||||||||||||
61 | |||||||||||||||||||||||||||
62 | |||||||||||||||||||||||||||
63 | |||||||||||||||||||||||||||
64 | |||||||||||||||||||||||||||
65 | |||||||||||||||||||||||||||
66 | |||||||||||||||||||||||||||
67 | |||||||||||||||||||||||||||
68 | |||||||||||||||||||||||||||
69 | |||||||||||||||||||||||||||
70 | |||||||||||||||||||||||||||
71 | |||||||||||||||||||||||||||
72 | |||||||||||||||||||||||||||
73 | |||||||||||||||||||||||||||
74 | |||||||||||||||||||||||||||
75 | |||||||||||||||||||||||||||
76 | |||||||||||||||||||||||||||
77 | |||||||||||||||||||||||||||
78 | |||||||||||||||||||||||||||
79 | |||||||||||||||||||||||||||
80 | |||||||||||||||||||||||||||
81 | |||||||||||||||||||||||||||
82 | |||||||||||||||||||||||||||
83 | |||||||||||||||||||||||||||
84 | |||||||||||||||||||||||||||
85 | |||||||||||||||||||||||||||
86 | |||||||||||||||||||||||||||
87 | |||||||||||||||||||||||||||
88 | |||||||||||||||||||||||||||
89 | |||||||||||||||||||||||||||
90 | |||||||||||||||||||||||||||
91 | |||||||||||||||||||||||||||
92 | |||||||||||||||||||||||||||
93 | |||||||||||||||||||||||||||
94 | |||||||||||||||||||||||||||
95 | |||||||||||||||||||||||||||
96 | |||||||||||||||||||||||||||
97 | |||||||||||||||||||||||||||
98 | |||||||||||||||||||||||||||
99 | |||||||||||||||||||||||||||
100 | |||||||||||||||||||||||||||