Skip to main content
← 🎨 CSS as a design systemΒ·Module B5 Β· Lesson 8
TaskBuild a hero with a vibrant gradient. .hero has background linear-gradient(in oklch 135deg, oklch(0.66 0.18 252), oklch(0.66 0.18 320)). min-height 200px, color white, padding 24px, font-family system-ui sans-serif.

Gradients in 2026: oklch interpolation

75 XP6 min
Theory

The "muddy middle" problem (and its fix)

.old { background: linear-gradient(to right, blue, yellow); }

In sRGB, blue→yellow goes through MUDDY GRAY in the middle. Because the math averages RGB channels and "blue + yellow = somewhere brown."

.modern { background: linear-gradient(in oklch to right, blue, yellow); }

in oklch tells the browser to interpolate in OKLCH space. The middle stays vibrant. Looks like a smooth rainbow instead of muddy mush.

Other color spaces

linear-gradient(in srgb,           ...);
linear-gradient(in hsl shorter hue, ...);  /* hue takes the shorter angular path */
linear-gradient(in hsl longer hue,  ...);  /* takes the long way around */
linear-gradient(in oklch,           ...);
linear-gradient(in lab,             ...);

For most "color A to color B" gradients, in oklch is the safe modern default.

Conic gradients

background: conic-gradient(in oklch from 90deg, red, yellow, green, cyan, blue, magenta, red);

Same color-space rules apply to radial-gradient and conic-gradient.

Hard stops

background: linear-gradient(to right, blue 0% 50%, yellow 50% 100%);

color 0% 50% means "this color from 0% to 50% with no transition" β€” creates a sharp boundary. Useful for stripe patterns or two-tone backgrounds.

πŸ”’

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 10 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.