JSFiddle - React, Tailwind, and code Playground
by davidxmartins
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Theme Switcher</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="theme-switcher">
<input type="checkbox" id="theme-toggle">
<label for="theme-toggle" class="slider">
<span class="icon sun">☀️</span>
<span class="icon moon">🌙</span>
<span class="circle"></span>
</label>
</div>
<script src="script.js"></script>
</body>
</html>
CSS
body {
transition: background-color 0.3s ease;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
margin: 0;
}
/* Light mode default */
body {
background-color: #f0f0f0;
color: #333;
}
/* Dark mode */
body.dark {
background-color: #333;
color: #f0f0f0;
}
.theme-switcher {
position: relative;
}
#theme-toggle {
display: none;
}
.slider {
display: flex;
align-items: center;
width: 80px;
height: 40px;
background-color: #ccc;
border-radius: 20px;
position: relative;
cursor: pointer;
transition: background-color 0.3s ease;
}
.icon {
font-size: 20px;
width: 40px;
height: 40px;
display: flex;
justify-content: center;
align-items: center;
transition: transform 0.5s ease;
}
.sun {
color: #ffd700;
}
.moon {
color: red;
}
.icon:hover {
transform: rotate(360deg);
}
.circle {
position: absolute;
width: 36px;
height: 36px;
background-color: #fff;
border-radius: 50%;
top: 2px;
left: 2px;
transition: transform 0.3s ease;
}
#theme-toggle:checked + .slider {
background-color: #555;
}
#theme-toggle:checked + .slider .circle {
transform: translateX(40px);
}
JavaScript
document.getElementById('theme-toggle').addEventListener('change', function() {
document.body.classList.toggle('dark', this.checked);
});