'How to make html and js to remember users dark theme setting [duplicate]
I am making a website for my discord bot (https://beast-bot.ga) i made a dark theme feature which will switch the website from light mode to dark mode but when i refresh the page the website will switch back to light mode is there any way to fix this like saving the data in a cookie or something.
my js
var icon = document.getElementById("icon");
icon.onclick = function(){
document.cookie = "theme=dark";
document.body.classList.toggle("dark-theme");
if(document.body.classList.contains("dark-theme")){
icon.src = "images/sun.png";
}else{
icon.src = "images/moon.png"
}
}
style.css
* {
margin: 0;
padding: 0;
}
@import url("https://fonts.googleapis.com/css2?family=Nunito:wght@700&family=Quicksand:wght@600&display=swap");
@import url("https://fonts.googleapis.com/css?family=Archivo:400,700");
@import url("https://fonts.googleapis.com/css2?family=Oswald&display=swap");
@import url("https://fonts.googleapis.com/css?family=Source+Code+Pro");
@import url("https://fonts.googleapis.com/css2?family=Open+Sans+Condensed:wght@300&display=swap");
/*Desktop*/
:root{
--normal:url(images/wave-haikei.svg);
--darks: url(images/wave-black.svg);
--text-theme: white;
--cont2: url(images/wave-rot.PNG);
}
.dark-theme{
--normal: url(images/wave-black.svg);
--text-theme: white;
--cont2: url(images/black-wave-rot.svg);
}
/*Desktop reals*/
@media screen and (min-width: 1301px){
.container {
height: auto;
width: 100%;
background-image: var(--normal);
background-position: center;
background-size: cover;
padding-left: 5%;
padding-right: 5%;
box-sizing: border-box;
position: relative;
}
.title {
font-family: "Quicksand", sans-serif;
font-size: 72px;
color: var(--text-theme);
position: relative;
top: 200px;
margin-left: 200px;
user-select: none;
}
/* Add a black background color to the top navigation */
.topnav {
background-color: black;
overflow: hidden;
}
/* Style the links inside the navigation bar */
.topnav a {
float: left;
color: #0087ca;
text-align: center;
font-family: "Nunito", sans-serif;
padding: 14px 16px;
text-decoration: none;
font-size: 17px;
}
/* Change the color of links on hover */
.topnav a:hover {
background-color: #ddd;
color: black;
}
/* Add a color to the active/current link */
.topnav a.active {
color: #0087ca;
}
.title .img {
width: 400px;
height: 400px;
left: 600px;
bottom: 250px;
position: relative;
}
.infotit {
font-size: 10px;
color: var(--text-theme);
}
.hover-underline-animation a {
display: inline-block;
position: relative;
color: #0087ca;
}
.hover-underline-animation a:after {
content: "";
position: absolute;
width: 100%;
transform: scaleX(0);
height: 6px;
bottom: 0;
left: 0;
background-color: #0087ca;
transform-origin: bottom right;
transition: transform 0.25s ease-out;
}
.hover-underline-animation a:hover:after {
transform: scaleX(1);
transform-origin: bottom left;
}
.trust {
font-size: 26px;
font-family: "Quicksand", sans-serif;
position: relative;
color: var(--text-theme);
text-align: center;
}
.info .quote {
font-size: 36px;
font-family: "Quicksand", sans-serif;
position: relative;
text-align: center;
bottom: 100px;
color: var(--text-theme);
}
.info .btn {
text-align: center;
position: relative;
}
.info .quoto {
text-align: center;
font-family: "Quicksand", sans-serif;
font-size: 36px;
bottom: 50px;
position: relative;
color: var(--text-theme);
}
.info .h11 {
text-align: center;
position: relative;
bottom: 20px;
font-family: "Quicksand", sans-serif;
font-size: 20px;
color: var(--text-theme);
}
.info .h11 .h33 {
color: red;
}
.info .h11 .muchmore_txt {
color: red;
}
.f_txt {
font-size: 26px;
color: var(--text-theme);
}
.more_txt {
font-size: 26px;
color: var(--text-theme);
}
.footer {
font-family: "Quicksand", sans-serif;
text-align: center;
background-color: gray;
height: 100px;
}
/*MORE CONTENTS*/
.container2 {
width: 100%;
height: auto;
background-image: var(--cont2);
object-fit: cover;
background-size: cover;
background-repeat: no-repeat;
overflow: auto;
}
.title2 {
font-size: 10px;
font-family: "Quicksand", sans-serif;
color: white;
text-align: center;
border-style: groove;
}
.hideme {
opacity: 0;
}
.minecraft {
float: right;
margin-top: 10%;
text-align: center;
font-size: 26px;
color: white;
font-family: "Nunito", sans-serif;
}
.mcimg {
width: 605px;
height: 300px;
border-color: red;
}
.mcpara {
font-size: 15px;
}
.joke {
float: left;
margin-top: 40%;
text-align: center;
font-size: 26px;
color: white;
font-family: "Nunito", sans-serif;
}
.jokeimg {
width: 805px;
height: 300px;
}
.jokepara {
font-size: 15px;
}
.roast {
float: right;
margin-top: 40%;
text-align: center;
font-size: 26px;
color: white;
font-family: "Nunito", sans-serif;
}
.roastimg {
width: 705px;
height: 300px;
}
.roastpara {
font-size: 15px;
}
.animegif {
float: left;
margin-top: 40%;
text-align: center;
font-size: 26px;
color: white;
font-family: "Nunito", sans-serif;
}
.animeimg {
width: 605px;
height: 300px;
}
.animapara {
font-size: 15px;
}
.meme {
float: right;
margin-top: 40%;
text-align: center;
font-size: 26px;
color: white;
font-family: "Nunito", sans-serif;
}
.memeimg {
width: 705px;
height: 400px;
}
.memepara {
font-size: 15px;
}
my index.html https://pastebin.com/jKMT14Nk
Solution 1:[1]
Didn't tested it. But I guess it should work. So basically what you do is on page load you check if there is an item theme inside of the localstorage that has the value dark if so, you toggle the theme.
Otherwise you toggle the value of the property theme inside of the localstorage, as well as the class on your body and the icon as soon as you click on it. Sadly you didn't provide any HTML that's why I couldn't test it.
This should completely replace the js you posted above.
const themeToggle = document.getElementById("icon");
const darkThemeClass = 'dark-theme';
const toggleTheme = () => {
setTheme(document.body.classList.contains(darkThemeClass));
}
const setTheme = (theme) => {
localStorage.setItem('theme', theme ? 'light' : 'dark');
themeToggle.src = `images/${!theme ? 'sun' : 'moon'}.png`;
document.body.classList.toggle(darkThemeClass, !theme);
}
themeToggle.addEventListener('click', toggleTheme);
(() => localStorage.getItem('theme') === 'dark' && setTheme(false))();
Solution 2:[2]
Maybe localStorage
would help?
localStorage
keeps all the things you need to save.
For more info, go here.
Edit:
function toggleModes(bool) {
if (new Number(bool) == 0) {
localStorage.setItem("isDarkMode", "0")
} else if (new Number(bool) == 1) {
localStorage.setItem("isDarkMode", "1")
} else {
localStorage.setItem("isDarkMode", "1")
}
}
if (localStorage.getItem("isDarkMode") == null) {
toggleModes(/* default setting */)
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 |