Cómo hacer radio buttons en HTML
Los botones de opción permiten al lector elegir exactamente una opción de un grupo. Cada opción es un <input type="radio">, y darles el mismo name es lo que los convierte en un grupo. Elige una talla y pulsa Order:
El formulario envía una pareja, size=m: el name del grupo y el value del botón seleccionado. Las piezas:
- El mismo
nameen todos los botones del grupo. Seleccionar uno deselecciona los demás. - Un
valuedistinto en cada uno. Es lo que recibe el servidor. Un radio sinvalueenvíaon, lo que no le dice nada al servidor. checkeden la opción por defecto.- Un
<label>alrededor de cada uno, para que el texto se pueda pulsar, y un<fieldset>con<legend>para que los lectores de pantalla anuncien la pregunta ("Size") junto con cada opción.
El name crea el grupo
Los radios con nombres distintos son grupos separados, y cada grupo tiene su propia selección. Este ejemplo tiene dos grupos, más un conjunto roto en el que cada radio recibió por error su propio nombre:
Pulsa los tres del grupo roto: todos quedan seleccionados y ninguno se puede volver a desactivar, lo peor de los dos mundos. Los radios se agrupan por name dentro del mismo formulario, así que dos formularios pueden tener cada uno su propio grupo name="size".
Grupos obligatorios y sin opción por defecto
required en cualquier radio del grupo significa que hay que seleccionar uno antes de que se envíe el formulario. Omitir checked obliga al lector a elegir de forma activa, que es lo correcto cuando no hay una opción por defecto razonable:
Pulsa Continue sin elegir y el navegador detiene el envío con un mensaje. En cuanto se elige cualquier opción, el grupo entero es válido. Un grupo sin seleccionar que no es obligatorio no envía nada, igual que un checkbox sin marcar.
Un clic puede seleccionar un radio pero nunca deseleccionarlo. Si "sin respuesta" debe ser posible después de haber elegido, añade una opción explícita para ello.
Leer el valor seleccionado en JavaScript
form.elements.name devuelve el grupo entero, y su .value es el valor del radio seleccionado (una cadena vacía cuando no hay ninguno). El evento change se dispara en el radio que acaba de seleccionarse:
El listener está en el formulario, así que captura un cambio en cualquiera de sus campos. Fuera de un formulario, busca el radio seleccionado con document.querySelector('input[name="period"]:checked').
Comportamiento con el teclado
Un grupo de radios es una sola parada en el orden de Tab. Tab entra en el grupo y cae en el radio seleccionado (o en el primero, si no hay ninguno seleccionado), y las flechas mueven la selección entre las opciones. Otro Tab sale del grupo. Esto viene gratis con inputs radio reales que comparten name, y es un motivo más para no reconstruir los radios con elementos <div>.
Dar estilo a los radio buttons
accent-color cambia el color del radio nativo. appearance: none te deja dibujar tu propio círculo. Y como un radio oculto se puede seleccionar a través de su etiqueta, un grupo puede parecer un conjunto de tarjetas conservando todo el comportamiento de radio:
El círculo personalizado es solo un borde grueso cuando está marcado. Las tarjetas ocultan el input con opacity: 0 en lugar de display: none, para que siga recibiendo el foco y las flechas sigan funcionando, y :has(input:checked) da estilo a la tarjeta seleccionada. :has() funciona en las versiones actuales de Chrome, Firefox y Safari.
¿Radio, checkbox o select?
| Usa | Cuando |
|---|---|
| Radio buttons | Una elección entre pocas opciones (unas 2 a 6) que deben verse todas |
| Checkboxes | Cualquier número de elecciones, incluida ninguna |
Un <select> | Una elección de una lista larga, como países (consulta select en HTML) |
Errores comunes
namedistintos en un mismo grupo. Se pueden seleccionar todos los radios y no se puede quitar ninguno.- Sin
value. El servidor recibeonse elija lo que se elija. - Ocultar el input con
display: noneen un diseño propio. Ya no puede recibir el foco ni usarse con el teclado. - Sin
<fieldset>ni<legend>. Los lectores de pantalla anuncian "Small, botón de opción" sin la pregunta a la que corresponde. - Un solo radio button para una casilla de "Acepto". Nunca se puede desmarcar; usa un checkbox.
checkeden varios radios del mismo grupo. Solo el último acaba seleccionado.
Preguntas frecuentes
¿Cómo se hacen radio buttons en HTML?
Escribe un <input type="radio"> por opción, dales a todos el mismo name y un value distinto, y pon cada uno en un <label>: <label><input type="radio" name="size" value="m"> Mediana</label>. El nombre compartido los convierte en un grupo donde solo se puede seleccionar uno.
¿Por qué puedo seleccionar más de un radio button?
Los botones no comparten el mismo name. Los radio buttons forman un grupo solo mediante un name idéntico (en el mismo formulario), y solo se puede seleccionar un botón por grupo.
¿Cómo obtengo el valor del radio button seleccionado en JavaScript?
Usa form.elements.size.value, donde size es el nombre del grupo; devuelve el valor del botón seleccionado, o una cadena vacía si no hay ninguno. Sin formulario: document.querySelector('input[name="size"]:checked')?.value.
¿Cómo pongo un radio button por defecto?
Añade checked a un botón del grupo: <input type="radio" name="plan" value="free" checked>. Si varios lo tienen, gana el último.
¿Se puede desmarcar un radio button?
No haciendo clic en él; un clic solo selecciona. Ofrece una opción "Ninguna", reinicia el formulario o asigna button.checked = false en JavaScript. Si la elección debe ser opcional y se debe poder quitar, un checkbox o un select pueden encajar mejor.