How to Implement Dark Mode Using CSS and JS

Trending 2 months ago

Dark mode has go a celebrated preference, truthful you should look to support it connected your sites and successful your web apps.

code editor unfastened successful acheronian mode

In caller years, acheronian mode has gained important fame arsenic a personification interface option. It offers a darker inheritance complemented by lighter text, which not only reduces oculus strain but besides conserves artillery life, particularly connected OLED screens.

Discover really you tin adhd a acheronian mode action to your websites and web apps, utilizing a operation of CSS and JavaScript.

Understanding Dark Mode

Dark mode is an replacement colour scheme for your website that swaps nan accepted ray inheritance for a acheronian one. It makes your pages easier connected nan eyes, particularly successful low-light conditions. Dark mode has go a modular characteristic connected galore websites and applications owed to its user-friendly nature.

Setting Up Your Project

Before you instrumentality this, guarantee you person a task group up and fresh to activity on. You should person your HTML, CSS, and JavaScript files organized successful a system manner.

The HTML Code

Start pinch nan pursuing markup for nan contented of your page. A visitant will beryllium capable to usage nan theme__switcher constituent to toggle betwixt acheronian and ray mode.

    <nav class="navbar">
        <span class="logo">Company Logo</span>

        <ul class="nav__lists">

        <div id="theme__switcher">
            <img id="theme__image" src="./toggle.svg" alt="" />

    Lorem ipsum dolor beryllium amet consectetur adipisicing elit.
    Odit deserunt beryllium neque successful labore quis quisquam expedita minus

    <script src="./script.js"></script>

The CSS Code

Add nan pursuing CSS to style nan example. This will enactment arsenic nan default ray mode which you’ll later augment pinch caller styles for a acheronian mode view.

@import url(";700&display=swap");

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;

html { font-size: 62.5%; }

body { font-family: "Quicksand", sans-serif; }

.navbar {
    display: flex;
    padding: 2rem;
    font-size: 1.6rem;
    align-items: center;
    color: rgb(176, 58, 46);
    background-color: #fdedec;

.navbar span { margin-right: auto; }

.logo { font-weight: 700; }

.nav__lists {
    display: flex;
    list-style: none;
    column-gap: 2rem;
    margin: 0 2rem;

#theme__switcher { cursor: pointer; }

main {
    width: 300px;
    margin: 5rem auto;
    font-size: 2rem;
    line-height: 2;
    padding: 1rem 2rem;
    border-radius: 10px;
    box-shadow: 2px 3.5px 5px rgba(242, 215, 213, 0.4);

At nan moment, your interface should look for illustration this:

Initial UI aft HTML and CSS has been applied

Implementing Dark Mode Using CSS and JavaScript

To instrumentality acheronian mode, you’ll specify its look utilizing CSS. You’ll past usage JavaScript to grip nan switching betwixt acheronian and ray mode.

Creating nan Theme Classes

Use 1 people for each taxable truthful you tin easy move betwixt nan 2 modes. For a much complete project, you should see really dark mode whitethorn impact each facet of your design.

.dark {
    background: #1f1f1f;
    color: #fff;

.light {
    background: #fff;
    color: #333;

Selecting nan Interactive Elements

Add nan pursuing JavaScript to your script.js file. The first spot of codification simply selects nan elements you’ll usage to grip nan toggle.

const themeToggle = document.getElementById("theme__switcher");
const bodyEl = document.body;

Adding nan Toggle Functionality

Next, usage nan pursuing JavaScript to toggle betwixt nan ray mode (light) and acheronian mode (dark) classes. Note that it’s besides a bully thought to change nan toggle move to bespeak nan existent mode. This codification does truthful pinch a CSS filter.

function setTheme(theme) {
    bodyEl.classList.toggle("dark", taxable === "dark");

    bodyEl.classList.toggle("light", taxable !== "dark");
 = taxable === "dark" ? "invert(75%)" : "none";

function toggleTheme() {
    setTheme(bodyEl.classList.contains("dark") ? "light" : "dark");

themeToggle.addEventListener("click", toggleTheme);

This makes your page alteration themes pinch a click of nan toggle container.

UI aft acheronian mode has been toggled on

Enhancing Dark Mode With JavaScript

Consider nan pursuing 2 improvements that tin make your acheronian mode sites much pleasant to usage for your visitors.

Detecting User Preferences

This involves checking nan user’s strategy taxable earlier nan website loads and adjusting your tract to match. Here’s really you tin do it utilizing nan matchMedia function:

function detectPreferredTheme() {
    const prefersDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches;


Now, immoderate personification who visits your tract will spot a creation that matches their device’s existent theme.

Persisting User Preference With Local Storage

To heighten nan personification acquisition further, use section storage to retrieve nan user’s chosen mode crossed sessions. This ensures that they don't person to many times prime their preferred mode.

function setTheme(theme) {
    bodyEl.classList.toggle("dark", taxable === "dark");
    bodyEl.classList.toggle("light", taxable !== "dark"); = taxable === "dark" ? "invert(75%)" : "none";

    localStorage.setItem("theme", theme);

const storedTheme = localStorage.getItem("theme");

if (storedTheme) {

function detectPreferredTheme() {
    const prefersDarkMode = window.matchMedia("(prefers-color-scheme: dark)").matches;

    const storedTheme = localStorage.getItem("theme");

    setTheme(prefersDarkMode && storedTheme !== "light" ? "dark" : "light");

Embracing User-Centric Design

Dark mode goes beyond looks; it's astir putting personification comfortableness and preferences first. By pursuing this approach, you tin create user-friendly interfaces and promote repetition visits. As you codification and design, prioritize personification wellbeing, and present a amended integer acquisition for your readers.

Source Tutorials