Skip to main content
🎨 CSS as a design system·Module B5 · Lesson 1
TaskStyle three elements: .a with color #3B82F6 (hex), .b with rgb(59 130 246 / 0.7) (modern rgb), .c with oklch(0.66 0.18 252) (OKLCH equivalent of the same blue).

Color formats: hex, rgb, hsl, oklch

75 XP7 min
Theory

Four ways to write the same color

.a { color: #3B82F6; }                /* hex — short, opaque (or #3B82F6ff for full alpha) */
.b { color: rgb(59 130 246 / 0.8); }  /* modern rgb (no commas, slash for alpha) */
.c { color: hsl(217 91% 60% / 0.8); } /* hue saturation lightness */
.d { color: oklch(0.66 0.18 252 / 0.8); } /* OKLCH — modern, perceptually uniform */

When to use each

  • `#hex` — copy-paste from Figma. Familiar. Fine for static brand colors.
  • `rgb()` — when you need alpha and the color came from a designer as RGB. Use the modern slash syntax: rgb(255 0 0 / 0.5).
  • `hsl()` — when you want to MANIPULATE the color (lighten, darken, shift hue) by tweaking one channel.
  • `oklch()` — when you want perceptual uniformity across hues. Best modern default.

What's wrong with hsl?

HSL was meant to be intuitive: "blue at 50% lightness, green at 50% lightness." But human vision isn't proportional to RGB lightness — at the same HSL lightness, yellow looks WAY brighter than blue. Algorithmic palette generation in HSL produces lumpy results.

What OKLCH fixes

  • L (lightness) — perceptual lightness. 0.5 looks like 0.5 across every hue.
  • C (chroma) — saturation. 0 = grey, ~0.3 = vivid.
  • H (hue) — degree on the color wheel (0-360).

Same L → same perceived brightness across blue, green, red. Critical for design-system palettes.

🔒

Sign up to start coding

Theory is open to everyone. The interactive editor, live preview, and check are unlocked with a 7-day free trial — card required, cancel anytime.

Sign up — free trial →

First 15 lessons in each track are free. No card needed for those.

PreviousNext lesson →

Get one Python or web tip a day — by email

Short, hand-written, no spam. Unsubscribe in one click.