CSS Variables for Theme Switching
Define a complete color palette with CSS custom properties and switch themes by toggling a data attribute.
CSS Variables for Theme Switching is a free React Academy lesson on CoddyKit — lesson 2 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the React Academy learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Defining Color Tokens on :root
CSS custom properties (variables) defined on :root are globally available throughout the stylesheet. You define a complete color palette once — backgrounds, text colors, surfaces, borders — and reference them everywhere. This single source of truth makes theme switching trivial.
Dark Theme Overrides with data-theme
When a data-theme="dark" attribute is set on document.documentElement, a CSS selector like [data-theme='dark'] overrides the root variables with dark values. Components reference var(--color-bg) and automatically pick up the new values without any code changes.
Key Variables to Define
At minimum, define: --color-bg (page background), --color-text (primary text), --color-primary (brand color), --color-surface (card/panel background), and --color-border (dividers). A consistent token set prevents ad-hoc color values from appearing in components.
Applying Variables in Component Styles
In your component CSS, reference variables like background: var(--color-bg) and color: var(--color-text). You can also provide a fallback value: var(--color-bg, #ffffff). The browser resolves the variable at paint time, so a single class works for both light and dark themes.
Smooth Transition When Switching
Add transition: background-color 200ms, color 200ms to the :root selector. When the data-theme attribute changes, all elements that use CSS variables will animate to their new values simultaneously. This creates a polished feel without any JS animation code.
CSS Variables vs JS-Controlled Inline Styles
Managing theme via CSS variables is superior to setting inline styles from JavaScript. The browser handles all style recalculations natively, there are no extra React re-renders triggered for every themed child component, and the CSS cascade handles inheritance automatically. JS only needs to toggle one attribute on the root element.
OS-Level Fallback with prefers-color-scheme
You can combine CSS variables with the @media (prefers-color-scheme: dark) query as a CSS-only fallback. Define your dark overrides inside the media query in addition to (or instead of) the data-theme selector. This ensures dark mode works even if JavaScript has not run yet.
Combining data-theme with Media Query Fallback
The most robust approach layers both mechanisms: the @media query provides the OS default, while a data-theme attribute allows user override via JavaScript. When the attribute is present it wins due to specificity; when absent, the media query takes effect.
Dark Mode Images
For images that look poor on dark backgrounds, use the HTML picture element with a source media="(prefers-color-scheme: dark)" child. The browser selects the dark variant automatically. For SVG icons in CSS, you can use filter: invert(1) as a quick approximation.
Scoped Theme Variables
CSS variables can also be scoped to individual components by defining them on a component root element rather than :root. This enables per-component theming, such as a sidebar with its own background token that differs from the page background, all still switching correctly with the global theme toggle.
Debugging CSS Variables in DevTools
Chrome DevTools shows resolved CSS variable values in the Styles panel. Click the variable reference to jump to its definition. This makes it easy to verify that the correct dark or light token is being applied to any element. You can also edit variable values live in the panel.
CSS Custom Properties for Theming
Which CSS selector is used to define global CSS custom properties that apply to the entire document?
Lesson Recap: CSS Variables for Theme Switching
CSS custom properties on :root provide a centralized token system for themes. Toggle a data-theme attribute on the html element to switch themes instantly. Add CSS transitions for smooth animation, use the prefers-color-scheme media query as a CSS-only fallback, and avoid per-component JS style overrides.
Frequently asked questions
Is the “CSS Variables for Theme Switching” lesson free?
Yes — the full text of “CSS Variables for Theme Switching” is free to read here on the web, and the React Academy course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the React Academy course, upgrade to CoddyKit PRO.
What will I learn in “CSS Variables for Theme Switching”?
Define a complete color palette with CSS custom properties and switch themes by toggling a data attribute. You practise React Academy with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start React Academy?
No prior experience is required. React Academy on CoddyKit is structured for beginners through advanced learners; this is — lesson 2 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “CSS Variables for Theme Switching” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this React Academy lesson?
Yes. Every React Academy lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Detecting System Color Scheme
- CSS Variables for Theme Switching
- React Context for Theme State
- Persisting Theme and Preventing Flash