Como fazer radio buttons no HTML
Radio buttons deixam o usuário escolher exatamente uma opção de um grupo. Cada opção é um <input type="radio">, e dar a todos o mesmo name é o que os transforma num grupo. Escolha um tamanho e aperte Order:
O formulário envia um par, size=m: o name do grupo e o value do botão selecionado. As partes:
- O mesmo
nameem todos os botões do grupo. Selecionar um desmarca os outros. - Um
valuediferente em cada um. É isso que o servidor recebe. Um radio semvalueenviaon, o que não diz nada ao servidor. checkedna opção padrão.- Um
<label>em volta de cada um, para que o texto seja clicável, e um<fieldset>com<legend>para que os leitores de tela anunciem a pergunta ("Size") junto com cada opção.
O name forma o grupo
Radios com nomes diferentes são grupos separados, e cada grupo tem a sua própria seleção. Este exemplo tem dois grupos, mais um conjunto quebrado em que cada radio ganhou um nome próprio por engano:
Clique nos três do grupo quebrado: todos ficam selecionados e nenhum pode ser desligado de novo, o pior dos dois mundos. Os radios se agrupam por name dentro do mesmo formulário, então dois formulários podem ter cada um o seu grupo name="size".
Grupos obrigatórios e sem padrão
required em qualquer radio do grupo significa que um deles precisa estar selecionado antes do envio. Deixar o checked de fora faz o usuário escolher ativamente, o que é o certo quando não existe um padrão razoável:
Aperte Continue sem escolher e o navegador impede o envio com uma mensagem. Assim que qualquer opção é escolhida, o grupo inteiro fica válido. Um grupo sem seleção que não é obrigatório não envia nada, como uma checkbox desmarcada.
Um clique pode selecionar um radio, mas nunca desmarcá-lo. Se "sem resposta" precisa ser possível depois de uma escolha, adicione uma opção explícita para isso.
Lendo o valor selecionado no JavaScript
form.elements.name retorna o grupo inteiro, e o seu .value é o valor do radio selecionado (uma string vazia quando não há nenhum). O evento change dispara no radio que foi selecionado:
O listener fica no formulário, então pega uma mudança em qualquer um dos seus campos. Fora de um formulário, encontre o radio selecionado com document.querySelector('input[name="period"]:checked').
Comportamento no teclado
Um grupo de radios é uma única parada na ordem do Tab. O Tab entra no grupo e cai no radio selecionado (ou, quando nenhum está selecionado, no primeiro), e as setas movem a seleção entre as opções. Um novo Tab sai do grupo. Isso vem de graça com inputs radio de verdade que compartilham um name, e é mais um motivo para não recriar radios com elementos <div>.
Estilizando radio buttons
accent-color muda a cor do radio nativo. appearance: none deixa você desenhar o seu próprio círculo. E, como um radio oculto ainda pode ser selecionado pelo seu label, um grupo pode parecer um conjunto de cards mantendo todo o comportamento de radio:
O círculo personalizado é só uma borda grossa quando marcado. Os cards escondem o input com opacity: 0 em vez de display: none, então ele continua focável e as setas continuam funcionando, e :has(input:checked) estiliza o card selecionado. :has() funciona nas versões atuais de Chrome, Firefox e Safari.
Radio, checkbox ou select?
| Use | Quando |
|---|---|
| Radio buttons | Uma escolha entre poucas opções (umas 2 a 6) que devem ficar todas visíveis |
| Checkboxes | Qualquer número de escolhas, inclusive nenhuma |
Um <select> | Uma escolha numa lista longa, como países (veja select no HTML) |
Erros comuns
names diferentes num mesmo grupo. Todo radio pode ser selecionado e nenhum pode ser desmarcado.- Nenhum
value. O servidor recebeon, seja qual for a escolha. - Esconder o input com
display: nonenum design personalizado. Ele deixa de receber foco e de funcionar com o teclado. - Nenhum
<fieldset>e<legend>. Os leitores de tela anunciam "Small, botão de opção" sem a pergunta que o acompanha. - Um único radio button para uma caixa de "Eu concordo". Ele nunca pode ser desmarcado; use uma checkbox.
checkedem vários radios do mesmo grupo. Só o último fica selecionado.
Perguntas frequentes
Como fazer radio buttons no HTML?
Escreva um <input type="radio"> por opção, dê a todos o mesmo name e um value diferente, e coloque cada um num <label>: <label><input type="radio" name="size" value="m"> Medium</label>. O nome compartilhado faz deles um grupo em que só um pode ser selecionado.
Por que consigo selecionar mais de um radio button?
Os botões não têm o mesmo name. Radio buttons só formam um grupo por meio de um name idêntico (no mesmo formulário), e só um botão por grupo pode ser selecionado.
Como pegar o valor do radio button selecionado no JavaScript?
Use form.elements.size.value, em que size é o nome do grupo; ele retorna o valor do botão selecionado, ou uma string vazia se nenhum estiver selecionado. Sem formulário: document.querySelector('input[name="size"]:checked')?.value.
Como definir um radio button padrão?
Adicione checked a um botão do grupo: <input type="radio" name="plan" value="free" checked>. Se vários tiverem, o último vence.
Dá para desmarcar um radio button?
Não clicando nele; um clique só seleciona. Ofereça uma opção "Nenhum", limpe o formulário ou defina button.checked = false no JavaScript. Se a escolha deve ser opcional e removível, uma checkbox ou um select pode servir melhor.