Color comparisons

8 old vs modern color CSS techniques, side by side.

Browser compatibility:

Readable text without manual contrast checks

Limited availability
Old
/* Hardcode a text color per background */.badge-blue   {  background: #1e40af;  color: white;}.badge-yellow   {  background: #fde047;  color: black;}/* Repeat for every color variant */
Modern
.badge   {  background: var(--bg);  color: contrast-color(var(--bg));}

Perceptually uniform colors with oklch

Widely available
Old
/* HSL: same L value, different perceived brightness */--yellow: hsl(60 100% 50%);/* blinding */--blue:   hsl(240 100% 50%);/* dark *//* manually tweak each shade to look balanced */--brand-light: hsl(246 87% 68%);
Modern
/* oklch: L is perceptually uniform across hues */--brand:       oklch(0.55 0.2 264);--brand-light: oklch(0.75 0.2 264);--brand-dark:  oklch(0.35 0.2 264);/* only L changes */

Frosted glass effect without opacity hacks

Widely available
Old
.card::before   {  content: '';  position: absolute;  inset: 0;  background-image: url(bg.jpg);  background-size: cover;  filter: blur(12px);  z-index: -1;}
Modern
.glass   {  backdrop-filter: blur(12px) saturate(1.5);  background: rgba(255,255,255,.1);}

Vivid colors beyond sRGB

Newly available
Old
.hero   {  color: #c85032;}/* Hex, rgb(), hsl() are sRGB. Limited on wide-gamut screens. */
Modern
.hero   {  color: oklch(0.7 0.25 29);}/* Or: color(display-p3 1 0.2 0.1) for P3. */

Color variants without Sass functions

Newly available
Old
/* Sass: @use 'sass:color'; *//* Sass: color.adjust($brand, $lightness: 20%) */.btn   {  background: lighten(var(--brand), 20%);}
Modern
.btn   {  background:    oklch(from var(--brand) calc(l + 0.2) c h);}

Dark mode colors without duplicating values

Newly available
Old
:root   {  --text: #111;  --bg: #fff;}@media (prefers-color-scheme: dark)   {  :root   {    --text: #eee;    --bg: #222;  }}
Modern
:root   {  color-scheme: light dark;  color: light-dark(#111, #eee);}

Styling form controls without rebuilding them

Widely available
Old
input[type="checkbox"]   {  appearance: none;  width: 1.25rem;  height: 1.25rem;  border: 2px solid ...;  background: ...;  border-radius: ...;}
Modern
input[type="checkbox"],input[type="radio"]   {  accent-color: #7c3aed;}

Mixing colors without a preprocessor

Newly available
Old
// _variables.scss$blue: #3b82f6;$pink: #ec4899;$blend: mix($blue, $pink, 60%);
Modern
.card   {  background: color-mix(     in oklch, #3b82f6 60%, #ec4899   );}

Other categories

ESC