O que você precisa saber sobre limitação de caráter físico ou mental
A maioria dos projetos que eu vejo passar pelo meu radar ignora completamente como pessoas com limitações físicas ou mentais interagem com software no dia a dia. Não é uma questão de bonzinho ou político correto. É uma questão de saber o que você está construindo e para quem.
Limitação de caráter físico ou mental na prática
Limitação de caráter físico ou mental abrange tudo que impede alguém de usar um sistema da maneira padrão. Visão reduzida ou cegueira. Tremores nas mãos que tornam cliques precisos impossíveis. Dificuldade de concentração devido a TDAH. Problemas de memória de trabalho. Sequenciamento cognitivo prejudicado. Todos esses entram nessa categoria. O erro mais comum que eu vejo desenvolvedores cometerem é tratar acessibilidade como uma lista de verificação no final do projeto. Você já deve ter sentido isso: entrega marcada, e de repente todo mundo lembra que precisa testar com leitor de tela. Aí você perde uma semana refazendo coisas que deveriam ter sido feitas certinhas desde o início.
Na minha experiência, o melhor momento para pensar nisso é antes de escrever a primeira linha de HTML. Se você estruturar o markup direito desde o começo, o resto flui naturalmente. Se deixar pra depois, vira um inferno de correções. Aqui vai um exemplo bem específico que eu enfrentei recentemente. Tinha um formulário de cadastro com validação em tempo real que usava background vermelho para indicar erros. Perfeito para quem vê. Ruim demais para quem usa leitor de tela, porque o error message só aparecia no atributo aria-live, mas o contexto visual era tudo cor.
A solução foi adicionar um ícone de aviso antes do campo, usar aria-describedby ligando ao texto de erro, e garantir que o foco fosse movido automaticamente para o campo com problema quando o usuário cometesse um erro. Isso reduziu as reclamações em cerca de 80% nos testes com usuários reais, e levou uns dois dias para implementar corretamente.
Como implementar acessibilidade sem perder a sanidade
Vou ser direto. Não existe bala de prata. Mas existem passos que fazem diferença real. Primeiro, entenda que contraste não é só cor sobre fundo. Contraste envolve texto em movimento, texto sobre imagens, e texto em degradê. A WCAG 2.1 exige nível AA, que é contraste de pelo menos 4.5:1 para texto normal e 3:1 para texto grande. Ferramentas como o axe DevTools ou WAVE identificam problemas rapidamente. Eu uso o axe todo dia no meu fluxo de trabalho.
Segundo, navegação por teclado é obrigatória. Se alguém não consegue chegar em tudo usando só Tab, Shift+Tab e Enter, o projeto não está acessível. Eu testo isso assim: desligo o mouse e tento completar toda a jornada do usuário só com o teclado. Se travar em algum modal, dropdown ou menu,tem problema. Terceiro, labels e aria labels servem para coisas diferentes. Label está ligado a um input via atributo for. Aria label é um texto descritivo que não aparece visualmente mas é lido pelo leitor de tela. Use ambos quando necessário. Não substitua um pelo outro achando que resolve.
Quarto, foco visível. Muitos frameworks modernos removem o outline do foco por estética. Isso é um erro grave. Pessoas que navegam por teclado precisam ver onde estão. Se você não quer o outline padrão feio, crie um customizado com boa visibilidade. Border de 2px, cor de alto contraste, outline-offset de pelo menos 2px. Simples. Quinto, conteúdo multimídia precisa de alternativas. Legendas em vídeos. Transcrições em áudios. Descrição textual em imagens informativas. Alternativa text em imagens decorativas pode ser vazia com aria-hidden=true, mas nunca omitida.
Um detalhe que pouca gente menciona: pessoas com limitações cognitivas se beneficiam enormemente de consistência. Se um botão de "salvar" está no canto superior direito na tela um, não coloque no inferior esquerdo na tela dois. Navegação previsível economiza energia cognitiva e reduz erro.
Testes reais com pessoas
Simuladores de navegador não substituem testes com pessoas reais. Eu já vi projetos passarem em todos os testes automatizados e ainda assim serem inutilizáveis por alguém com daltonismo ou limitação motora. O ideal é incluir pelo menos dois tipos de teste: automação e avaliação humana. Para automação, axe-core, Lighthouse, ou o pa11y rodando no CI. Para avaliação humana, contrate pessoas com deficiência ou use serviços como accessibe, silber ou grupos de teste especializados. O custo varia, mas investir em pelo menos uma rodada de testes com usuários reais custa menos que uma semana de retrabalho tardio.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Quando eu fiz testes com um usuário cego usando NVDA num sistema financeiro interno, descobrimos que uma tabela de relatórios com múltiplos níveis de cabeçalho estava completamente incompreensível para ele. O leitor de tela ia de célula em célula sem contexto. A correção foi estruturar a tabela com thead, tbody, th com scope, e adicionar aria-describedby em colunas complexas. Antes disso, o relatório era inútil. Depois, levava menos de 30 segundos para navegar entre seções.
O que não funciona e por quê
Plugin mágico de acessibilidade que "conserta" tudo sozinho não existe. Eu já vi propostas de ferramentas que prometem isso e todas falharam em pelo menos um aspecto crítico quando testadas. Elas podem ajudar com contraste básico e tamanho de fonte, mas não resolvem estrutura semântica, ordem de tabulação, ou compatibilidade com leitores de tela. Também não adianta apenas adicionar alt text genérico como "imagem" ou "foto". Isso é pior que não ter nada, porque dá falsa impressão de acessibilidade. Alt text deve descrever o conteúdo ou a função do elemento. Se a imagem é um botão que filtra resultados, o alt deve ser algo como "Filtrar por categoria". Se é decorativa, use ou aria-hidden.
Outro erro comum é confiar apenas em cores para transmitir informação. Vermelho para erro, verde para sucesso. Pessoas com daltonismo não distinguem essas cores. Sempre combine cor com ícone, texto ou padrão. Isso é tão básico que dá preguiça mencionar, mas aparece em quase 60% dos projetos que eu reviso.
Checklist prático para começar hoje
Se você quer colocar a mão na massa agora, aqui está o mínimo que eu considero essencial antes de entregar qualquer interface: Markup semântico: header, nav, main, section, article, footer. Heading hierarchy correta, sem pular níveis. Lista com ul/ol quando fizer sentido. Botões com type="button" para evitar submit acidental.
Imagens: todas com alt apropriado. Ícones com aria-hidden se puramente decorativos, ou aria-label se tiverem função. Forms: label explícito para cada input. Erros descritos com aria-describedby. Focus visível e lógico.
Navegação: skip link para conteúdo principal. Ordem de tabulação lógica. Menus funcionais por teclado. Conteúdo dinâmico: regions com aria-live para atualizações. Dialogs com aria-modal e foco preso dentro dele.
Mídia: legendas, transcrições, controles de play/pause visíveis. Performance: tempos de carregamento afetam usuários com limitações cognitivas também. Layout lento = experiência ruim para todos.
Eu costumo rodar uma bateria de testes antes de qualquer deploy: axe rodando no Chrome, teste de navegação por teclado, e verificação manual de contraste com a ferramenta de desenvolvedor. Leva uns quinze minutos e evita horas de correção depois.
Quando acessibilidade não é suficiente
Às vezes o problema não é a interface, é o produto em si. Um jogo competitivo reagindo a reflexos de milissegundo simplesmente não é acessível para pessoas com limitação motora severa, não importa o quanto você ajuste os controles. Nesse caso, a resposta honesta é reconhecer a limitação e oferecer alternativas: modo assíncrono, replay para análise, ou modos com forgiving timing. O mesmo vale para apps que dependem exclusivamente de gestos complexos. Se o gesto principal é um swipe diábolo de três dedos, você alienou usuários com limitação motora. Ofereça um alternative input: botões, comandos de voz, ou atalhos de teclado.
Não existe solução universal. O importante é pensar em alternativas desde o design inicial, não como no final. E isso vale para limitação de caráter físico ou mental tanto quanto para qualquer outro tipo de barreira.