Create CSS Toggle Switches
May 1, 2019 · ☕️ 1 min readcss
CSS has come a long way. You can now create toggle switches, among other awesome things, with just plain CSS.
This article will show you how you can create cool mobile-looking toggle switches by using just strictly CSS.
The HTML
<input type="checkbox" id="toggle" class="offscreen" />
<label for="toggle" class="switch"></label>The CSS
.switch {
position: relative;
display: inline-block;
width: 40px;
height: 20px;
background-color: rgba(0, 0, 0, 0.25);
border-radius: 20px;
transition: all 0.3s;
}
.switch::after {
content: '';
position: absolute;
width: 18px;
height: 18px;
border-radius: 18px;
background-color: white;
top: 1px;
left: 1px;
transition: all 0.3s;
}
input[type='checkbox']:checked + .switch::after {
transform: translateX(20px);
}
input[type='checkbox']:checked + .switch {
background-color: #7983ff;
}
.offscreen {
position: absolute;
left: -9999px;
}This effect is styling only the <label> element to look like a toggle switch, and hiding the actual <input> checkbox by positioning it offscreen. When clicking the label associated with the <input>element, it sets the <input> checkbox into the :checked state.
- The
forattribute associates the<label>with the appropriate<input>checkbox element by itsid. .switch::afterdefines a pseudo-element for the<label>to create the circular knob.input[type='checkbox']:checked + .switch::aftertargets the<label>’s pseudo-element’s style when the checkbox ischecked.transform: translateX(20px)moves the pseudo-element (knob) 20px to the right when the checkbox ischecked.background-color: #7983ff;sets the background-color of the switch to a different color when the checkbox ischecked..offscreenmoves the<input>checkbox element, which does not comprise any part of the actual toggle switch, out of the flow of document and positions it far away from the view, but does not hide it so it is accessible via keyboard and screen readers.transition: all 0.3sspecifies all property changes will be transitioned over 0.3 seconds, therefore transitioning the<label>’sbackground-colorand the pseudo-element’stransformproperty when the checkbox is checked.