Skip to content

Instantly share code, notes, and snippets.

@Kepler-69c
Last active August 26, 2023 16:58
Show Gist options
  • Save Kepler-69c/2395eafefa7199db79c70a0028f5a5f4 to your computer and use it in GitHub Desktop.
Save Kepler-69c/2395eafefa7199db79c70a0028f5a5f4 to your computer and use it in GitHub Desktop.
efficient & short dark mode snippet in JS

efficient & short dark mode snippet in JavaScript

short js snippet for dark mode, that listens to a button and to the theme change of the browser

Features:

  • save preferred theme in localstorage until preferred theme and browser theme maches
  • changes theme at page load
  • short and efficient, without css classes or custom styles
  • works with all modern browsers:
    • ✅ Chromium [Chrome, Brave, Edge, Opera]
    • ✅ Firefox
    • ✅ Safari [Epiphany]

Implementing

  1. add button
<button type="button">toggle dark mode</button> 
  1. add [data-theme="dark"] entry to the css stylesheet

you can change variables from :root...

:root {
  --background: white;
}

[data-theme="dark"] {
  --background: dark
}

...or change other entries directly

.someClass {
  color: black
}

[data-theme="dark"] .someClass {
  color: white
}
  1. add js code
// button listener
document.querySelector('[YOUR_BUTTON]').addEventListener("click", () => changeScheme('button'));

// OS listener
const schemeChange = e => e.matches && changeScheme('browser');
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", schemeChange);
window.matchMedia("(prefers-color-scheme: light)").addEventListener("change", schemeChange);

// return systemScheme unless localStorage is set;
function getPreferred() {
  const systemScheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
  const chosenScheme = localStorage.getItem("scheme") || systemScheme;
  if (systemScheme === chosenScheme) localStorage.removeItem("scheme");
  return [chosenScheme, systemScheme];
}

// change system scheme and set localStorage
function changeScheme(reason) {
  if (reason == "browser" && scheme == getPreferred()[1]) return;
  scheme = (scheme === 'dark') ? 'light' : 'dark';
  if (reason == "button") localStorage.setItem("scheme", scheme);
  document.documentElement.setAttribute('data-theme', scheme);
}

// if needed, change scheme on start
window.onload = () => {
  scheme = getPreferred()[0];
  document.documentElement.setAttribute('data-theme', scheme);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment