Creando Toggle Switches con CSS

El año pasado, con ocasión del Codepen Challenge de junio – Choice UI : Toggles, empecé a hacer varios de estos conmutadores o interruptores usando un input de tipo checkbox y algo de CSS. Acabado el año y viendo que los toggles creados ya llegaban a 10 los añadí a una Colección en Codepen y ahora los publico por aquí, para quien le pueda interesar.

El concepto es muy básico, tendremos un input de tipo checkbox y su label asociado que será donde crearemos los diferentes estilos dependiendo de si el input está checkeado o no. También podemos añadir más elementos de HTML dentro del label si fueran necesarios, o añadir nuevos elementos a continuación del label para crear otros detalles externos, como luces o textos.

Primero vamos con un ejemplo muy básico para entenderlo y después veremos 10 diseños de Toggles con diferentes niveles de dificultad.

HTML

Para este ejemplo simplemente necesitamos un input de tipo checkbox y su label asociado, para agruparlo lo meteremos todo dentro un div con la clase toggle que será el contenedor del toggle :

<div class="toggle">
 <input type="checkbox" id="btn">
 <label for="btn"></label>
</div>

Es importante que el input esté delante del label para poder evaluar la condición :checked del input con CSS y actuar en consecuencia en el label o en otros elementos.

Desde finales de 2023 la pseudo-clase :has de CSS es totalmente compatible con todos los navegadores modernos y gracias a ella se puede simplificar todo el proceso metiendo el input dentro del label y evaluando con :has si el label tiene un input checkeado dentro para modificar, o no, otros elementos en cada caso. Pero es muy reciente todo esto de la compatibilidad de :has, y además yo hice los toggles del modo tradicional (el input delante del label), así que lo vamos a ver de esta manera, más tradicional…

CSS

Con CSS vamos a crear los estilos para convertir el checkbox en un toggle :

.toggle es el contenedor y le ponemos el fondo gris y le redondeamos el borde.

label será el botón, le ponemos un tamaño, un fondo gris algo más oscuro y redondeamos el borde.

input no lo necesitamos ya que lo checkearemos con el label, así que directamente lo ocultamos.

input:checked + label se refiere al estado :checked del input y actúa en el label hermano del input, lo movemos a la derecha y le cambiamos el color.

.toggle {
  background: #eee;
  width: 100px;
  height: 50px;
  padding: 5px;
  border-radius: 50px;
  margin: 50px;
}

label {
  width: 40px;
  height: 40px;
  background: #ccc;
  display: flex;
  cursor: pointer;
  border-radius: 50px;
  transition: all 0.25s ease 0s;
}

input {
  display: none;
}

input:checked + label {
  margin-left: 50px;
  background: #47c;
}

Y ya está, ya tenemos un checkbox convertido en un toggle mucho más vistoso.

Podemos mejorarlo de manera muy simple usando los pseudo-elementos :before y :after para añadir unos pequeños textos informativos:

.toggle:before, .toggle:after {
  content: "ON";
  position: absolute;
  font-size: 12px;
  width: 40px;
  height: 40px;
  text-align: center;
  padding: 10px 0;
  z-index: 0;
  color: #47c;
}

.toggle:after {
  content: "OFF";
  margin-top: -40px;
  margin-left: 50px;
  color: #666;
}

label {
 position: relative;
 z-index: 1;
}

El mismo sistema se usa en los siguientes ejemplos que vamos a ver, añadiendo elementos HTML para crear más detalles, pero todo dependiente del input de tipo checkbox y de si este está checkeado o no.

Ejemplos

Vamos a ver ya los 10 ejemplos de Toggles con diferentes niveles de dificultad en su diseño prometidos al principio de este artículo. Los voy a ordenar de más sencillos a más complejos, aunque no será una escala exacta pues la complejidad dependerá en parte del HTML y por otro lado del CSS.

Todas las demos son editables, puedes cambiar la propiedad personalizada de CSS --sz para modificar el tamaño del toggle en cada demo, o cambiar algún color con las respectivas propiedades personalizadas.

Algunos de los toggles están inspirados en diseños de otros autores encontrados por la web, en esos casos se indica con un enlace al original.

1 Eye Toggle

Primer ejemplo con el efecto de un ojo abriéndose.

See the Pen Eye Toggle – CSS by Josetxu (@josetxu) on CodePen.

En el HTML se añaden unos span dentro del label. El primero .track para crear el fondo del toggle, El segundo .thumb que será el botón redondo incluyendo los párpados, y el último .eye anidado dentro de .thumb y en el que dibujaremos el ojo.

En el CSS se aprovechan los pseudo-elementos :before y :after del elemento .thumb para hacer los párpados. Se crean animaciones para cambiar el color de fondo a azul, mover el ojo y abrir cada uno de los párpados.

Inspirado en Switch de ididi en Dribbble.com.

2 Rail Toggle

Otro ejemplo con un raíl interno que se enciende al activarlo.

See the Pen Rail Toggle – CSS by Josetxu (@josetxu) on CodePen.

En el HTML se añade un span dentro del label y a continuación del label añadimos un div con la clase .rail que lleva otro span dentro para crear el raíl.

En el CSS creamos el botón con el label y su span anidado, y con el elemento .rail y su span anidado hacemos el raíl a dos colores. Añadimos una pequeña animación para mover el botón y listo.

Inspirado en Toggle de Tanveer Junayed en Dribbble.com

3 Skull Toggle

En el siguiente ejemplo se muestra una calavera que hace las veces de botón y un brazo de esqueleto que mueve el botón al checkearlo.

See the Pen Skull Toggle – CSS by Josetxu (@josetxu) on CodePen.

Aquí el HTML es algo más complejo ya que dentro del label se crean múltiples elementos, por un lado la calavera y la mandíbula, y por otro el brazo y la mano con todos sus huesecillos.

El CSS no se queda atrás, se pinta la calavera y la mandíbula como si fueran el botón y se crean todos los hueso del brazo y de la mano para que muevan el botón. Se necesitan varias animaciones con diferentes valores de animation-duration y animation-delay para mover la calavera, mover el brazo, y para cambiar ligeramente el color.

4 Trick/Treat Toggle

Muy parecido al anterior jugando con el «truco o trato» típico de Halloween.

See the Pen Trick/Treat Toggle – CSS by Josetxu (@josetxu) on CodePen.

En el HTML, además del brazo de esqueleto, también tenemos por otro lado el brazo humano creado del mismo modo con varios elementos span.

El CSS , aparte de llevar casi lo mismo que el anterior toggle, lleva una animación más para mover el brazo humano independientemente del brazo de esqueleto. También se modifica la calavera haciéndola tipo Jack de la peli Pesadilla antes de Navidad de Tim Burton. Y se convierte en un caramelo (o eso he intentado) para entrar en la temática del «truco o trato».

5 Modern Lighted Toggle

Un ejemplo tirando a más moderno y con un efecto de iluminado.

See the Pen Modern Lighted Toggle – CSS by Josetxu (@josetxu) on CodePen.

En el HTML dentro del label tenemos, por un lado un span con la clase track que a su vez contiene otro span con la clase txt, y por otro lado un span con la clase thumb que será el botón.

En el CSS creamos las animaciones pertinentes para mover el botón y cambiar el color de fondo con el pseudo-elemento :before del elemento .track . Los textos de ON y OFF están ambos escritos desde un principio en los pseudo-elementos :before y :after de .txt y simplemente se muestra uno u otro al mover el botón.

6 Elastic Toggle

Un intento de hacer un toggle con efecto elástico.

See the Pen Elastic Toggle – CSS by Josetxu (@josetxu) on CodePen.

En el HTML la única novedad es un elemento div con la clase lights con un par de elementos span dentro que nos serviran para hacer las dos luces.

Con CSS y animaciones deformamos el botón al moverlo, le cambiamos los colores al botón y apagamos o encedemos la luz que corresponda.

7 Dark Blue Toggle

Un ejemplo en azul oscuro con luz de encendido.

See the Pen Dark Blue Toggle – CSS by Josetxu (@josetxu) on CodePen.

El HTML es muy simple, un span con la clase thumb dentro del label que será el botón y un elemento div con la clase light para hacer la luz azul.

Con CSS las típicas animaciones, movemos el botón, encendemos el reflejo azul del botón y encendemos la luz situada a la derecha del botón indicando que está activado.

Inspirado en Switch (gif) de Matias Gallipoli en Dribbble.com

8 Rolling Toggle

Muy parecido al anterior pero el botón rueda en lugar de desplazarse.

See the Pen Rolling Toggle – CSS by Josetxu (@josetxu) on CodePen.

El HTML es prácticamente igual que el anterior toggle salvo por el elemento span con clase light que esta situado dentro del span con clase thumb, en lugar de estar a continuación del label.

El CSS es también muy parecido, se cambian los colores de la luz (rojo y verde), se crea la animación de rodar el botón en lugar de moverlo, se añaden los símbolos de encendido y apagado que se ocultan al activar o desactivar el toggle, y se modifica la sombra del fondo para darle un efecto de profundidad diferente.

Inspirado en iOS Switch de Alexander Spliid en Dribbble.com

9 Ergonomic Toggle

Un toggle con mando ergonómico y doble luz de activado o desactivado.

See the Pen Ergonomic Toggle – CSS by Josetxu (@josetxu) on CodePen.

El HTML es exactamente el mismo que el del Elastic Toggle, el label por un lado y las luces por el otro.

Con el CSS se complica un poco la cosa creando todo el dibujo del botón, con sus sombras y sus luces, la rejilla del fondo que queda bastante chula, y el efecto de hundido que se consigue con la propiedad box-shadow directamente sobre el label.

10 Toothed Toggle

Y el último toggle con un efecto de dientes, luces de encendido y apagado, y textos de ON y OFF.

See the Pen Toothed Toggle – CSS by Josetxu (@josetxu) on CodePen.

El HTML es igual que el del anterior toggle, pero dentro del label se añaden unos span con las clases track-top y track-bot , cada uno con varios elementos span dentro para crear los dientes.

En CSS solo se añade como novedad las animaciones del movimiento de los dientes, junto a las ya clásicas de mover el botón y encender o apagar las luces y los reflejos.

Inspirado en Anims de Dmitry Romanovich en Dribbble.com
Incluido en The MOST HEARTED of 2023 de Codepen.io

Dejo por aquí un enlace a la Colección CSS Toggles en Codepen que contiene los 10 Toggles mostrados en este artículo y que irá creciendo con nuevos toggles que tengo en mente.

A togglear…!!!

Deja un Comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *