Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dark Mode not working during loading time

I'm trying to make a dark mode toggle button which can toggle between dark and light mode on click, User preference is also stored using localStorage. The user should manually press the button to toggle to other mode. If the user's choice is dark mode, Every page will be in dark mode and it doesn't turn to light mode on refreshing. Everything looks fine upto now but the real issue comes with loading time. The load time of a page is nearly 1 second and in that time, Page appears to be in light mode even if user's choice is dark mode. I don't want that to happen. I want loading time section in dark mode if user's choice is dark. This is my current code:

<script>
const body = document.querySelector('body');
function toggleDark() {
  if (body.classList.contains('dark')) {
    body.classList.remove('dark');
    localStorage.setItem("theme", "light");
  } else {
    body.classList.add('dark');
    localStorage.setItem("theme", "dark");
  }
}

if (localStorage.getItem("theme") === "dark") {
  body.classList.add('dark');
}
</script>
<style>
body {background-color: #ffffff}
body.dark {background-color: #000000; color: #ffffff} 
</style>
<button class="dark-mode" id="btn-id" onclick="toggleDark()"></button>
like image 226
Maniac Piano Avatar asked Sep 02 '25 04:09

Maniac Piano


1 Answers

Another alternative is to load the script in the <head> element, and toggle the class on html element

To do so, you use document.documentElement.classList as that is the HTML element

Then change your CSS to

html.dark body {}

etc .. the class selector on HTML

html body {background-color: #ffffff}
html.dark body {background-color: #000000; color: #ffffff}
<script>
  const body = document.querySelector('body');

  function toggleDark() {
    if (document.documentElement.classList.contains('dark')) {
      document.documentElement.classList.remove('dark');
      //localStorage.setItem("theme", "light");
    } else {
      document.documentElement.classList.add('dark');
      //localStorage.setItem("theme", "dark");
    }
  }

  //if (localStorage.getItem("theme") === "dark") {
    document.documentElement.classList.add('dark');
  //}
</script>
<button class="dark-mode" id="btn-id" onclick="toggleDark()">DARK</button>

Due to restrictions, localStorage is unavailable on stack overflow - uncomment those lines to see it work

Or - see https://jsfiddle.net/e9zg2p4c/

like image 97
Jaromanda X Avatar answered Sep 05 '25 01:09

Jaromanda X