100 of 100free actions left today
Back to Blog
WCAG Contrast Checker: Ensure Accessible Colors (2025 Guide)
wcag contrast checkercolor contrast checkeraccessibility checkerwcag aa aaacolor accessibilitycontrast ratio calculator

WCAG Contrast Checker: Ensure Accessible Colors (2025 Guide)

Complete guide to WCAG color contrast checking. Learn AA/AAA standards, test color combinations, and ensure your designs meet accessibility requirements.

HueStack TeamJanuary 27, 2025

Color accessibility isn't optional—it's a legal requirement. With lawsuits over inaccessible websites increasing every year, understanding WCAG contrast standards is essential for every designer and developer.

In this comprehensive guide, you'll learn everything about color contrast checking, from WCAG standards to practical tools and common mistakes to avoid.

What is WCAG and Why Does Color Contrast Matter?

WCAG (Web Content Accessibility Guidelines) are internationally recognized standards for making web content accessible to people with disabilities. Color contrast is a crucial part of these guidelines.

Here's why it matters:

  • Legal Compliance: ADA lawsuits cost companies millions each year
  • User Experience: 1 in 12 men and 1 in 200 women have color vision deficiency
  • SEO Benefits: Google considers accessibility as a ranking factor
  • Inclusive Design: 15% of the world's population has some form of disability
  • Brand Reputation: Accessible brands are viewed more favorably

Poor color contrast doesn't just affect people with vision impairments—it impacts everyone reading on mobile devices in bright sunlight, older users with age-related vision changes, and anyone with temporary vision issues.

Understanding WCAG Contrast Standards

WCAG defines two compliance levels for color contrast:

WCAG AA (Minimum Standard)

Required for most websites and applications:

  • Normal text: 4.5:1 contrast ratio minimum
  • Large text (18pt+ or 14pt+ bold): 3:1 contrast ratio minimum
  • UI components & graphics: 3:1 contrast ratio minimum

WCAG AAA (Enhanced Standard)

Recommended for critical applications:

  • Normal text: 7:1 contrast ratio minimum
  • Large text: 4.5:1 contrast ratio minimum

Real-world example:

Black (#000000) on White (#FFFFFF) = 21:1 ✅ AAA
Dark Gray (#767676) on White = 4.54:1 ✅ AA (Normal text)
Light Gray (#999999) on White = 2.85:1 ❌ Fails all standards
Purple (#6366f1) on White = 4.5:1 ✅ AA (Normal text)

Most organizations aim for WCAG AA compliance as the standard, with AAA for critical content like legal text or medical information.

How Contrast Ratios Work

The contrast ratio is calculated using the relative luminance of two colors.

The Formula:

Contrast Ratio = (L1 + 0.05) / (L2 + 0.05)

Where:
L1 = relative luminance of the lighter color
L2 = relative luminance of the darker color

You don't need to calculate this manually—tools like HueStack do it instantly.

Understanding Ratio Numbers:

  • 21:1 - Maximum contrast (black on white)
  • 7:1 - WCAG AAA for normal text
  • 4.5:1 - WCAG AA for normal text
  • 3:1 - WCAG AA for large text / UI components
  • 2:1 - Fails all standards

The higher the number, the better the contrast.

Using HueStack Contrast Checker

HueStack provides a free WCAG contrast checker with real-time compliance feedback. Here's how to use it:

Step-by-Step Guide:

  1. Visit HueStack.dev and navigate to Accessibility Tools

  2. Enter your colors:

    • Foreground color (text or icon color)
    • Background color
  3. View instant results:

    • Exact contrast ratio (e.g., 4.52:1)
    • WCAG AA compliance (Pass/Fail)
    • WCAG AAA compliance (Pass/Fail)
    • Recommendations for improvement
  4. Test variations:

    • Adjust colors using the built-in picker
    • See contrast ratios update in real-time
    • Find the minimum adjustment needed to pass
  5. Copy compliant colors:

    • Export to CSS, Tailwind, or HEX format
    • Use in your design system

Advanced Features:

APCA (Advanced Perceptual Contrast Algorithm)

HueStack also supports APCA, a newer contrast algorithm that:

  • More accurately reflects human perception
  • Considers font weight and size
  • Provides more nuanced scoring
  • Expected to be part of WCAG 3.0

Batch Testing:

Test multiple color combinations at once:

  • Primary brand colors
  • Button states (default, hover, active)
  • Alert colors (success, warning, error)
  • Dark mode variants

Common Contrast Mistakes (And How to Fix Them)

❌ Mistake 1: Low Contrast Gray Text

Problem:

/* Light gray text on white background */
color: #999999;
background: #FFFFFF;
/* Contrast: 2.85:1 - FAILS */

Solution:

/* Darker gray for better contrast */
color: #767676;
background: #FFFFFF;
/* Contrast: 4.54:1 - PASSES AA */

❌ Mistake 2: Colored Text Without Enough Contrast

Problem:

/* Light blue links on white */
color: #60A5FA;
background: #FFFFFF;
/* Contrast: 2.13:1 - FAILS */

Solution:

/* Darker blue with sufficient contrast */
color: #2563EB;
background: #FFFFFF;
/* Contrast: 4.56:1 - PASSES AA */

❌ Mistake 3: Assuming All Brand Colors Work

Problem: Many brand colors (especially pastels) fail contrast requirements when used directly.

Solution:

  • Generate darker shades for text
  • Use brand colors for accents only
  • Create accessible variants with HueStack's palette generator

Example with Tailwind CSS:

// Brand color palette with accessible text shades
colors: {
  'brand': {
    50: '#faf5ff',   // Backgrounds
    100: '#f3e8ff',
    200: '#e9d5ff',
    300: '#d8b4fe',
    400: '#c084fc',
    500: '#a855f7',  // Brand color (fails on white)
    600: '#9333ea',  // Use for text on white ✅
    700: '#7e22ce',  // High contrast text ✅
    800: '#6b21a8',
    900: '#581c87',
    950: '#3b0764',
  }
}

❌ Mistake 4: Forgetting Button States

Problem: Buttons often have multiple states with different contrast requirements:

/* Default state passes */
.button {
  background: #2563EB;  /* Blue */
  color: #FFFFFF;       /* White text ✅ */
}
 
/* Hover state fails */
.button:hover {
  background: #60A5FA;  /* Lighter blue */
  color: #FFFFFF;       /* White text ❌ FAILS */
}

Solution: Test all interactive states:

  • Default
  • Hover
  • Active/Pressed
  • Focus
  • Disabled

❌ Mistake 5: Overlay Text on Images

Problem: Text over images often fails contrast due to varying backgrounds.

Solution:

  • Add semi-transparent overlays
  • Use text shadows for readability
  • Ensure minimum 4.5:1 contrast in all image areas
.hero-text {
  color: #FFFFFF;
  background: rgba(0, 0, 0, 0.5); /* Dark overlay */
  text-shadow: 0 2px 4px rgba(0, 0, 0, 0.8);
}

WCAG Contrast for Different Components

Text Content

Content TypeSizeWCAG AAWCAG AAA
Body text< 18pt4.5:17:1
Large text≥ 18pt3:14.5:1
Bold text≥ 14pt bold3:14.5:1

UI Components

ElementRequirementRatio
ButtonsBackground vs text4.5:1
Form inputsBorder vs background3:1
IconsIcon vs background3:1
Focus indicatorsIndicator vs background3:1

Graphical Objects

  • Charts & graphs: 3:1 minimum
  • Infographics: 3:1 for essential elements
  • Icons: 3:1 vs background

Building an Accessible Color System

Step 1: Start with Brand Colors

Extract your brand colors and check their contrast:

Primary Brand: #6366F1 (Indigo)
- On white background: 4.5:1 ✅ AA
- On light gray (#F9FAFB): 5.2:1 ✅ AA
- For large text: 3:1 ✅ AA

Step 2: Generate Accessible Palettes

Use HueStack to create 11-shade palettes where:

  • 50-400: Background colors
  • 500-600: Default brand colors (check contrast!)
  • 700-950: High contrast text colors

Step 3: Create Color Tokens

Define semantic color tokens for consistent usage:

// Tailwind config with accessibility built-in
module.exports = {
  theme: {
    extend: {
      colors: {
        // Text colors (guaranteed contrast on white)
        'text-primary': '#1F2937',    // 16.7:1 AAA
        'text-secondary': '#4B5563',  // 9.7:1 AAA
        'text-tertiary': '#6B7280',   // 5.9:1 AA
 
        // Interactive colors
        'link': '#2563EB',            // 4.56:1 AA
        'link-hover': '#1D4ED8',      // 5.7:1 AA
 
        // Status colors (all pass AA on white)
        'success': '#047857',         // 4.5:1 AA
        'warning': '#B45309',         // 4.5:1 AA
        'error': '#DC2626',           // 5.9:1 AA
      }
    }
  }
}

Step 4: Document Contrast Ratios

Create a design system guide showing:

  • Approved color combinations
  • Contrast ratios for each pairing
  • When to use each combination

Example:

## Approved Text Combinations
 
✅ text-primary (#1F2937) on white (#FFFFFF) = 16.7:1 AAA
✅ text-secondary (#4B5563) on white = 9.7:1 AAA
✅ text-tertiary (#6B7280) on white = 5.9:1 AA
✅ link (#2563EB) on white = 4.56:1 AA
❌ text-muted (#9CA3AF) on white = 3.2:1 FAILS

Tools & Resources for Contrast Checking

Free Tools:

  1. HueStack Contrast Checker (Recommended)

    • Real-time WCAG validation
    • APCA support
    • Tailwind CSS integration
    • Batch testing
    • 100 free checks per month
  2. WebAIM Contrast Checker

    • Simple, reliable
    • Educational resources
    • No account needed
  3. Stark (Figma Plugin)

    • Design tool integration
    • Contrast checking in Figma
    • Colorblind simulation

Browser Extensions:

  • axe DevTools: Full accessibility audits
  • WAVE: Visual feedback on accessibility
  • Lighthouse: Built into Chrome DevTools

Automated Testing:

// Example with Jest and testing-library
import { render } from '@testing-library/react'
import { axe, toHaveNoViolations } from 'jest-axe'
 
expect.extend(toHaveNoViolations)
 
test('Button has sufficient contrast', async () => {
  const { container } = render(<Button>Click me</Button>)
  const results = await axe(container)
  expect(results).toHaveNoViolations()
})

WCAG 3.0 and APCA: The Future of Contrast

WCAG 3.0 is coming, and it introduces APCA (Advanced Perceptual Contrast Algorithm):

Key Differences:

WCAG 2.xWCAG 3.0 (APCA)
Simple ratio (4.5:1)Perceptual score (Lc 60)
Same standard for all fontsFont-size aware
Binary pass/failGraduated scoring
Doesn't consider font weightAccounts for font weight

Example APCA scores:

#000000 on #FFFFFF = Lc 106 (Maximum)
#767676 on #FFFFFF = Lc 60 (Minimum for body text)
#999999 on #FFFFFF = Lc 40 (Too low for body text)

HueStack supports both WCAG 2.1 and APCA, so you're ready for the transition.

Real-World Examples

Example 1: E-commerce Product Card

Before (Fails AA):

.price {
  color: #10B981; /* Green */
  background: #FFFFFF;
  /* Contrast: 2.3:1 ❌ */
}

After (Passes AA):

.price {
  color: #047857; /* Darker green */
  background: #FFFFFF;
  /* Contrast: 4.5:1 ✅ */
}

Example 2: Alert Banner

Before (Fails on warning):

.alert-warning {
  background: #FEF3C7; /* Light yellow */
  color: #F59E0B;     /* Orange text */
  /* Contrast: 2.1:1 ❌ */
}

After (Passes AA):

.alert-warning {
  background: #FEF3C7; /* Light yellow */
  color: #B45309;     /* Darker orange */
  /* Contrast: 4.5:1 ✅ */
}

Example 3: Dark Mode

Dark mode requires contrast too!

/* Light mode */
.text {
  color: #1F2937;     /* Dark text */
  background: #FFFFFF; /* White background */
  /* Contrast: 16.7:1 ✅ AAA */
}
 
/* Dark mode */
.dark .text {
  color: #F9FAFB;     /* Light text */
  background: #1F2937; /* Dark background */
  /* Contrast: 16.7:1 ✅ AAA (same ratio!) */
}

Accessibility Testing Checklist

Before launching your site:

  • All body text meets 4.5:1 contrast ratio
  • Large text meets 3:1 contrast ratio
  • Form inputs and borders meet 3:1 ratio
  • Interactive elements have 3:1 ratio
  • Focus indicators are clearly visible (3:1)
  • Button states all pass contrast requirements
  • Links are distinguishable from body text
  • Status colors (error, warning, success) pass AA
  • Dark mode (if applicable) meets standards
  • Test with colorblind simulators

Best Practices Summary

✅ DO:

  • Test early and often - Don't wait until development is complete
  • Use semantic color tokens - Define accessible colors once, use everywhere
  • Document approved combinations - Save time with pre-approved palettes
  • Test all states - Hover, focus, active, disabled
  • Consider context - Same color may work differently on different backgrounds
  • Use automated testing - Integrate axe-core into your CI/CD pipeline

❌ DON'T:

  • Rely on color alone - Use icons, patterns, or text in addition to color
  • Assume brand colors work - Always validate against WCAG standards
  • Forget about images - Text on images needs contrast too
  • Ignore dark mode - Test contrast in both themes
  • Skip large text - Even headings need 3:1 minimum
  • Use hex values blindly - Always check actual contrast ratios

Conclusion

Color contrast isn't just a checkbox—it's a fundamental part of creating usable, inclusive web experiences. With tools like HueStack's WCAG Contrast Checker, ensuring accessibility is easier than ever.

Key Takeaways:

  1. WCAG AA requires 4.5:1 for normal text, 3:1 for large text
  2. Test all color combinations before using them in production
  3. Build accessible color systems with pre-approved palettes
  4. Don't rely on color alone to convey information
  5. Use modern tools like HueStack to check contrast in real-time

Try it yourself: Visit HueStack.dev to check your color combinations. With 100 free actions per month, you can validate your entire design system without cost.

Next Steps

Now that you understand WCAG contrast checking, explore these related topics:

Questions about color accessibility? Drop a comment below or reach out on Twitter/X.


Last updated: January 27, 2025

H

HueStack Team

Writing about Tailwind CSS, color theory, and modern web development.

Try HueStack for Free

Generate Tailwind CSS palettes, extract colors from websites, and check accessibility.

Get Started