Skip to content
UIFoundry
Color theory • 8 min read

OKLCH Color Space in Modern CSS: Perceptual Uniformity, P3 Gamut, and Lightness Contrast

How the OKLCH color model revolutionizes web design systems: uniform perceived lightness across hues, Display P3 wide gamut access, and programmatic contrast generation.

By the UIFoundry Editorial Team

For decades, digital web design systems were constrained by RGB hex codes and the HSL (Hue, Saturation, Lightness) color model. While HSL made programmatic color adjustment intuitive for developers, it suffers from a fundamental mathematical flaw: it ignores human retinal biology.

In HSL, colors with identical calculated “Lightness” values look dramatically different in perceived brightness to human eyes. The arrival of OKLCH in CSS Color Module Level 4 fixes this, unlocking perceptually uniform color palettes and high-vibrancy Display P3 wide gamuts.

Why HSL Fails in Design Systems

The human eye possesses three types of photopic cone cells, with significantly higher sensitivity to green and red wavelengths than to short blue wavelengths.

Consider pure HSL yellow versus pure HSL blue:

  • hsl(60, 100%, 50%) (Pure Yellow): Perceived as blindingly bright; black text is mandatory for readable WCAG contrast.
  • hsl(240, 100%, 50%) (Pure Blue): Perceived as dark navy; white text is required for contrast.

Yet both colors report an identical 50% Lightness in HSL. This makes automated generation of accessible color shades in design systems impossible without hardcoded manual adjustments.

The OKLCH Architecture

The OKLCH color space, developed by Björn Ottosson, models color mathematically based on the human visual cortex:

oklch(L C H [/ A])
  │   │ │  │    │
  │   │ │  │    └── Alpha transparency (0% to 100%)
  │   │ │  └────── Hue angle (0° to 360° across color spectrum)
  │   │ └───────── Chroma (Saturation/purity: 0.0 to ~0.37+)
  │   └─────────── Perceived Lightness (0% pure black to 100% pure white)

The Superpower: True Perceptual Uniformity

If you set L = 0.70 (70% Lightness) and C = 0.15 in OKLCH:

  • oklch(0.70 0.15 60) (Warm Yellow)
  • oklch(0.70 0.15 140) (Emerald Green)
  • oklch(0.70 0.15 250) (Royal Blue)
  • oklch(0.70 0.15 350) (Vibrant Magenta)

Every single one of these colors has the exact same perceived luminance. If black text passes WCAG AA contrast against one shade, it is mathematically guaranteed to pass against all of them across every hue.

Unlocking Display P3 Wide Gamut in CSS

Standard sRGB screens reproduce only about 35% of visible colors. Modern iPhone displays, MacBook screens, and high-end monitors support the Display P3 gamut, displaying colors that are roughly 25% more saturated and vibrant.

In hex codes, you are permanently capped at standard sRGB (#00FF00 maxes out at the sRGB triangle apex).

In OKLCH, you simply increase the Chroma (C) parameter:

/* Standard sRGB Green */
--green-srgb: oklch(0.75 0.15 142);

/* Vivid Display P3 Green (Vibrant OLED Neon) */
--green-p3: oklch(0.75 0.28 142);

When rendered on a Display P3 device, modern browsers automatically map high-chroma values to the widest available hardware color space without clipping.

Sources and references

Frequently asked questions

Why is HSL broken for digital design systems?
HSL is not perceptually uniform. Pure yellow (#FFFF00) and pure blue (#0000FF) both have 50% lightness in HSL (hsl(60, 100%, 50%) vs hsl(240, 100%, 50%)), but the human eye perceives yellow as overwhelmingly brighter than blue.
What does OKLCH stand for?
OKLCH stands for Oklab Lightness (L: 0% to 100%), Chroma (C: color saturation/intensity), and Hue (H: 0 to 360 degree color angle).
Can OKLCH render colors outside standard sRGB?
Yes. OKLCH can directly target high-chroma Display P3 and Rec.2020 wide-gamut colors supported on modern OLED screens and Apple Retina displays.

About the author

Written by the UIFoundry Editorial Team, which researches, writes, and tests every guide on this site. Read more about our editorial standards or contact us with suggestions.