Skip to main content
🎨 CSS as a design system·Module B5 · Lesson 5
TaskBuild a dark-mode-aware page. :root tokens for light. @media (prefers-color-scheme: dark) :root overrides for dark. Add color-scheme: light dark to :root. body uses var(--bg), color var(--text). .card uses var(--surface) + border var(--border).

Dark mode via prefers-color-scheme

100 XP7 min
Theory

Dark mode in 8 lines of CSS

:root {
  --bg: white;
  --text: oklch(0.20 0 0);
  --surface: oklch(0.98 0 0);
  --border: oklch(0.90 0 0);
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: oklch(0.18 0 0);
    --text: oklch(0.95 0 0);
    --surface: oklch(0.22 0 0);
    --border: oklch(0.30 0 0);
  }
}

body { background: var(--bg); color: var(--text); }

prefers-color-scheme matches the user's OS setting. If they have macOS in dark mode, your site is dark. Light mode, your site is light. They flip the setting → your site flips automatically.

Custom properties bridge the gap — the COMPONENTS reference var(--bg), the THEME just changes what --bg resolves to.

Add color-scheme to opt in

:root { color-scheme: light dark; }

Tells the browser "this page supports both modes." Browser uses the right defaults for form controls (<input>, <select> get dark UI), scrollbar colors, and the <dialog> backdrop.

Without this, scrollbars stay light-themed on a dark page — looks broken.

Don't ship dark mode without testing it

Dark mode often surfaces:

  • Low-contrast text that was barely readable in light mode (now invisible).
  • Background images with white edges (visible on dark canvas).
  • Borders too dark to see.

Test BOTH modes in Chrome DevTools → Rendering → "Emulate CSS media feature prefers-color-scheme."

🔒

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.