Toggle Swith Button o Botón deslizante

Un toggle switch botón es un botón deslizante que emula un interruptor real tipo on/off o encendido apagado.

Y este tipo de elementos se puede construir sin necesidad de Javascript, utilizando solo HTML y estilos CSS.

En esta página te explico una manera de crearlo, existen muchas formas y variantes, pero se basan en el mismo mecanismo: el botón tipo checkbox que puede ser detectado por CSS mediante la pseudo clase :checked

Toggle Switch Button o Botón deslizante simple

El código HTML

Para el ejemplo que ilustre este efecto usamos un código html de lo más simple: un bloque div y dentro un control input tipo checkbox con su correspondiente elemento label.

El bloque es el contenedor y le asignaremos una clase btoggleContainer, el input va a quedar invisible con la clase toggle y e labal de este input con la clase switch va a se quien active o desactivo el checkbox (recuerda que va a ser invisible)

<div class="toggleContainer">

<input type="checkbox" id="switch" class="toggle">

<label for="switch" class="switch"></label>

</div>

Estilos CSS

La clave es el botón input que puede estar activado o desactivado (recuerda que es un checkbox). Esto lo detecta CSS mediante la pseudo clae checked.

El selector .toggle:checked será el aplicado cuando el inut esté seleccionado.

El elemento siguiente a .toggle lo seleccionamos con el signo + es precisamente la etiqueta o label y le asignamos un pseudo elemento ::before para contener el botón que se desplazará al pulsar. Al mismo tiempo que se desplaza cambia el color de fondo del botón.

A estos cambios se les aplica un propiedad transition para que se realicen de forma gradual.

.toggleContainer{

position: relative;

width: 90px;

height: 30px;

}

.toggle{

position: absolute;

width: 0;

height: 0;

& + .switch{

position:relative;

display: block;

background: lightgray;

width: 90px;

height: 30px;

cursor: pointer;

border-radius: 30px;

transition: 0.5s;

}

&:checked + .switch{

background: red;

}

& + .switch:before{

content:"";

position: absolute;

width: 28px;

height: 28px;

top: 50%;

transform: translateY(-50%);

background: #320c0c;

border-radius: 50%;

margin: 0px 2px;

left: 0%;

transition: 1s;

}

&:checked + .switch:before{

left: 100%;

transform: translate(calc(-100% - 2px), -50%);

}

}

En este ejemplo he usado la facilidad de CSS para anidar declaraciones de etilos, me parece una forma interesante de estructurar el código CSS y hacerlo más legible (en este caso da un poco igual, pero en proyectos grandes viene muy bien). Si te gusta compártelo.