---
name: Perceptual uniformity
slug: perceptual-uniformity
category: color
status: published
created: 2026-08-21T00:00:00.000Z
modified: 2026-08-21T00:00:00.000Z
definition: The property of a colour space where equal numeric distances look
  like equal visual differences, which is what makes a generated ramp step
  evenly.
aliases:
  - name: perceptually uniform
    source: community
  - name: even steps
    source: community
  - name: uniform color space
tags:
  - perception
relations:
  contrastWith:
    - relative-luminance
    - chroma
    - oklch
  variantOf: []
  partOf: []
  seeAlso: []
implementations: []
sources:
  - title: "MDN: oklch()"
    url: https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/color_value/oklch
demo: inline
exhibit: false
useWhen: explaining why an HSL ramp looks uneven and an OKLCH one does not
---

A [colour space](/color-space) is perceptually uniform when the arithmetic agrees with the
eye: move the same amount in the numbers, see the same amount of change. HSL is not, and
the failure is not subtle. Its `L` is an average of the largest and smallest sRGB channel,
which is a fact about the encoding rather than about vision, so `hsl(60 90% 50%)` is a
blazing yellow and `hsl(250 85% 50%)` is a deep blue while both claim to be halfway. Run a
ramp between fixed endpoints in each and measure: at a yellow hue the top three HSL steps
change less than two units of CIE L\* each and the bottom two change more than twenty, so
the ramp bunches at the light end and falls off a cliff at the dark one.

This is why token scales moved to [OKLCH](/oklch). A palette generated by stepping HSL
lightness produces steps that do not read as equal, which shows up as a 100 and a 200 that
are indistinguishable next to a 700 and an 800 that are miles apart, and it shows up
differently at every hue, so the blue ramp and the yellow ramp in the same system misbehave
in different ways. Stepping OKLCH lightness instead gives a ladder whose measured rungs are
the same height at every hue, which is what lets one set of numbers serve a whole palette.

Uniformity is a claim about differences, and that is what makes it useful for more than
ramps. [Interpolation](/color-interpolation) in a uniform space passes through the colours
a person would draw between the endpoints instead of veering through grey or through a hue
nobody asked for. [Gamut mapping](/gamut-mapping) walks chroma down in OKLCH precisely
because lightness and hue stay put while it does. Contrast scoring wants the same property
for a different reason: [relative luminance](/relative-luminance) is a physical quantity,
not a perceptual one, which is part of why [APCA](/apca) rebuilt the calculation around how
light and dark text actually behave.

Two honest limits. OKLCH is uniform enough for interface work, not perfect: its blues drift
in hue at high chroma, and no space built on a 1970s dataset is uniform for everyone.
And uniformity is about lightness and hue, not about contrast. Two steps that read as
equally far apart can still fail a contrast requirement, so a ramp built in OKLCH still
needs its [contrast ratios](/contrast-ratio) checked rather than assumed.
