DEV Community

Cover image for Light and dark mode in just 14 lines of CSS

Light and dark mode in just 14 lines of CSS

Salma Alam-Naylor on May 12, 2022

I like to dark mode all the things. But I also know lots of people who prefer light mode! To respect personal preferences and consider accessibilit...
Collapse
 
felixdusengimana profile image
Felix DUSENGIMANA

This is cool! Here's how you can do it with one line of CSS and achieve the same results:

:root{
  color-scheme: light dark;
}
Enter fullscreen mode Exit fullscreen mode

Check out this URL: codepen.io/phelixdusengimana/pen/O...

Advantages of this approach include:

  • It automatically changes form controls' appearance to fit the user's chosen theme.

  • It changes the text color and scrollbar theme based on the user's preferred UI theme.

Read more: developer.mozilla.org/en-US/docs/W...

Collapse
 
whitep4nth3r profile image
Salma Alam-Naylor

TIL!! Thanks for that! I guess if you wanted different shades of black and white for the foreground/background colours you’d still have to do a bit more work?

Collapse
 
felixdusengimana profile image
Felix DUSENGIMANA • Edited

Sure. If you want different background other than the CSS built-in you'd use the first approach.

Collapse
 
bmassioui profile image
Bouchaib MASSIOUI

I try to change my mode to dark in Ubuntu, but nothing happened :)

Collapse
 
felixdusengimana profile image
Felix DUSENGIMANA

Unfortunately, setting Ubuntu on dark mode won't set Chrome as well.
Thus, it's not as straightforward as Windows, and it will work a bit differently, but it's simple to set up.
I made this step-by-step guide to follow when changing chrome to dark mode in ubuntu: Link

Collapse
 
moopet profile image
Ben Sinclair

This is the way. I've never been a fan of using Javascript to switch themes. I've never actually implemented it before but if and when I do I'll do it your way. It might not work on every system yet, I'm not sure? But it'll get there in time if it doesn't.

Collapse
 
pcjmfranken profile image
Peter Franken

Here's a compatibility overview for the three major components to this implementation: caniuse.com/prefers-color-scheme,c...

The prefers-color-scheme is rather essential for pegging your css to the user's system theme, but the :root pseudo class and even the custom properties / variables could be left out - although that'd mean nesting all your css within those media queries 😉

Collapse
 
sinewalker profile image
Mike Lockhart

I use a static blog generator with a light theme that I have overridden by hand. Now with this idea I can just wrap my overrides in the media query.

Thread Thread
 
whitep4nth3r profile image
Salma Alam-Naylor

Sweet!

Collapse
 
whitep4nth3r profile image
Salma Alam-Naylor

This is the way! 🥳

Collapse
 
myleftshoe profile image
myleftshoe

Look what's coming this year - Change the accent-color automatically when light/dark mode changes !

Collapse
 
andre_adpc profile image
Andre Du Plessis • Edited

Thanks, Salma! A very handy read you gave us here. And there are some interesting spin-offs from the other folks here too. Thanks to all of you for keeping us on our toes!

And I'm back! I accepted @waylonwalker 's challenge and the comment by @shammisharma about doing it with CSS only. And yes, it was done. A lady from Taipei, Mu-An Chiou is the original creator of the work.

The details of is is not evident in her brief portfolio, but it is explained in great German-style detail by a gent named Philipp. I went and checked Philipp's site which uses the CSS implementation and W3C's CSS validator passes it with an all-clear.

Here is the link for those interested: kleinfreund.de/css-only-dark-mode/

The CodePen can be found here for those that want to dash straight to the honeypot. : codepen.io/kleinfreund/pen/bJwqpB

Collapse
 
polterguy profile image
Thomas Hansen

Super cool snippet :)

Collapse
 
andrewbaisden profile image
Andrew Baisden

Great snippet.

Collapse
 
abmakes profile image
Adriaan Boshoff

This is awesome, thank you. I just applied it to my #100daysofcode blog/journal. adriaanb.herokuapp.com

Collapse
 
whitep4nth3r profile image
Salma Alam-Naylor

Great work!

Collapse
 
laurilllll profile image
Lauri Lännenmäki

Good job with the article 👍

I really like this topic and I also have written a thorough article about ”How to create dark mode using only CSS” dev.to/laurilllll/how-to-create-da...

Check it out 💪

Collapse
 
robertbridda profile image
Robert Bridda

What about using

color-scheme: light dark
Enter fullscreen mode Exit fullscreen mode

developer.mozilla.org/en-US/docs/W...

Collapse
 
inspiredlabs profile image
Inspired Labs - London, United Kingdom

Dark mode in 10 lines of code: codepen.io/inspiredlabs/pen/OJQpPg...

Collapse
 
whitep4nth3r profile image
Salma Alam-Naylor

Interesting approach! Except I'm viewing it in dark mode which shows white text on a grey background — which I can't read 😅

Collapse
 
inspiredlabs profile image
Inspired Labs - London, United Kingdom

Exactly! Using var(--color-bg, inherit) uses the browser's fallback value. Perhaps one day, browsers will simply have a algo to do this themselves, such as Luma: css-tricks.com/switch-font-color-f...

Collapse
 
andresbecker profile image
Andres Becker

Thanks for sharing

Collapse
 
connor_cc profile image
Connor

Very valuable article

Collapse
 
frodolight profile image
Frodo

Very detailed, thanks.

Collapse
 
masonharper profile image
Mason Marper

Thanks for writing this.

Collapse
 
cjw profile image
Clifford Watson

Awesome article.

Collapse
 
fahrioghanial profile image
Fahrio Ghanial

add

Collapse
 
waylonwalker profile image
Waylon Walker

I've been wanting to implement this for awhile, If I want to also include an override toggle button, do I need js?

Collapse
 
shammisharma profile image
shammisharma

yes I think js will be a proper way to implement it. Although we can use : checked , :not(: checked) property of checkbox. but I'm not sure how it will turn out.