- Na interface web, usar
<button> em vez de <div> é a escolha correta em termos de acessibilidade e funcionalidade
- Um
<div> não é reconhecido por leitores de tela como um elemento interativo e também não responde a foco do teclado nem às teclas Enter e Spacebar
- Mesmo adicionando os atributos
[role="button"] ou [tabindex="0"], continuam existindo problemas na ordem de foco e no tratamento de eventos de teclado
- Para resolver isso, adicionar vários event listeners e condicionais gera uma complexidade desnecessária
- Como o
<button> já oferece por padrão acessibilidade, foco e tratamento de entrada via teclado, ele é a solução mais simples e padronizada
Abordagem errada: criar um botão com <div>
- Entre usuários de React ou HTMX, é comum ver casos em que interações como abrir um modal são implementadas com
<div onclick="...">
- Problemas dessa abordagem
- Leitores de tela não reconhecem esse elemento como interativo
- Não é possível mover o foco pelo teclado até ele
- Apenas o evento
click funciona, e as teclas Enter e Spacebar não disparam a ação
Limites das tentativas de “corrigir” a acessibilidade
Funcionalidades nativas que o <button> oferece
Conclusão: simplicidade é o melhor caminho
- O
<button> é a forma mais simples de atender aos padrões de acessibilidade e ainda reduzir a quantidade de código
- Sem tratamento desnecessário de eventos nem adição de atributos, usar elementos HTML padrão é melhor para manutenção e eficiência
- Com a mensagem de que “quanto mais preguiçoso o desenvolvedor, mais ele deve usar o elemento correto”, o texto
destaca a importância de hábitos de desenvolvimento que evitam complexidade desnecessária e aproveitam funcionalidades nativas
7 comentários
Texto muito bom. A ideia principal do conteúdo pode ser resumida como: "vamos usar as tags HTML com significado". Se você oferece um evento de clique com uma tag
div(ou outra qualquer), acho que não mudou absolutamente nada em relação à época em que o layout era montado com tagstable.Claro, colocar atributos
aria-*pode deixar isso mais claro, mas já que vai dar esse trabalho todo, é melhor simplesmente usar a tag apropriada kkkkkQue nostalgia kkk
Os sites de órgãos públicos aqui no país usam muito
<a>...Opinião do Hacker News
Uma das minhas reclamações é quando sites implementam navegação com handlers
onclickÉ só usar a tag
<a>e tudo já funciona automaticamente: abrir em nova aba, integração com recursos de acessibilidade, menu de clique direito etc.Se é navegação, use links em vez de uma sopa de JavaScript
Provavelmente por influência de frameworks ou simples descuido
Ainda assim, a forma tradicional quase sempre é melhor em termos de UX
Espero que haja pelo menos um pouco de atrito para quem tenta substituir a tag
<a>Esse pessoal cria padrões errados e os desenvolvedores seguintes acabam copiando
Foram raríssimas as vezes em que precisei estilizar uma
<div>para parecer um botãoEu uso bastante o botão do meio do mouse para rolar, e muitos sites quebram isso
Se clicar com o botão esquerdo, abre uma página de verificação de segurança; se clicar com o do meio, vai direto
onClickAté elementos que na prática eram links eram tratados inteiramente com handlers de clique, o que não faz sentido para mim
Na maioria dos botões, é preciso explicitar
type="button"O padrão é
submit, então, se estiver dentro de um formulário, ele envia automaticamenteAcho que alguns desenvolvedores não sabem disso e por isso acabam usando
<div>Botões com o tipo padrão se comportam de forma estranha e às vezes até ignoram handlers de JS
<input type="submit">, e<button>é diferente<div>evita o problema detype="submit"Uma
<div>começa vazia, então você só adiciona o comportamento de que precisa e depois também é mais fácil mudarJá com
<button>, você precisa consultar a documentação para entender o comportamento padrãoNo fim, é uma escolha entre controle explícito vs funcionalidade embutida
Eu gostaria que o texto fosse ampliado para a ideia de “usar os elementos HTML feitos para aquele propósito”
Muitos desenvolvedores de SPA não entendem bem a semântica dos elementos HTML e acabam reinventando a roda o tempo todo
Por exemplo, o date picker padrão é tão feio que as pessoas acabam substituindo por versões em JS
Esse é um dos contextos em que surgiram os botões customizados
Hoje existe uma geração que fica clicando pela tela inteira tentando descobrir o que é clicável
Uns 10 anos atrás, alguém tornou arrastar links mais importante do que selecionar texto, e agora selecionar texto ficou quase impossível
Talvez seja preciso fazer um fork do navegador para corrigir isso
Se você segurar Alt (ou Option), dá para selecionar o texto dentro do link
É um comportamento realmente indesejado
No macOS, o app TextSniper permite selecionar uma área e copiar o texto com OCR
Graças a isso, até o Google Analytics fica um pouco mais utilizável
Esse problema deveria ser mencionado com mais frequência
Antigamente havia a Select Like A Boss; hoje é a Drag-Select Link Text
Fiquei muito tempo quebrando a cabeça com um bug de tamanho no flexbox por causa de
button {align-items: flex-start}na stylesheet padrão do ChromeAinda assim, tento usar os elementos HTML corretos sempre que possível, embora em projetos paralelos pequenos às vezes seja mais prático usar
<div>appearance: noneé útil para resetar o estilo de botõesEu criei uma classe
.unbuttonifypara algo que se comporta como botão, mas tem outra aparênciaSempre que possível, os elementos devem ser usados conforme a intenção original
Tenho duas reclamações sobre botões
Uma é que no fim você quase sempre precisa reestilizá-los,
e a outra é o aviso de que botões não podem ser aninhados
Na prática, isso aparece com bastante frequência
LLMs frequentemente geram esses padrões errados
Muitas vezes ignoram os recursos nativos do navegador e implementam tudo de forma complexa
Eu costumo pedir ao Claude para simplificar esse tipo de código
No TypeScript, também tendem a inventar formas estranhas de lidar com erros
Eu tento usar botões como padrão sempre que possível
Mas, quando algo de fato deve funcionar como link, uso a tag
<a><a>Fiquei curioso sobre por que alguém defenderia usar
<div><div>facilita umas customizações visuais estranhasE aí o resultado acaba não parecendo nem se comportando como botão
<div onclick>background, border, outline, appearance, -webkit-appearance, cursor
Há estilos padrão demais que precisam ser sobrescritos T_T
É por isso que existe o CSS Reset.