Cómo hacer un checkbox en HTML
Una casilla de verificación es un <input type="checkbox">. Ponla dentro de un <label> con su texto, así al pulsar el texto también se marca. Marca una casilla o las dos y pulsa Save para ver lo que envía el formulario:
Con el estado por defecto, el formulario solo envía updates=on. Dos reglas lo explican:
- Una casilla marcada envía
name=value. La segunda casilla no tienevalue, así que envía el valor por defecto,on. - Una casilla sin marcar no envía nada. Ni
newsletter=noni un valor vacío: el nombre no aparece en los datos.
checked en el HTML fija el estado inicial. Como todo atributo booleano, lo que cuenta es su presencia: checked="false" también marca la casilla.
Atributos del checkbox
| Atributo | Hace |
|---|---|
name | La clave que se envía cuando está marcada |
value | Lo que se envía cuando está marcada (por defecto on) |
checked | Marcada al cargar la página |
required | El formulario no se envía hasta que esta casilla esté marcada |
disabled | No se puede marcar ni desmarcar y no se envía |
Un grupo de checkboxes
Para "elige cualquiera de estas", dale a todas las casillas el mismo name y un value distinto. Envuélvelas en un <fieldset> con un <legend> para que el grupo tenga nombre:
El formulario envía topic=html y topic=css: el mismo nombre dos veces. La mayoría de los frameworks de servidor pueden leerlo como una lista. PHP es la excepción: solo se queda con el último salvo que el nombre termine en corchetes, name="topic[]". En JavaScript, new FormData(form).getAll('topic') devuelve ['html', 'css'].
Enviar un valor cuando la casilla no está marcada
Cuando el servidor necesita un "no" explícito, pon un input oculto con el mismo nombre antes del checkbox. Sin marcar, solo se envía el valor oculto; marcada, se envían los dos y el servidor se queda con el último:
Pulsa Continue: el formulario se niega a enviarse hasta que marques la casilla de condiciones, porque es required. Después envía marketing=no y terms=accepted, o marketing=no, marketing=yes y terms=accepted con la primera casilla marcada. Frameworks como Rails generan exactamente esta pareja de input oculto. Comprueba cómo lee tu servidor un nombre repetido antes de confiar en ello.
Seleccionar todo y el estado indeterminate
Un checkbox tiene un tercer aspecto, un guion, para "algunas pero no todas". Solo existe en JavaScript: asigna box.indeterminate = true. Una casilla de "seleccionar todo" lo usa cuando algunas de las casillas que controla están marcadas:
indeterminate solo cambia el aspecto (y lo que anuncian los lectores de pantalla: "mixto" o "parcialmente marcado"). Por debajo, la casilla sigue estando marcada o sin marcar, y eso es lo que envía el formulario. Pulsar una casilla indeterminada quita el guion y la alterna.
Usa el evento change para reaccionar a un checkbox, y lee box.checked para saber su estado. box.value no cambia al marcar o desmarcar la casilla.
Dar estilo a los checkboxes
El cambio más rápido es accent-color, que cambia el color del checkbox nativo y conserva todo su comportamiento. Para un aspecto totalmente distinto, appearance: none quita el dibujo nativo y te deja dar estilo al input como a cualquier caja:
La casilla personalizada sigue siendo un checkbox real: se alterna con un clic y con Espacio, se envía con el formulario y se anuncia como casilla de verificación. Dibújala con :checked y mantén un estilo :focus-visible, porque sin el dibujo nativo no hay anillo de foco que no hayas añadido tú.
Un interruptor toggle
Un interruptor es un checkbox que significa "activado o desactivado ahora mismo" en lugar de "incluir esto". Dibújalo con appearance: none y añade role="switch" para que los lectores de pantalla anuncien un interruptor activado o desactivado en lugar de una casilla marcada:
inset-inline-start coloca el botón desde el inicio de la línea, así que en las páginas de derecha a izquierda el interruptor se desliza en sentido contrario, como debe. Para opciones de sí o no agrupadas donde solo se puede elegir una, consulta radio button en HTML.
Errores comunes
- Esperar
falsede una casilla sin marcar. No se envía nada. Trata un nombre ausente como "desactivado" en el servidor, o añade el input oculto. checked="false". Sigue marcando la casilla. Quita el atributo.- Un checkbox sin etiqueta, o con texto al lado que no es un
<label>. La pequeña casilla se convierte en la única zona que se puede pulsar y los lectores de pantalla anuncian "casilla de verificación" sin nombre. Consulta label en HTML. - Olvidar
value, con lo que todas las casillas de un grupo envíanony el servidor no puede distinguirlas. - Leer
box.valuepara saber si está marcada. Usabox.checked. - Checkboxes para "elige una". Para eso están los botones de opción.
Preguntas frecuentes
¿Cómo se hace un checkbox en HTML?
Usa <input type="checkbox"> dentro de una etiqueta: <label><input type="checkbox" name="terms" value="yes"> Acepto</label>. La etiqueta hace que el texto también se pueda pulsar.
¿Cómo dejo un checkbox marcado por defecto?
Añade el atributo checked: <input type="checkbox" name="news" checked>. Lo que cuenta es su presencia, así que checked="false" también lo marca. En JavaScript, asigna box.checked = true o false.
¿Qué valor envía un checkbox sin marcar?
Ninguno. Un checkbox sin marcar se omite por completo de los datos enviados. Uno marcado envía su value, o on si no tiene value. Si el servidor necesita un "no" explícito, pon un input oculto con el mismo nombre antes del checkbox.
¿Cómo obtengo el valor de un checkbox en JavaScript?
Lee box.checked, que es true o false. box.value es el valor que enviaría, y no cambia esté marcada la casilla o no. Escucha el evento change para reaccionar cuando se marca o desmarca.
¿Cómo cambio el color de un checkbox?
Ponle accent-color: input[type=checkbox] { accent-color: #16a34a; }. Para un aspecto totalmente propio, pon appearance: none y dibuja tú la casilla y la marca con CSS.