Menu

Radio button no HTML: grupos, padrão marcado e estilo

Como os radio buttons funcionam no HTML: agrupar com o atributo name, uma opção padrão com checked, grupos obrigatórios, ler o valor selecionado no JavaScript, comportamento no teclado e estilizar como círculos ou cards personalizados.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

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 name em todos os botões do grupo. Selecionar um desmarca os outros.
  • Um value diferente em cada um. É isso que o servidor recebe. Um radio sem value envia on, o que não diz nada ao servidor.
  • checked na 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?

UseQuando
Radio buttonsUma escolha entre poucas opções (umas 2 a 6) que devem ficar todas visíveis
CheckboxesQualquer 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 recebe on, seja qual for a escolha.
  • Esconder o input com display: none num 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.
  • checked em 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.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR