1.4.3 Contrast (Minimum)

Level: AA | Principle: Perceivable | Since: WCAG 2.0 | Automation: Partial (axe-core)


What This Means

Text must have enough contrast against its background to be readable. The minimum contrast ratios are:

  1. Normal text (under 18pt / 24px, or under 14pt / 18.5px bold): 4.5:1
  2. Large text (18pt+ / 24px+, or 14pt+ / 18.5px+ bold): 3:1

Low contrast text is difficult to read for everyone, and impossible for users with low vision or color deficiencies.

Who This Affects

  1. Users with low vision — reduced contrast sensitivity is extremely common
  2. Older adults — contrast sensitivity decreases with age
  3. Everyone in bright sunlight — low contrast text washes out on mobile screens
  4. Users with color vision deficiency — affects ~8% of men

Common Pitfalls

1. Light gray text on white

/* Bad: #999 on #fff = 2.85:1 ratio (fails) */
p { color: #999999; }

/* Good: #595959 on #fff = 7.0:1 ratio (passes) */
p { color: #595959; }

2. Placeholder text with insufficient contrast

<!-- Bad: default placeholder color often fails contrast -->
<input placeholder="Enter your name">

Placeholder text must also meet contrast requirements.

3. Text over images without overlay

<!-- Bad: white text on a photo — contrast varies -->
<div style="background-image: url('photo.jpg')">
  <h2 style="color: white">Title</h2>
</div>

<!-- Good: add a semi-transparent overlay -->
<div style="background-image: url('photo.jpg')">
  <div style="background: rgba(0,0,0,0.6)">
    <h2 style="color: white">Title</h2>
  </div>
</div>

4. Disabled states that are too faint

Disabled elements are exempt from contrast requirements, but users still need to see them. Aim for at least 3:1.

How to Fix

Use a contrast checker to verify ratios. Adjust text color or background color until the ratio meets the minimum.

Quick reference for common backgrounds:

| Background | Minimum text color (4.5:1) | |------------|---------------------------| | White #fff | #595959 or darker | | Light gray #f5f5f5 | #545454 or darker | | Black #000 | #949494 or lighter |

How to Test

  1. Open DevTools (F12), inspect a text element, and click the color swatch in the Styles panel. The contrast ratio is shown in the color picker tooltip.
  2. Check normal text (under 18pt / 24px) for at least a 4.5:1 contrast ratio against its background.
  3. Check large text (18pt+ / 24px+, or 14pt+ / 18.5px+ bold) for at least a 3:1 contrast ratio.
  4. Inspect placeholder text, disabled-state text, and text over images or gradients, as these are commonly missed.
  5. For text over images, use the DevTools eyedropper to sample the darkest and lightest areas behind the text and check both ratios.
  6. Pass: All text meets the minimum contrast ratio (4.5:1 for normal text, 3:1 for large text) against its background.
  7. Fail: Any text falls below the required contrast ratio, including placeholder text or text over variable backgrounds.

axe-core Rules

| Rule | What It Checks | |------|---------------| | color-contrast | Text elements meet minimum contrast ratio |

Note: axe-core cannot check text over background images, gradients, or dynamically colored backgrounds. Those are flagged as "needs review."

Tools

Check your colors with the A11y Scan Contrast Checker — supports solid colors, gradients, and image backgrounds.

Sources

  1. W3C WCAG 2.2 — Understanding 1.4.3
  2. axe-core: color-contrast
  3. WebAIM Contrast Checker