I want to have a button inside my navbar (ul li
) that can toggle between theme=light
and theme=dark
. However, only activating dark mode works.
Code:
I created a button
<li><a href="#" onclick="darkMode()"><i class="fas fa-moon"></i></a></li>
, with a JS function
function darkMode () { var isOn = false; if(Boolean(isOn) === false) { document.documentElement.setAttribute('data-theme', 'dark'); var isOn = true; } else if(Boolean(isOn) === true) { document.documentElement.setAttribute('data-theme', 'light'); var isOn = false; } }
and my css looks like this:
:root, [data-theme="light"] { --bg-color: #ffffff; --bg-color-inv: #000000; --outline-color: #000000; --text-primary: #000000; --text-primary-inv: #ffffff; --text-secondary: #a4a4a4; --text-secondary-hover: #000000; --chivo: 'Chivo', sans-serif; } [data-theme="dark"] { --bg-color: #121212; --bg-color-inv: #ffffff; --outline-color: #ffffff; --text-primary: #ffffff; --text-primary-inv: #000000; --text-secondary: #5b5b5b; --text-secondary-hover: #ffffff; }
Advertisement
Answer
1. You start the function by setting the isOn
to false
. so Boolean(isOn) === false
alwaeys return true
. you should init the isOn
variable outside the function
2 Why you convert the isOn
to boolean? it’s already boolean type..
3 You not really need else if
.. if it is not false it is true..
4. as mentioned in the comment below, not need reinitiate the isOn
inside the if else
var isOn = false; function darkMode () { if(!isOn) { document.documentElement.setAttribute('data-theme', 'dark'); isOn = true; } else { document.documentElement.setAttribute('data-theme', 'light'); isOn = false; } }
in even more elegant way, you can do:
var isOn = false; function darkMode () { document.documentElement.setAttribute('data-theme', ['dark', 'light'][+isOn]); isOn = !isOn; }
explanation
+isOn
convert it to number, so true
become 1
and false
become 0
.
Then you use this number as index to choose dark
or light
accordingly.
isOn=!isOn
flip the current value of isOn
– true
become false
and false
become true