Use botões
(gomakethings.com)- Na interface web, usar
em vez deé a escolha correta em termos de acessibilidade e funcionalidade - Um `` não é reconhecido por leitores de tela como um elemento interativo e também não responde a foco do teclado nem às teclas
EntereSpacebar - 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 `` 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 ``
- Entre usuários de React ou HTMX, é comum ver casos em que interações como abrir um modal são implementadas com ``
- Exemplo de código:
Open Modal
- Exemplo de código:
- 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
clickfunciona, e as teclasEntereSpacebarnão disparam a ação
Limites das tentativas de “corrigir” a acessibilidade
- Ao adicionar o atributo
[role="button"], o problema de reconhecimento pelos leitores de tela é resolvido, mas os problemas de foco e de tratamento de entrada pelo teclado continuam - É possível permitir foco adicionando
[tabindex="0"], mas há risco de bagunçar a ordem de foco ou causar movimentações inesperadas - Para tratar entrada pelo teclado, seria necessário registrar o evento
keydownglobalmente (document) e detectar as teclasEnterou' '(espaço) para encontrar o elemento focado e executá-lodocument.addEventListener('keydown', (event) => { if (event.key !== 'Enter' && event.key !== ' ') return; const notRealBtn = document.activeElement.closest('[onclick]'); if (!notRealBtn) return; // 실행 코드 }); - No fim, isso significa reimplementar de forma complexa funcionalidades que o `` já fornece por padrão
Funcionalidades nativas que o `` oferece
- O elemento `` já oferece automaticamente o seguinte:
- papel implícito (
[role="button"]) - capacidade automática de receber foco
- com foco, disparo do evento
clickao pressionarEnterouSpacebar
- papel implícito (
- Para implementar o mesmo comportamento com
, **seriam necessários vários atributos e scripts**, enquanto comtudo se resolve em uma única linhaOpen Modal
Conclusão: simplicidade é o melhor caminho
- O `` é 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
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.
Os sites de órgãos públicos aqui no país usam muito ``...
Opinião do Hacker News
Uma das minhas reclamações é quando sites implementam navegação com handlers
onclickÉ só usar a tag `` 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 JavaScriptonClickAté elementos que na prática eram links eram tratados inteiramente com handlers de clique, o que não faz sentido para mimNa maioria dos botões, é preciso explicitar
type="button"O padrão ésubmit, então, se estiver dentro de um formulário, ele envia automaticamente Acho que alguns desenvolvedores não sabem disso e por isso acabam usando ``, eé diferenteevita o problema de `type="submit"` Umacomeça vazia, então você só adiciona o comportamento de que precisa e depois também é mais fácil mudar Já com ``, você precisa consultar a documentação para entender o comportamento padrão No fim, é uma escolha entre controle explícito vs funcionalidade embutidaEu 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
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
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 Chrome Ainda assim, tento usar os elementos HTML corretos sempre que possível, embora em projetos paralelos pequenos às vezes seja mais prático usar ``appearance: noneé útil para resetar o estilo de botões Eu 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 ``
Fiquei curioso sobre por que alguém defenderia usar ``