Web Accessibility Checklist 2026: Complete WCAG Guide

A practical, item-by-item checklist for building accessible websites. Covers WCAG 2.2, color contrast, keyboard navigation, screen readers, ARIA, and the tools you need to test it all.

Why Accessibility Matters (The Business Case)

Over one billion people worldwide live with some form of disability. That is roughly 16% of the global population. When your website is inaccessible, you are excluding a significant portion of potential users, customers, and contributors.

But accessibility is not just about ethics. It makes financial and legal sense. In the US alone, ADA-related web accessibility lawsuits exceeded 4,000 in 2025. The European Accessibility Act (EAA) went into effect in June 2025, requiring digital products and services across the EU to meet accessibility standards. Non-compliance carries real penalties.

Accessible sites also tend to perform better. Semantic markup improves SEO. Keyboard navigation benefits power users. Caption support helps people watching videos in noisy environments. Accessibility improvements benefit everyone, not just users with disabilities.

The Numbers

According to the WebAIM Million report, 96.3% of home pages had detectable WCAG failures in 2025. The average page had 56.8 errors. Low contrast text, missing alt text, and empty links were the top three issues. These are all straightforward to fix.

WCAG 2.2 Overview: Levels A, AA, AAA

WCAG 2.2 organizes its success criteria into three conformance levels:

Level What It Means When to Target
A Minimum accessibility. Addresses the most severe barriers that prevent access entirely. Absolute baseline. Every site should meet Level A.
AA Reasonable accessibility. Addresses the most common barriers for the widest range of users. The target for most websites and the legal standard in most jurisdictions.
AAA Enhanced accessibility. Addresses additional barriers but may not be achievable for all content types. Government, healthcare, education, and high-impact public services.

WCAG 2.2, released in October 2023, adds nine new success criteria on top of 2.1. The most impactful additions focus on target size (interactive elements must be at least 24x24 CSS pixels at AA), dragging movements (alternatives must exist for drag operations), and focus appearance (focus indicators must meet contrast requirements).

The four guiding principles remain: Perceivable (users can perceive the content), Operable (users can interact with the interface), Understandable (content and UI are comprehensible), and Robust (content works with assistive technologies).

Color Contrast

Insufficient color contrast is the number one accessibility failure on the web. If text does not have enough contrast against its background, users with low vision, color blindness, or even just direct sunlight on their screen will struggle to read it.

WCAG Contrast Requirements

Text Type AA Ratio AAA Ratio
Normal text (under 18pt / 14pt bold) 4.5:1 7:1
Large text (18pt+ / 14pt bold+) 3:1 4.5:1
UI components and icons 3:1 N/A
css — Accessible Color Variables
:root {
  /* These combinations all pass WCAG AA */
  --text-primary: #1a1a2e;    /* On white: 15.4:1 */
  --text-secondary: #4a4a6a;  /* On white: 7.2:1  */
  --text-muted: #6b6b8a;      /* On white: 4.6:1  */
  --bg: #ffffff;

  /* Error state: use icon + text, not just red */
  --error: #d32f2f;           /* On white: 5.9:1  */
  --error-bg: #fef2f2;

  /* Links: underline OR 3:1 contrast vs body text */
  --link: #1a5fb4;            /* On white: 7.1:1, vs body: 3.2:1 */
}

/* Focus indicators: visible and high contrast */
:focus-visible {
  outline: 3px solid #1a5fb4;
  outline-offset: 2px;
}

Need to find accessible color combinations quickly? The Color Picker tool lets you sample and convert colors, and the Color Palette Generator can help you build palettes that meet WCAG requirements from the start.

Keyboard Navigation

Every interactive element on your site must be reachable and operable with a keyboard alone. This is a hard requirement, not a suggestion. Users who rely on keyboard navigation include people with motor disabilities, power users, and screen reader users.

html — Skip Navigation Link
<body>
  <a href="#main-content" class="skip-link">Skip to main content</a>
  <nav>...navigation...</nav>
  <main id="main-content">
    ...page content...
  </main>
</body>
css — Skip Link Styling
.skip-link {
  position: absolute;
  top: -40px;
  left: 0;
  background: #000;
  color: #fff;
  padding: 8px 16px;
  z-index: 10000;
  font-size: 0.875rem;
  transition: top 0.2s;
}

.skip-link:focus {
  top: 0;  /* Visible only when focused */
}
javascript — Accessible Modal with Focus Trap
function openModal(modalEl) {
  modalEl.setAttribute('aria-hidden', 'false');
  modalEl.style.display = 'flex';

  // Store the element that opened the modal
  const previousFocus = document.activeElement;

  // Find all focusable elements inside the modal
  const focusable = modalEl.querySelectorAll(
    'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
  );
  const firstFocusable = focusable[0];
  const lastFocusable = focusable[focusable.length - 1];

  // Focus the first element
  firstFocusable.focus();

  // Trap focus inside the modal
  modalEl.addEventListener('keydown', function trap(e) {
    if (e.key === 'Escape') {
      closeModal(modalEl, previousFocus);
      modalEl.removeEventListener('keydown', trap);
      return;
    }
    if (e.key !== 'Tab') return;

    if (e.shiftKey) {
      if (document.activeElement === firstFocusable) {
        e.preventDefault();
        lastFocusable.focus();
      }
    } else {
      if (document.activeElement === lastFocusable) {
        e.preventDefault();
        firstFocusable.focus();
      }
    }
  });
}

function closeModal(modalEl, previousFocus) {
  modalEl.setAttribute('aria-hidden', 'true');
  modalEl.style.display = 'none';
  previousFocus.focus();  // Return focus to the trigger
}

Semantic HTML

Semantic HTML is the foundation of accessible web development. Screen readers and other assistive technologies rely on HTML semantics to communicate the structure, purpose, and relationships of content to users.

Use the Right Element for the Job

Instead of... Use... Why
<div onclick> <button> Buttons are focusable, activatable with Enter/Space, and announced as buttons by screen readers.
<div class="nav"> <nav> Screen readers can jump directly to navigation landmarks.
<div class="header"> <header> Defines the banner landmark for the page or section.
<div class="main"> <main> Identifies the primary content. Screen readers offer shortcuts to jump to main.
<b> for headings <h1>–<h6> Heading hierarchy enables navigation by heading level. A properly structured heading tree is one of the most important accessibility features.
<div class="list"> <ul>, <ol> Screen readers announce "list, 5 items" and let users skip the entire list.

You can verify your HTML structure and validate landmark regions using QTool's HTML Beautifier, which formats your markup into a readable structure that makes semantic issues obvious.

ARIA Attributes

ARIA (Accessible Rich Internet Applications) provides additional semantics when native HTML elements fall short. However, ARIA should be your last resort, not your first choice.

The Five Rules of ARIA

1) Do not use ARIA if a native HTML element works. 2) Do not change native semantics unless you have to. 3) All interactive ARIA controls must be keyboard-operable. 4) Do not use role="presentation" or aria-hidden="true" on visible focusable elements. 5) All interactive elements must have accessible names.

Essential ARIA Patterns

html — Accessible Custom Toggle
<!-- Bad: div with no semantics -->
<div class="toggle" onclick="toggle()">Dark Mode</div>

<!-- Good: button with ARIA state -->
<button
  role="switch"
  aria-checked="false"
  aria-label="Dark mode"
  onclick="toggleDarkMode(this)"
>
  Dark Mode
</button>

<script>
function toggleDarkMode(btn) {
  const isOn = btn.getAttribute('aria-checked') === 'true';
  btn.setAttribute('aria-checked', String(!isOn));
  document.body.classList.toggle('dark-mode');
}
</script>
html — Live Regions for Dynamic Updates
<!-- Announce search results count to screen readers -->
<div aria-live="polite" aria-atomic="true" class="sr-only" id="search-status">
  <!-- Updated via JavaScript when results change -->
</div>

<script>
function updateSearchResults(results) {
  renderResults(results);
  document.getElementById('search-status').textContent =
    `${results.length} results found`;
}
</script>

<!-- Screen-reader-only class -->
<style>
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}
</style>
html — Accessible Tabs
<div role="tablist" aria-label="Project settings">
  <button role="tab" aria-selected="true" aria-controls="panel-general"
          id="tab-general" tabindex="0">
    General
  </button>
  <button role="tab" aria-selected="false" aria-controls="panel-security"
          id="tab-security" tabindex="-1">
    Security
  </button>
  <button role="tab" aria-selected="false" aria-controls="panel-billing"
          id="tab-billing" tabindex="-1">
    Billing
  </button>
</div>

<div role="tabpanel" id="panel-general" aria-labelledby="tab-general">
  <!-- General settings content -->
</div>
<div role="tabpanel" id="panel-security" aria-labelledby="tab-security" hidden>
  <!-- Security settings content -->
</div>
<div role="tabpanel" id="panel-billing" aria-labelledby="tab-billing" hidden>
  <!-- Billing settings content -->
</div>

Images and Media

html — Image Alt Text Examples
<!-- Informative image: describe what it shows -->
<img src="dashboard.png"
     alt="Analytics dashboard showing 12,847 monthly active users with a 23% increase from last month">

<!-- Functional image (link or button): describe the action -->
<a href="/home">
  <img src="logo.svg" alt="QTool home page">
</a>

<!-- Decorative image: empty alt -->
<img src="divider-pattern.svg" alt="" role="presentation">

<!-- Complex image: use figcaption or aria-describedby -->
<figure>
  <img src="architecture-diagram.svg"
       alt="System architecture diagram"
       aria-describedby="arch-desc">
  <figcaption id="arch-desc">
    The frontend sends API requests to a load balancer,
    which routes traffic to three application servers.
    Each server connects to a shared PostgreSQL database
    and Redis cache cluster.
  </figcaption>
</figure>

Accessible Forms

Forms are where accessibility failures cause the most direct harm. An inaccessible form can prevent a user from purchasing a product, signing up for a service, or completing a required process.

html — Accessible Form Pattern
<form novalidate>
  <div class="field">
    <label for="email">Email address (required)</label>
    <input
      type="email"
      id="email"
      name="email"
      autocomplete="email"
      aria-required="true"
      aria-describedby="email-error"
      aria-invalid="false"
    >
    <p id="email-error" class="error" role="alert" hidden>
      Please enter a valid email address (e.g., name@example.com).
    </p>
  </div>

  <fieldset>
    <legend>Notification preferences</legend>
    <label>
      <input type="checkbox" name="notify-email" checked>
      Email notifications
    </label>
    <label>
      <input type="checkbox" name="notify-sms">
      SMS notifications
    </label>
  </fieldset>

  <button type="submit">Save preferences</button>
</form>

Screen Reader Compatibility

Screen readers convert on-screen content into speech or braille output. The three most widely used screen readers are:

Screen Reader Testing Checklist

html — Common Screen Reader Fixes
<!-- Icon-only button: needs aria-label -->
<button aria-label="Close dialog">
  <svg aria-hidden="true">...X icon...</svg>
</button>

<!-- Decorative icons: hide from screen readers -->
<span aria-hidden="true">★</span> 4.8 out of 5 stars

<!-- Link with meaningful text -->
<!-- Bad -->
<a href="/pricing">Click here</a>
<!-- Good -->
<a href="/pricing">View pricing plans</a>

<!-- Loading state: announce to screen readers -->
<div aria-live="polite">
  <span role="status">Loading search results...</span>
</div>

Responsive Design and Zoom

WCAG requires that content is usable at 200% browser zoom and that text can be resized up to 200% without loss of content or functionality. Many users with low vision rely on zoom as their primary accommodation.

html — Correct Viewport Meta Tag
<!-- Correct: allows user scaling -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<!-- WRONG: prevents zooming (accessibility violation) -->
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">

Use QTool's Responsive Tester to preview how your pages render at different viewport sizes and zoom levels.

Testing Tools

The best accessibility testing combines automated scanning with manual testing. Automated tools catch about 30-40% of accessibility issues. The rest requires human judgment.

Automated Tools

Tool Type What It Catches
axe DevTools Browser extension WCAG violations, best practices. The industry standard for automated a11y testing.
Lighthouse Built into Chrome Accessibility score plus performance, SEO, and best practices in one scan.
WAVE Web-based / extension Visual overlay showing errors, alerts, and structural elements directly on the page.
Pa11y CLI / CI integration Automated accessibility testing in CI pipelines. Fails builds on WCAG violations.

QTool Accessibility Tools

Test Your Site's Accessibility Now

QTool offers free tools for contrast checking, color blindness simulation, and responsive testing. No signup required.

Accessibility Checker All Free Tools

Frequently Asked Questions

WCAG 2.2 (Web Content Accessibility Guidelines) is the latest version of the international standard for web accessibility, published by the W3C. It defines how to make web content more accessible to people with disabilities, covering visual, auditory, motor, and cognitive impairments. WCAG 2.2 adds nine new success criteria on top of WCAG 2.1, focusing on improved support for users with cognitive disabilities, mobile devices, and low vision. Compliance is increasingly required by law in the US (ADA), EU (European Accessibility Act), and many other jurisdictions.

For WCAG AA compliance, normal text (under 18pt or 14pt bold) requires a minimum contrast ratio of 4.5:1 against its background. Large text (18pt and above, or 14pt bold and above) requires a minimum ratio of 3:1. For WCAG AAA, the ratios increase to 7:1 for normal text and 4.5:1 for large text. Non-text elements like icons and UI components also require a minimum 3:1 contrast ratio against adjacent colors.

Test accessibility using a combination of automated and manual methods. Automated tools include axe DevTools (browser extension), Lighthouse (built into Chrome DevTools), and WAVE (web-based scanner). For manual testing, navigate your entire site using only the keyboard (Tab, Enter, Escape, Arrow keys), test with screen readers like NVDA (Windows, free), VoiceOver (macOS, built-in), or JAWS, and use a color contrast checker to verify text readability. Also test at 200% browser zoom and with browser text size increased to ensure content remains usable.

Always prefer semantic HTML over ARIA attributes. The first rule of ARIA is: do not use ARIA if you can use a native HTML element that already has the semantics you need. For example, use a button element instead of div with role="button", use nav instead of div with role="navigation", and use input type="checkbox" instead of a custom ARIA checkbox. ARIA should only be used when no native HTML element provides the required semantics, such as for custom widgets like tabs, accordions, or comboboxes, or to provide additional context like aria-live regions for dynamic content updates.

Yes, web accessibility is legally required in many jurisdictions. In the United States, the ADA (Americans with Disabilities Act) has been interpreted by courts to apply to websites, and the DOJ confirmed in 2024 that WCAG 2.1 AA is the standard for state and local government websites. The EU European Accessibility Act (EAA) requires accessibility compliance for digital products and services by June 2025. Canada, Australia, the UK, and many other countries also have accessibility legislation. ADA lawsuits in the US exceeded 4,000 in 2025, with e-commerce and service websites being the most common targets.

The most common accessibility mistakes are: missing alt text on images (or using unhelpful alt text like "image" or the filename), insufficient color contrast between text and background, missing form labels (inputs without associated label elements), no keyboard navigation support (interactive elements that cannot be reached or activated with keyboard only), missing page language declaration (no lang attribute on the html element), and auto-playing media without controls. Other frequent issues include missing skip navigation links, inaccessible custom components that do not communicate state changes to screen readers, and relying solely on color to convey information.

NT

Christian Bucher

We publish developer tools and guides to help you build better, more accessible websites. Browse the public index and inspect the source where available.

Ship Accessible Sites Faster

QTool indexes 269 free tool pages with no QTool account required and public source on GitHub.

Open Source — Free Forever Try Free Tools

Related Tools

CSS Box Shadow Generator · Free Color Palette Generator · Emoji Picker & Search

Related Tools

Free API Mock Server · Color Converter - HEX, RGB, HSL, HSV, CMYK · Free CSS Gradient Generator

Related Articles

Built by Miguel

Need a custom tool or website?

From . Delivered in 24-48h. You own the code.

View Services →