DevToys Web Pro

free web developer tools

Blog
Rate us:
Try browser extension:
← Back to Blog

Designing for Color Blindness: Complete Developer's Guide

15 min read

You designed a dashboard with red/green status indicators, but 8% of your male users (300 million people worldwide) can't distinguish them. Your color-coded charts are unreadable to users with color vision deficiency (CVD). This guide explains types of color blindness, how to test your designs with simulators, and how to create inclusive color palettes that work for everyone.

Understanding Color Vision Deficiency

Color blindness (more accurately: color vision deficiency) affects approximately:

  • 8% of men (1 in 12)
  • 0.5% of women (1 in 200)
  • ~300 million people worldwide

Most color blindness is inherited (X-linked recessive trait), but can also result from aging, eye diseases, or medications.

Types of Color Blindness

TypeAffectsPrevalenceColors Confused
ProtanopiaRed cones1% menRed/green, red/brown, red/orange
ProtanomalyRed cones (weak)1% menSimilar to protanopia (milder)
DeuteranopiaGreen cones1% menGreen/red, green/brown
DeuteranomalyGreen cones (weak)5% menSimilar to deuteranopia (milder)
TritanopiaBlue cones0.001%Blue/green, yellow/pink
TritanomalyBlue cones (weak)0.01%Similar to tritanopia (milder)
AchromatopsiaAll cones0.003%No color (grayscale only)

Red-Green Color Blindness (Most Common)

Protanopia and deuteranopia are collectively called "red-green color blindness" and account for ~99% of all color blindness cases:

Normal vision:
Red (#FF0000) and green (#00FF00) are clearly distinct

Protanopia/Deuteranopia:
Red and green appear as similar yellowish/brownish tones
Red (#FF0000) → appears as brownish-yellow
Green (#00FF00) → appears as yellowish
Orange (#FFA500) → appears similar to yellow
Brown (#8B4513) → hard to distinguish from green

Critical confusions:
- Red "error" vs green "success" → both look yellowish
- Red/green status dots → indistinguishable
- Color-coded charts with red/green → unreadable

Blue-Yellow Color Blindness (Rare)

Tritanopia is much rarer (0.001%) but still important:

Tritanopia confusions:
Blue (#0000FF) → appears as greenish
Yellow (#FFFF00) → appears as pinkish
Purple (#800080) → appears as deep red
Green (#00FF00) → appears as pale blue

Critical confusions:
- Blue links on white → harder to see (appears greenish)
- Blue/yellow warnings → indistinguishable
- Purple/blue buttons → confusing

Testing Your Designs with Simulators

Using Color Blindness Simulator

Test your designs by uploading screenshots to Color Blindness Simulator:

Testing workflow:

1. Take screenshot of your interface
2. Upload to Color Blindness Simulator
3. View simulation for each CVD type:
   - Protanopia (red-blind)
   - Deuteranopia (green-blind)
   - Tritanopia (blue-blind)
   - Achromatopsia (grayscale)
4. Identify problem areas:
   - Status indicators that look identical
   - Charts where colors blend together
   - Buttons that lose visual hierarchy
5. Iterate on design
6. Re-test until issues resolved

Pro tip: Test multiple screens:
- Dashboard with status indicators
- Charts and data visualizations
- Forms with validation states
- Navigation with active states

Browser Extensions for Live Testing

Test live websites in real-time:

  • Chrome: "Let's get color blind" or "Colorblindly"
  • Firefox: "Color Vision Deficiency Simulator"
Using browser extensions:

1. Install extension
2. Navigate to your site
3. Toggle CVD simulation (protanopia, deuteranopia, etc.)
4. Interact with UI as normal user would
5. Check if you can:
   - Distinguish success/error states
   - Read charts and graphs
   - See all buttons and links
   - Understand color-coded information

Fails if:
- Two colors look identical
- Color is the only indicator
- Hover states disappear
- Focus indicators are invisible

Common Design Mistakes and Fixes

Mistake 1: Red/Green Status Indicators

Problem: Using only color to indicate status (red = error, green = success).

❌ Fails for red-green color blind users:

Status indicator:
● Red (error)    → Appears brownish-yellow
● Green (success) → Appears yellowish
Result: Both look nearly identical

Chart legend:
Red line (series A) → brownish-yellow
Green line (series B) → yellowish
Result: Can't distinguish lines in chart

Fix: Add non-color indicators:

✓ Accessible alternatives:

1. Icons + color:
   ✗ Red (error)    → Clear visual indicator
   ✓ Green (success) → Clear visual indicator

2. Patterns + color:
   ■ Solid red (error)
   ▨ Striped green (success)

3. Text labels + color:
   "Failed" in red
   "Passed" in green

4. Different symbols:
   ⬤ Error (red circle)
   ▲ Warning (yellow triangle)
   ■ Success (green square)

5. Position + color:
   Left position = error
   Right position = success

Mistake 2: Color-Only Chart Legends

Problem: Charts with multiple colored lines/bars without alternative indicators.

❌ Inaccessible chart:

Line chart with:
- Red line (Revenue)
- Green line (Costs)
- Blue line (Profit)

For protanopia/deuteranopia:
- Red and green lines blend together
- Can't tell which is which

For tritanopia:
- Blue and green lines are confusing

Fix: Add distinguishing features:

✓ Accessible chart:

1. Different line styles:
   - Solid line (Revenue)
   - Dashed line (Costs)
   - Dotted line (Profit)

2. Different symbols at data points:
   - ● Circle markers (Revenue)
   - ▲ Triangle markers (Costs)
   - ■ Square markers (Profit)

3. Direct labeling:
   - Label each line at the end
   - Use annotations for key points

4. Hover tooltips:
   - Show series name on hover
   - Include numeric values

5. Color blind friendly palette:
   - Use colors that remain distinct
   - Avoid red/green combinations

Mistake 3: Color-Coded Heatmaps

Problem: Heatmaps using red-green scales to show intensity.

❌ Red-green heatmap:

Scale:
Dark red (high) → Light red → Yellow → Light green → Dark green (low)

Problem for CVD users:
All colors look like shades of yellow/brown
Can't determine if value is high or low

Fix: Use CVD-friendly color scales:

✓ Alternative scales:

1. Blue-Orange scale:
   Dark blue (low) → Light blue → White → Light orange → Dark orange (high)
   Works for all CVD types

2. Blue-Red scale (avoid green):
   Dark blue (low) → Light blue → White → Light red → Dark red (high)
   Red endpoint distinguishable from blue

3. Single-hue scale:
   Light blue → Dark blue (one color, varying intensity)
   No confusion possible

4. Add numeric labels:
   Show actual values in cells
   Color becomes secondary indicator

5. Legend with numeric ranges:
   0-20: Light blue
   21-40: Medium blue
   41-60: Dark blue
   Users can read legend instead of relying on color

Mistake 4: Low Contrast Color Pairs

Problem: Some color combinations have poor contrast for CVD users even if they look distinct to you.

Examples of problematic pairs:

Normal vision: Looks fine
Deuteranopia: Problems appear

1. Red text on green background:
   Normal: Distinct
   CVD: Yellow on yellowish (low contrast)

2. Blue links on purple background:
   Normal: Visible
   Tritanopia: Green on dark red (poor contrast)

3. Orange buttons on red background:
   Normal: Distinguishable
   Protanopia: Yellow on brownish (merges)

4. Light green on white:
   Normal: Subtle but visible
   CVD: Nearly invisible (very low contrast)

Fix: Test contrast for CVD:

Testing workflow:

1. Use Color Blindness Simulator to check pair
2. Verify contrast ratio is sufficient (4.5:1+)
3. If colors merge:
   - Increase brightness difference
   - Add border or separator
   - Use alternative color pair

Safe color pairs (work for all CVD types):
- Dark blue on white
- Black on white
- Orange on dark blue
- Yellow on black
- Pink on dark gray

Mistake 5: Form Validation with Color Only

Problem: Input borders turn red/green to indicate validation state.

❌ Color-only validation:

<input class="valid">   <!-- Green border -->
<input class="invalid"> <!-- Red border -->

Problem: CVD users can't distinguish valid from invalid

Fix: Add multiple indicators:

✓ Accessible validation:

<input class="valid" aria-invalid="false">
  ✓ Valid input
</input>

<input class="invalid" aria-invalid="true">
  ✗ Email format is incorrect
</input>

Features:
1. Icon (✓ or ✗)
2. Text message
3. aria-invalid attribute (for screen readers)
4. Border color (supplementary)
5. Optional: background color change

Multiple redundant indicators ensure
all users understand the state

Creating Accessible Color Palettes

CVD-Friendly Color Selection Principles

  1. Avoid red-green combinations: Never rely on red vs green alone
  2. Use sufficient contrast: Ensure colors remain distinct in CVD simulation
  3. Include blue and orange: These are distinguishable across all CVD types
  4. Vary brightness: Even if hues are similar, brightness differences help
  5. Test with simulators: Always verify with actual CVD simulations

Recommended Color Palettes

Palette 1: Universal Accessible Palette

Colors that work for all CVD types:

Primary: #0066CC (Blue)
  - Distinct in all CVD simulations
  - High contrast on white
  - Use for: Primary actions, links

Secondary: #FF9900 (Orange)
  - Clearly different from blue
  - Works in all CVD types
  - Use for: Warnings, secondary actions

Success: #009999 (Teal/Cyan)
  - Avoids green confusion
  - Distinguishable from red/orange
  - Use for: Success states, confirmations

Error: #CC0000 (Dark Red)
  - High contrast
  - Combine with icon/text (never alone)
  - Use for: Errors, destructive actions

Neutral: #333333 (Dark Gray)
  - Universal readability
  - Use for: Body text, borders

Background: #FFFFFF (White)
  - Maximum contrast
  - Use for: Page background

Palette 2: Chart/Data Visualization Palette

CVD-safe colors for charts (6-color palette):

1. #0173B2 (Blue)
2. #DE8F05 (Orange)
3. #029E73 (Bluish green)
4. #CC78BC (Pink)
5. #CA9161 (Tan)
6. #949494 (Gray)

Characteristics:
- Each color remains distinct in CVD simulations
- High contrast between consecutive colors
- Works with line styles, patterns, symbols
- Colorblind-friendly by design

Source: Based on Paul Tol's color schemes
(research-backed palettes for accessibility)

Palette 3: Heatmap Scale

CVD-safe sequential scale (low to high):

#F7FBFF (Very light blue)
#DEEBF7 (Light blue)
#C6DBEF (Medium-light blue)
#9ECAE1 (Medium blue)
#6BAED6 (Medium-dark blue)
#4292C6 (Dark blue)
#2171B5 (Very dark blue)
#084594 (Darkest blue)

Why it works:
- Single hue (blue) with varying intensity
- No color confusion possible
- Brightness difference is clear
- Works in grayscale too

Palette 4: Diverging Scale

CVD-safe diverging scale (negative to positive):

Negative side:
#D73027 (Dark red/brown)
#FC8D59 (Orange)
#FEE090 (Light yellow)

Neutral:
#FFFFBF (Pale yellow)

Positive side:
#E0F3F8 (Light blue)
#91BFDB (Medium blue)
#4575B4 (Dark blue)

Why it works:
- Avoids green entirely
- Red-brown and blue are distinguishable
- Yellow acts as neutral midpoint
- Works for all CVD types

Testing Your Palette

Palette testing checklist:

1. Upload palette swatch to Color Blindness Simulator
2. Check each CVD type:
   ✓ Protanopia: All colors distinct?
   ✓ Deuteranopia: All colors distinct?
   ✓ Tritanopia: All colors distinct?
   ✓ Achromatopsia: Sufficient brightness differences?

3. Verify common combinations:
   - Text on each background color
   - Adjacent colors in charts
   - Hover/active states

4. Document safe combinations:
   Create style guide showing which colors
   can be used together

5. Test edge cases:
   - Small elements (icons, dots)
   - Thin lines (chart lines)
   - Large areas (backgrounds, fills)

Design Patterns for Inclusive Interfaces

Pattern 1: Multi-Indicator Status System

Status display with redundant indicators:

<!-- Error state -->
<div class="status status-error">
  <svg class="icon">
    <circle /> <!-- Red circle -->
    <line />   <!-- X mark inside -->
  </svg>
  <span class="status-label">Error</span>
  <span class="status-count">3 failed</span>
</div>

<!-- Success state -->
<div class="status status-success">
  <svg class="icon">
    <polygon /> <!-- Green square -->
    <path />    <!-- Checkmark inside -->
  </svg>
  <span class="status-label">Success</span>
  <span class="status-count">47 passed</span>
</div>

Indicators:
1. Shape (circle vs square)
2. Icon (X vs checkmark)
3. Color (red vs green)
4. Text label
5. Numeric count

CVD users can rely on shape/icon/text,
not just color

Pattern 2: Accessible Chart Design

Chart features for CVD accessibility:

1. Line styles:
   - Series A: Solid line, ● circle markers
   - Series B: Dashed line, ▲ triangle markers
   - Series C: Dotted line, ■ square markers

2. Direct labeling:
   - Label each line at the end point
   - Avoid separate legend when possible

3. Hover tooltips:
   - Show series name
   - Display exact value
   - Highlight active series

4. Pattern fills (bar charts):
   - Bar A: Solid fill
   - Bar B: Striped pattern
   - Bar C: Dotted pattern

5. Interactive legend:
   - Click to toggle series visibility
   - Hover to highlight series in chart
   - Use accessible colors

Pattern 3: Form Design Best Practices

Accessible form validation:

<!-- Invalid input -->
<div class="form-field form-field-error">
  <label for="email">Email</label>
  <input
    id="email"
    type="email"
    aria-invalid="true"
    aria-describedby="email-error"
  />
  <div id="email-error" class="error-message">
    <svg aria-hidden="true">
      <!-- Error icon -->
    </svg>
    <span>Please enter a valid email address</span>
  </div>
</div>

CSS:
.form-field-error input {
  border: 2px solid #DC2626; /* Red border */
  border-left: 4px solid #DC2626; /* Thicker left border */
  background: #FEF2F2; /* Light red tint */
}

.error-message {
  color: #991B1B; /* Dark red text */
  font-weight: 600; /* Bold text */
}

Multiple indicators:
1. Icon
2. Text message
3. Border color and style
4. Background tint
5. aria-invalid attribute
6. Bold font weight

Pattern 4: Link Differentiation

Problem: Blue links on black text - color alone isn't sufficient.

✓ Accessible link styles:

a {
  color: #0066CC; /* Blue */
  text-decoration: underline; /* Always underlined */
  font-weight: 500; /* Slightly bolder than body */
}

a:hover {
  text-decoration: underline;
  background: #F0F9FF; /* Light blue background */
  text-decoration-thickness: 2px; /* Thicker underline */
}

a:focus {
  outline: 2px solid #0066CC;
  outline-offset: 2px;
  border-radius: 2px;
}

Features:
1. Color (blue)
2. Underline (always visible)
3. Font weight (subtle distinction)
4. Hover background change
5. Focus indicator

Never rely on color alone for links

Testing Workflow Summary

Design Phase

  1. Choose CVD-friendly palette: Start with accessible colors
  2. Simulate early: Upload mockups to Color Blindness Simulator
  3. Add redundant indicators: Icons, patterns, text, shapes
  4. Document patterns: Create reusable accessible components

Development Phase

  1. Implement multi-indicator patterns: Never rely on color alone
  2. Use semantic HTML: aria-invalid, labels, error messages
  3. Test with browser extensions: Check live site with CVD simulation
  4. Verify contrast: Use Color Contrast Checker for ratios

QA Phase

  1. Test all CVD types: Protanopia, deuteranopia, tritanopia, achromatopsia
  2. Test critical flows: Forms, dashboards, charts, status indicators
  3. User testing: If possible, test with actual color blind users
  4. Document exceptions: Note any color-only elements (explain why)

Quick Reference: CVD-Safe Colors

Use CaseColorHexWhy Safe
Primary actionBlue#0066CCDistinct in all CVD types
WarningOrange#FF9900Different from blue/red
Success (avoid green)Teal#009999Bluish, not confused with red
ErrorDark Red#CC0000High contrast (use with icon)
SecondaryPurple#7C3AEDDistinct hue
NeutralGray#6B7280No hue confusion

Common Questions

Can I use green in my design?

Yes, but:

  • Never use green + red as the only way to distinguish elements
  • Always add non-color indicators (icons, text, patterns)
  • Test with CVD simulation to ensure green doesn't blend with other colors
  • Consider using teal/cyan instead of pure green (more CVD-friendly)

Do I need to support all CVD types?

Priority order:

  1. Protanopia/Deuteranopia (red-green): 99% of CVD cases - always support
  2. Tritanopia (blue-yellow): Very rare (0.001%) but easy to support
  3. Achromatopsia (grayscale): Extremely rare, but good UX for everyone

If you design for red-green color blindness (most common), you've helped 99% of CVD users.

Is WCAG compliance enough?

WCAG contrast ratios are necessary but not sufficient:

  • WCAG requires 4.5:1 contrast - checks luminance difference
  • CVD-friendly design requires hue differences that remain distinct in CVD simulation
  • Two colors can have great contrast (4.5:1+) but still look identical to CVD users
  • Always test with CVD simulator in addition to contrast checker

Summary

Color blindness affects 8% of men (300M people worldwide), with red-green color blindness being most common. Never rely on color alone - always add icons, patterns, text labels, or shapes. Test designs with color blindness simulators (protanopia, deuteranopia, tritanopia). Use CVD-friendly palettes: blue and orange work universally, avoid red-green combinations. Add multiple redundant indicators for status, validation, and data visualization.

For testing your designs with CVD simulations, use Color Blindness Simulator to see your interface through different types of color vision deficiency. To ensure your color choices meet contrast requirements, use Color Contrast Checker to verify WCAG compliance alongside CVD testing.