Menu

Checkbox no HTML: checked, valores, grupos e estilos

Como fazer uma checkbox no HTML com <input type="checkbox">: labels, o atributo checked, o que o formulário envia quando ela está marcada e quando não está, grupos de checkboxes, selecionar todos com o estado indeterminate e estilo.

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

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 tem value, 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

AtributoFaz
nameA chave enviada quando marcada
valueO que é enviado quando marcada (padrão on)
checkedMarcada quando a página carrega
requiredO formulário não é enviado até esta caixa ser marcada
disabledNã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 false de 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 envia on sem que o servidor consiga diferenciá-las.
  • Ler box.value para saber se está marcada. Use box.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.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR