3

Como uma pessoa cega chama Uber? Como sabe que está pedindo pizza e não hamburguer pelo iFood?

A resposta é uma tecnologia chamada leitor de tela. Ela vem instalada em praticamente todo dispositivo: VoiceOver no iPhone e no Mac, TalkBack no Android, Narrador no Windows. Também existe o NVDA, gratuito e muito usado no Windows.

Só que existe um detalhe que quase nenhum dev conhece: o leitor de tela não lê a tela.

O que o leitor de tela realmente lê

Ele não enxerga pixels, cores ou layout. O navegador (ou o sistema operacional, em apps nativos) monta uma árvore de acessibilidade a partir do seu código, e é essa árvore que o leitor de tela anuncia.

E a pessoa também não ouve a página de cima a baixo. Ela navega: pula de título em título, pede a lista de todos os botões, vai direto para o formulário, desliza o dedo de elemento em elemento no celular.

Para cada elemento interativo, o leitor de tela precisa responder três perguntas:

  • O que é? O papel: botão, link, campo de texto, checkbox.
  • Como se chama? O nome: "Finalizar pedido", "Fechar", "Buscar".
  • Em que estado está? Marcado, expandido, desabilitado, inválido.

Se o seu código não responde essas três perguntas, a pessoa simplesmente não consegue usar o que você construiu.

O problema: a div que finge ser botão

É aqui que a gente costuma errar. Não por maldade, mas porque visualmente funciona:

<div className="btn" onClick={finalizarPedido}>
  Finalizar pedido
</div>

Para quem usa mouse, é idêntico a um botão. Para quem usa leitor de tela:

  • Não é anunciada como botão. Vira texto solto.
  • Não aparece quando a pessoa pede a lista de botões da página.
  • Não recebe foco com Tab, então quem navega pelo teclado nem chega nela.
  • Enter e Espaço não fazem nada.

A correção é usar o elemento que já existe para isso:

<button type="button" onClick={finalizarPedido}>
  Finalizar pedido
</button>

Papel, foco, suporte a teclado e anúncio correto vêm de graça. Estilizar um <button> dá o mesmo trabalho que estilizar uma div.

Não à toa, a primeira regra de uso do ARIA definida pela W3C é: se existe um elemento HTML nativo que faz o que você precisa, use o elemento nativo.

Voltando ao iFood: pizza ou hambúrguer?

Imagine uma lista de produtos em que cada card tem um botão "Adicionar".

Quem enxerga associa o botão à foto e ao nome do produto ao lado. Quem usa leitor de tela e pede a lista de botões da página ouve:

"Adicionar, botão. Adicionar, botão. Adicionar, botão."

Adicionar o quê?

<button type="button" aria-label={`Adicionar ${produto.nome}`}>
  Adicionar
</button>

Agora o anúncio é "Adicionar Pizza Margherita, botão". Uma linha resolveu.

Em apps nativos, a lógica é a mesma com outros nomes: accessibilityLabel e accessibilityRole no React Native, contentDescription no Android, accessibilityLabel no iOS. As APIs mudam, mas as três perguntas continuam.

Faça o teste agora: ligue o leitor de tela (Cmd + F5 no Mac, ou instale o NVDA no Windows), abra o seu projeto e tente completar o fluxo principal sem olhar para a tela. Na primeira vez, quase sempre algo quebra.

"Mas a IA não resolve isso?"

Ajuda muito. Mas tem dois problemas.

Primeiro: ela reproduz o código que viu. E a internet está cheia de div com onClick. Se você não sabe que isso é um problema, aceita a sugestão sem perceber.

Segundo: ela responde ao que você pede. Compare estes dois prompts:

Deixa esse card acessível.

Esse card de produto tem um botão "Adicionar" que se repete em toda a lista. Garanta que cada botão tenha um nome acessível único com o nome do produto, que a quantidade adicionada seja anunciada ao leitor de tela, e use elementos HTML nativos em vez de ARIA sempre que possível.

O primeiro gera uma resposta genérica, às vezes cheia de ARIA desnecessário. O segundo resolve o problema real.

E o segundo só pode ser escrito por quem entende a finalidade de cada elemento. Pelo mesmo motivo, só essa pessoa consegue revisar o que a IA devolveu.

A IA acelera quem entende o problema. Para quem não entende, ela só gera o mesmo erro mais rápido.

Conclusão

Acessibilidade não começa com ARIA, com ferramenta de auditoria ou com IA. Começa com uma pergunta antes de escrever cada elemento: o que isso é, como se chama e em que estado está?

Se a resposta for "é um botão", use um <button>.

E você? Já testou o seu projeto com leitor de tela? O que quebrou primeiro? Conta nos comentários.

No próximo post, vou mostrar como testar um projeto com leitor de tela em 10 minutos, mesmo que você nunca tenha usado um.

Carregando publicação patrocinada...