Como fazer uma checkbox no HTML
Uma checkbox é um <input type="checkbox">. Coloque-a dentro de um <label> com o seu texto, para que clicar no texto também a alterne. Marque uma ou as duas caixas e aperte Save para ver o que o formulário envia:
No estado padrão, o formulário envia só updates=on. Duas regras explicam isso:
- Uma caixa marcada envia
name=value. A segunda caixa não temvalue, então envia o padrão,on. - Uma caixa desmarcada não envia nada. Nem
newsletter=no, nem um valor vazio: o nome simplesmente não aparece nos dados.
checked no HTML define o estado inicial. Como todo atributo booleano, o que conta é a presença dele: checked="false" ainda marca a caixa.
Atributos da checkbox
| Atributo | Faz |
|---|---|
name | A chave enviada quando marcada |
value | O que é enviado quando marcada (padrão on) |
checked | Marcada quando a página carrega |
required | O formulário não é enviado até esta caixa ser marcada |
disabled | Não pode ser alternada e não é enviada |
Um grupo de checkboxes
Para "escolha quantos quiser", dê a todas as caixas o mesmo name e um value diferente. Envolva-as num <fieldset> com uma <legend> para que o grupo tenha um nome:
O formulário envia topic=html e topic=css: o mesmo nome duas vezes. A maioria dos frameworks de servidor consegue ler isso como uma lista. O PHP é a exceção: ele fica só com o último, a não ser que o nome termine com colchetes, name="topic[]". No JavaScript, new FormData(form).getAll('topic') retorna ['html', 'css'].
Enviando um valor quando a caixa está desmarcada
Quando o servidor precisa de um "não" explícito, coloque um input oculto com o mesmo nome antes da checkbox. Desmarcada, só o valor oculto é enviado; marcada, os dois são enviados e o servidor fica com o último:
Aperte Continue: o formulário se recusa até a caixa dos termos ser marcada, porque ela é required. Depois ele envia marketing=no e terms=accepted, ou marketing=no, marketing=yes e terms=accepted com a primeira caixa marcada. Frameworks como o Rails geram exatamente esse par com input oculto. Verifique como o seu servidor lê um nome repetido antes de contar com isso.
Selecionar todos e o estado indeterminate
Uma checkbox tem uma terceira aparência, um traço, para "algumas, mas não todas". Ela só existe no JavaScript: defina box.indeterminate = true. Uma caixa de "selecionar todos" a usa quando algumas das caixas que controla estão marcadas:
indeterminate só muda a aparência (e o que os leitores de tela anunciam: "misto" ou "parcialmente marcado"). Por baixo, a caixa continua marcada ou desmarcada, e é isso que o formulário envia. Clicar numa caixa indeterminate tira o traço e a alterna.
Use o evento change para reagir a uma checkbox, e leia box.checked para saber o estado. box.value não muda quando a caixa é alternada.
Estilizando checkboxes
A mudança mais rápida é accent-color, que muda a cor da checkbox nativa e mantém todo o seu comportamento. Para uma aparência completamente diferente, appearance: none remove o desenho nativo e deixa você estilizar o input como qualquer caixa:
A caixa personalizada continua sendo uma checkbox de verdade: alterna com clique e Espaço, é enviada com o formulário e é anunciada como checkbox. Desenhe-a com :checked e mantenha um estilo :focus-visible, porque sem o desenho nativo não existe contorno de foco que você mesmo não tenha adicionado.
Um toggle switch
Um switch é uma checkbox que significa "ligado ou desligado agora" em vez de "incluir isto". Desenhe-o com appearance: none e adicione role="switch" para que os leitores de tela anunciem um switch ligado ou desligado em vez de uma checkbox marcada:
inset-inline-start posiciona o botão a partir do início da linha, então o switch desliza para o outro lado em páginas da direita para a esquerda, como deve ser. Para escolhas de sim ou não agrupadas em que só uma pode ser escolhida, veja radio button no HTML.
Erros comuns
- Esperar
falsede uma caixa desmarcada. Nada é enviado. Trate um nome ausente como "desligado" no servidor, ou adicione o input oculto. checked="false". Ainda marca a caixa. Remova o atributo.- Uma checkbox sem label, ou com um texto ao lado que não é um
<label>. A caixinha vira o único alvo de clique e os leitores de tela anunciam "checkbox" sem nome. Veja label no HTML. - Esquecer o
value, e toda caixa de um grupo enviaonsem que o servidor consiga diferenciá-las. - Ler
box.valuepara saber se está marcada. Usebox.checked. - Checkboxes para "escolha uma". É para isso que servem os radio buttons.
Perguntas frequentes
Como fazer uma checkbox no HTML?
Use <input type="checkbox"> dentro de um label: <label><input type="checkbox" name="terms" value="yes"> I agree</label>. O label deixa o texto clicável também.
Como deixar uma checkbox marcada por padrão?
Adicione o atributo checked: <input type="checkbox" name="news" checked>. O que conta é a presença dele, então checked="false" ainda marca a caixa. No JavaScript, defina box.checked = true ou false.
Que valor uma checkbox desmarcada envia?
Nenhum. Uma checkbox desmarcada fica totalmente de fora dos dados enviados. Uma marcada envia o seu value, ou on se não tiver value. Se o servidor precisa de um "não" explícito, coloque um input oculto com o mesmo nome antes da checkbox.
Como pegar o valor de uma checkbox no JavaScript?
Leia box.checked, que é true ou false. box.value é o valor que ela enviaria, e continua o mesmo com a caixa marcada ou não. Escute o evento change para reagir quando ela for alternada.
Como mudar a cor de uma checkbox?
Defina accent-color nela: input[type=checkbox] { accent-color: #16a34a; }. Para uma aparência totalmente personalizada, defina appearance: none e desenhe a caixa e o visto você mesmo com CSS.