Skip to content
Advertisement

Keep toggle switch enabled or disabled when page is switched or refreshed

I got a toggle that switches between dark mode and light mode:

<div class="dark-mode-toggler">
    <input type="checkbox" id="dark-mode-toggler"/>
    <label for="dark-mode-toggler" aria-label="Toggler for Dark Mode"></label>
</div>

Then I got a script that switches to dark mode when the toggle switch is clicked:

<script>
              // check for saved 'darkMode' and 'darkModeToggle' in localStorage
              let darkMode = localStorage.getItem('darkMode');

              const darkModeToggle = document.querySelector('#dark-mode-toggler');
              

              const enableDarkMode = () => {
                // 1. Add the class to the body
                document.body.classList.add('darkmode');
                // 2. Update darkMode in localStorage
                localStorage.setItem('darkMode', 'enabled');
              }

              const disableDarkMode = () => {
                // 1. Remove the class from the body
                document.body.classList.remove('darkmode');
                // 2. Update darkMode and toggle in localStorage 
                localStorage.setItem('darkMode', null);
              }
              
              // If the user already visited and enabled darkMode
              // start things off with it on
              if (darkMode === 'enabled') {
                enableDarkMode();
              }

              // When someone clicks the button
              darkModeToggle.addEventListener('click', () => {
                // get their darkMode setting
                darkMode = localStorage.getItem('darkMode');
                
                // if it not current enabled, enable it
                if (darkMode !== 'enabled') {
                  enableDarkMode();
                // if it has been enabled, turn it off  
                } else {  
                  disableDarkMode(); 
                }
              });
</script>

But when I refresh or switch page, the toggle switch is reset. How can we use localStorage to save the toggle switch status and load the current status when switching or refreshing pages?

Here is my CSS for completeness

             .dark-mode-toggler {
                position: fixed;
                top: 5px;
                right: 20px;
              }
              .dark-mode-toggler label {
                position: relative;
              }
              .dark-mode-toggler input[type='checkbox'] {
                display: none;
              }
              .dark-mode-toggler input[type='checkbox'] + label::before {
                content: '';
                display: block;
                height: 26px;
                width: 60px;
                background: #fff;
                border: 2px solid #96979c;
                border-radius: 15px;
                position: absolute;
                top: 0px;
                left: -65px;
              }
              .dark-mode-toggler input[type='checkbox'] + label::after {
                content: '';
                display: block;
                height: 20px;
                width: 20px;
                background: #96979c;
                border: 2px solid #fff;
                border-radius: 50%;
                position: absolute;
                top: 3px;
                left: -62px;
                transition: all 0.4s ease-in;
              }
              .dark-mode-toggler input[type='checkbox']:checked + label::before {
                background: #000;
                border: 2px solid #fff;
              }
              .dark-mode-toggler input[type='checkbox']:checked + label::after {
                left: -28px;
                background: #000;
                border: 2px solid #fff;
                transition: all 0.4s ease-in;
              }
              :root {
                --clr-light: transparent;
                --clr-dark: #00332a;
                --clr-primary: #dbffa2;
                --clr-secondary: #c3fcf2;
                --clr-accent: #ff7750;
              
                --foreground: var(--clr-dark);
                --background: var(--clr-light);
              }
              .darkmode {
                --clr-light: #fdffc4;
                --clr-dark: #00332a;
                --clr-primary: #202302;
                --clr-secondary: #00100d;
                --clr-accent: #ff7750;
              
                --foreground: var(--clr-light);
                --background: var(--clr-dark);
              }
              body {
                background: var(--background);
                color: var(--foreground);
              }

Answer

The problem is that you don’t set the initial state of the checkbox on page reload. You’ll need to set the checked attribute of the checkbox on page refresh to show that the mode is enabled.

const enableDarkMode = () => {
  // 1. Add the class to the body
  document.body.classList.add('darkmode');
  // 2. Update darkMode in localStorage
  localStorage.setItem('darkMode', 'enabled');
  // 3. toggle the checkbox
  darkModeToggle.setAttribute('checked', true);
}
Advertisement