Dev.to WebDev πŸ›  Dev πŸ‘ 0 πŸ“– 1 min read

Dark Mode in 12 Lines of CSS (No Library, No Framework)

Most dark-mode tutorials reach for a library or a theme provider. You don't need one. CSS variables already do the whole job: define your colours once, swap the values when a toggle flips, and let every element follow.

Most dark-mode tutorials reach for a library or a theme provider. You don't need one. CSS variables already do the whole job: define your colours once, swap the values when a toggle flips, and let every element follow.

Here is the complete theme from a working demo page I built:

:root{
  --bg:#ffffff;
  --text:#16202e;
  --card:#eef2f7;
  --accent:#c9a227;
}
body.dark{
  --bg:#0b1220;
  --text:#f5f0e1;
  --card:#16223a;
  --accent:#e7c34a;
}

That's the theme itself. Everything else on the page just uses the variables:

body{
  background:var(--bg);
  color:var(--text);
  transition:background .3s, color .3s;
}
.card{ background:var(--card); }
button{ background:var(--accent); }

The toggle

One button, one class on <body>, and localStorage so the visitor's choice survives the next visit:

const b = document.body;
if (localStorage.getItem('demo-theme') === 'dark') b.classList.add('dark');

document.getElementById('t').onclick = () => {
  b.classList.toggle('dark');
  localStorage.setItem('demo-theme', b.classList.contains('dark') ? 'dark' : 'light');
};

Why this works so well

  • One source of truth. Backgrounds, text, cards and buttons all read the same few variables, so the dark theme can't drift out of sync with the light one.
  • No flash of the wrong theme is handled by applying the saved class before the page settles β€” the check runs immediately.
  • Zero dependencies. Nothing to install, nothing to break on the next framework update. It works in a static HTML file, a WordPress theme, or inside any framework's stylesheet.

Dark mode isn't just a trend β€” visitors stay longer on pages that are easy on their eyes at night. With variables, adding it is an afternoon's small change, not a project.

I'm Mamad Mirza, a full-stack developer in the UK. I build a small working project every day β€” follow along here, or work with me on LaborX.

πŸ“° Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β€” full credit and traffic to the original publisher.