In questo articolo vedremo come realizzare uno switch toggle usando i CSS e JavaScript. Questo tipo di componenti è molto popolare nelle interfacce web.
Partiamo da una semplice struttura HTML:
<input type="checkbox" class="toggle" name="toggle" value="1">
Come primissima operazione, dobbiamo racchiudere questo elemento checkbox in un contenitore con una classe specifica in modo da permettere l'applicazione degli stili CSS.
function setToggleStructure() {
const toggles = document.querySelectorAll('.toggle');
if(toggles.length === 0) {
return;
}
for(const toggle of toggles) {
const parent = toggle.parentElement;
const wrapper = document.createElement('div');
wrapper.className = 'toggle-wrap';
wrapper.innerHTML = toggle.outerHTML;
parent.appendChild(wrapper);
toggle.remove();
}
}
A questo punto la struttura del DOM apparirà come segue:
<div class="toggle-wrap">
<input type="checkbox" class="toggle" name="toggle" value="1">
</div>
Con i CSS, nel contenitore andremo a posizionare l'elemento checkbox in primo piano azzerandone l'opacità e inseriremo un blocco creato con il contenuto generato sullo sfondo che avrà come larghezza la metà della larghezza di .toggle-wrap
. Quando l'utente attiverà o disattiverà la checkbox, la classe .checked
permetterà il movimento orizzontale del blocco.
.toggle-wrap {
display: inline-block;
width: 3.2rem;
height: 1.7rem;
background-color: #eee;
border-radius: 5px;
position: relative;
cursor: pointer;
}
.toggle-wrap:before {
content: '';
display: block;
position: absolute;
top: 0;
left: 0;
width: 50%;
height: 100%;
z-index: 1;
background-color: #d41d6d;
transition: all 400ms ease-in;
transform: translateX(0);
border-radius: 5px;
opacity: 0.4;
}
.toggle-wrap.checked:before {
transform: translateX(100%);
opacity: 1;
}
.toggle-wrap .toggle {
display: block;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
cursor: pointer;
z-index: 2;
}
Ora con JavaScript dobbiamo gestire l'evento change
sulla checkbox in modo da impostare la proprietà value
sul valore corretto e aggiungere o rimuovere la classe .checked
sul contenitore.
function handleToggleChange() {
const toggles = document.querySelectorAll('.toggle');
if(toggles.length === 0) {
return;
}
for(const toggle of toggles) {
toggle.addEventListener('change', () => {
const parent = toggle.parentElement;
if(toggle.checked) {
toggle.value = 1;
} else {
toggle.value = 0;
}
parent.classList.toggle('checked');
});
}
}
Possiamo invocare il nostro codice JavaScript quando il DOM è completamente caricato:
document.addEventListener('DOMContentLoaded', () => {
setToggleStructure();
handleToggleChange();
});
Demo
Conclusione
Uno switch toggle rappresenta l'esempio perfetto di interazione tra il livello presentazionale (CSS) e quello comportamentale (JavaScript) nella realizzazione di interfacce web.