Forms & inputs
Toggle Switch
An accessible on and off switch built from a hidden checkbox and a styled track and knob, with a status label.
<div class="toggleswitch-row">
<label class="toggleswitch-switch">
<input type="checkbox" class="toggleswitch-input">
<span class="toggleswitch-track"><span class="toggleswitch-knob"></span></span>
</label>
<span class="toggleswitch-status">Off</span>
</div>
.toggleswitch-row {
box-sizing: border-box;
display: flex;
align-items: center;
gap: 12px;
font-family: system-ui, -apple-system, sans-serif;
}
.toggleswitch-switch {
position: relative;
display: inline-block;
width: 46px;
height: 26px;
cursor: pointer;
}
.toggleswitch-input {
opacity: 0;
position: absolute;
width: 100%;
height: 100%;
margin: 0;
cursor: pointer;
}
.toggleswitch-track {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #d1d5db;
border-radius: 999px;
transition: background-color 0.2s ease;
}
.toggleswitch-knob {
position: absolute;
top: 3px;
left: 3px;
width: 20px;
height: 20px;
background-color: #ffffff;
border-radius: 50%;
box-shadow: 0 1px 3px rgba(17, 24, 39, 0.3);
transition: transform 0.2s ease;
}
.toggleswitch-input:checked + .toggleswitch-track {
background-color: #3b82f6;
}
.toggleswitch-input:checked + .toggleswitch-track .toggleswitch-knob {
transform: translateX(20px);
}
.toggleswitch-status {
font-size: 14px;
font-weight: 600;
color: #374151;
}
var toggleswitchInput = document.querySelector('.toggleswitch-input');
var toggleswitchStatus = document.querySelector('.toggleswitch-status');
toggleswitchInput.addEventListener('change', function () {
toggleswitchStatus.textContent = toggleswitchInput.checked ? 'On' : 'Off';
});