Critérios de Sucesso WCAG · Level AA
WCAG 4.1.3: Mensagens de status
As WCAG 4.1.3 exige que mensagens de status — como confirmações de envio de formulários, notificações de erro e atualizações de carrinho — sejam programaticamente determináveis por meio de função (role) ou propriedade, para que as tecnologias assistivas possam anunciá-las sem exigir que o usuário mova o foco. Isso garante que usuários que dependem de leitores de tela recebam feedback importante mesmo quando o foco não é deslocado para a mensagem.
O que Esta Regra Significa
O Critério de Sucesso 4.1.3 Mensagens de Status (nível AA, introduzido no WCAG 2.1 e mantido no WCAG 2.2) estabelece: "Em conteúdo implementado usando linguagens de marcação, mensagens de status podem ser determinadas programaticamente por meio de função (role) ou propriedades, de forma que possam ser apresentadas ao usuário por tecnologias assistivas sem receber foco."
Em termos práticos, isso significa que sempre que sua interface produzir uma mensagem para informar o usuário sobre um resultado — uma pesquisa retornando resultados, o envio bem-sucedido de um formulário, um item sendo adicionado ao carrinho de compras, um erro após a validação ou a conclusão de um processo — essa mensagem deve ser exposta à tecnologia assistiva (TA) de uma forma que não exija que o usuário navegue até ela. A restrição principal é que a mensagem não deve depender de receber foco de teclado ou programático para ser anunciada.
O critério se aplica a qualquer conteúdo escrito em uma linguagem de marcação (HTML, SVG, etc.) e abrange quatro categorias amplas de mensagens de status reconhecidas pelo WCAG:
- Mensagens de sucesso: confirmações como "Seu pedido foi realizado" ou "Configurações salvas com sucesso."
- Mensagens de erro ou aviso: feedback de validação como "Endereço de e-mail inválido" ou "Preencha todos os campos obrigatórios."
- Atualizações de progresso ou status: mensagens como "Carregando… aguarde" ou "Upload 60% concluído."
- Mensagens de mudança de contexto: atualizações dinâmicas como "5 resultados encontrados" ou "3 itens no seu carrinho."
Uma mensagem atende a este critério quando recebe uma função ou propriedade de região viva ARIA apropriada — mais comumente role="status", role="alert", aria-live="polite" ou aria-live="assertive" — para que leitores de tela a anunciem automaticamente quando ela aparecer ou for alterada, sem que o usuário precise navegar até ela com a tecla Tab.
Uma mensagem falha quando é injetada dinamicamente no DOM (via JavaScript), mas não possui semântica de região viva, deixando usuários de leitores de tela sem saber que algo mudou na página.
Uma exceção importante definida pelo WCAG: se uma mensagem de status é entregue movendo o foco para o elemento da mensagem (por exemplo, uma caixa de diálogo que recebe foco ou uma caixa de diálogo alert()), o critério não se aplica a essa interação — o próprio movimento de foco satisfaz a necessidade. O critério trata especificamente de mensagens que aparecem sem uma mudança de foco.
Por Que Isso Importa
Usuários de leitores de tela navegam pelas páginas de forma linear ou pulando entre marcos, títulos e controles interativos. Quando uma página injeta silenciosamente um banner "Sua mensagem foi enviada" no DOM sem anunciá-lo, uma pessoa cega não tem como saber que a ação foi bem-sucedida. Ela pode enviar o formulário novamente, esperar indefinidamente ou simplesmente abandonar a tarefa em confusão. O mesmo problema afeta pessoas com baixa visão que dependem de zoom e ampliação — uma mensagem de status que aparece fora da área visível atual passa despercebida, a menos que seja anunciada de forma audível.
Pessoas com deficiência motora que dependem de acesso por varredura (switch access) ou tecnologia de rastreamento ocular são igualmente afetadas. Essas pessoas muitas vezes não conseguem examinar rapidamente uma página em busca de novo conteúdo; elas dependem da TA para trazer informações relevantes até elas. Sem anúncios de regiões vivas, cada atualização de status se torna um problema de agulha no palheiro.
Pessoas com diversidade cognitiva também se beneficiam: feedback claro e imediato confirma que uma ação foi concluída e reduz a carga cognitiva da incerteza. Quando a TA anuncia "Item adicionado ao carrinho", uma pessoa com deficiência cognitiva não precisa procurar visualmente por uma confirmação antes de prosseguir.
Um cenário concreto do mundo real: uma pessoa cega está preenchendo um formulário de seguro com vários campos no site de um banco turco. Ela envia o formulário, mas a validação no lado do cliente é acionada e exibe cinco mensagens de erro em vermelho perto dos campos. Como não há região viva, o leitor de tela da pessoa (JAWS ou NVDA) permanece em silêncio. Ela supõe que o formulário foi enviado com sucesso e fecha a aba do navegador — perdendo toda a sua solicitação. Com um role="alert" implementado corretamente ou uma região viva de resumo, a TA teria anunciado imediatamente "3 erros encontrados. Revise os campos destacados", permitindo que a pessoa corrigisse os problemas.
Do ponto de vista de negócios, feedback de status inacessível prejudica diretamente as taxas de conversão. Aproximadamente 1,3 bilhão de pessoas no mundo vivem com algum tipo de deficiência, e garantir que mensagens de status sejam acessíveis reduz o abandono de formulários, o volume de chamados de suporte e o risco jurídico associado à não conformidade. Para organizações turcas, a inacessibilidade também pode constituir violação da Lei de Deficiência nº 5378 e das novas obrigações do Circular Presidencial descritas mais adiante neste artigo.
Regras Relacionadas do Axe-core
- aria-live (automatizada): A regra
aria-livedo axe-core verifica se elementos que usam o atributoaria-liverecebem um dos valores válidos:off,politeouassertive. Ela sinaliza elementos em quearia-liveestá definido com um valor inválido ou escrito incorretamente (por exemplo,aria-live="true"ouaria-live="yes"), o que faria com que a região viva fosse silenciosamente ignorada pela tecnologia assistiva. Essa regra garante que, quando desenvolvedores pretendem criar uma região viva, o atributo esteja corretamente formado para que leitores de tela realmente a respeitem. - Teste manual (necessário para cobertura completa): Ferramentas automatizadas não conseguem auditar completamente o WCAG 4.1.3 porque o modo principal de falha é a ausência de uma região viva em uma mensagem gerada dinamicamente — uma ausência que a análise estática de código tem dificuldade em detectar de forma confiável. Uma ferramenta que analisa o DOM antes de uma interação do usuário não tem como saber quais elementos se tornarão mensagens de status posteriormente. O axe-core pode não sinalizar uma
<div>que receberá texto injetado após um clique em botão, porque no momento da varredura a div está vazia ou ainda não existe. Portanto, o teste manual com um leitor de tela em funcionamento é essencial: uma pessoa testadora deve acionar a mensagem de status e ouvir o anúncio. Se nada for anunciado e o foco não tiver se movido, o critério falha independentemente do que as ferramentas automatizadas reportem.
Como Testar
- Varredura automatizada com axe DevTools ou Lighthouse: Instale a extensão de navegador axe DevTools (Chrome ou Firefox) e execute uma varredura de página inteira. Procure por violações sob a regra
aria-live. Verifique também problemas sinalizados por uso incorreto dearia-roledescriptionouaria-atomic. Lembre-se de que uma varredura automatizada limpa não significa que o 4.1.3 foi atendido — significa apenas que não foram encontrados atributos de região viva malformados. Anote todos os elementos sinalizados e resolva-os antes de prosseguir para as etapas manuais. - Identifique todas as mensagens de status dinâmicas: Revise a página e seu JavaScript para catalogar todas as interações do usuário que produzem uma mensagem de status sem recarregamento de página ou mudança de foco. Exemplos comuns incluem: feedback de envio de formulário, badges de quantidade no carrinho, contagem de resultados de pesquisa, progresso de upload de arquivo, confirmações de inscrição em newsletter, atualizações de resultados de filtros e avisos de expiração de sessão.
- Teste manual com NVDA + Firefox: Abra a página com o NVDA em execução. Acione cada mensagem de status catalogada (envie um formulário, adicione um item ao carrinho, execute uma pesquisa). Ouça com atenção — o NVDA deve anunciar o texto da mensagem automaticamente em um ou dois segundos. Se você não ouvir nada e o foco não tiver se movido, o critério falha. Use o Speech Viewer do NVDA (Tools > Speech Viewer) para ver um registro em texto de todos os anúncios para verificação de precisão.
- Teste manual com JAWS + Chrome: Repita as mesmas interações com o JAWS. Confirme que mensagens com
role="status"são anunciadas com interrupção educada (polite) e que mensagens comrole="alert"interrompem imediatamente. Verifique se o JAWS não anuncia a mesma mensagem várias vezes devido a configurações incorretas dearia-atomicouaria-relevant. - Teste manual com VoiceOver + Safari (macOS/iOS): Use o VoiceOver no macOS com o Safari e repita as mesmas interações. Observe que o tratamento de
aria-livepelo VoiceOver pode diferir ligeiramente dos leitores de tela do Windows — confirme que os anúncios ocorrem e são redigidos de forma compreensível. - Inspecione o DOM após a interação: Usando as DevTools do navegador, acione a mensagem de status e então inspecione o elemento que apareceu. Confirme que ele possui
role="status",role="alert"ou um atributoaria-liveválido. Se a mensagem for injetada como texto simples em um contêiner sem marcação, ela falha. Verifique também se o contêiner da região viva existia no DOM antes de a mensagem ser injetada — leitores de tela só anunciam mudanças em regiões vivas pré-existentes, não em elementos inseridos recentemente no DOM.
Como Corrigir
Resumo de Validação de Formulário — Incorreto
<!-- Error summary injected after failed submission -->
<div id='error-summary' class='error-box'>
<p>Please fix the following errors before submitting:</p>
<ul>
<li>Email address is required.</li>
<li>Password must be at least 8 characters.</li>
</ul>
</div>
<!-- Problem: no role or aria-live attribute; screen readers will not announce this -->
Resumo de Validação de Formulário — Correto
<!-- role="alert" causes immediate announcement when content is injected -->
<div id='error-summary' role='alert' class='error-box'>
<p>Please fix the following errors before submitting:</p>
<ul>
<li>Email address is required.</li>
<li>Password must be at least 8 characters.</li>
</ul>
</div>
<!-- The container must be present in the DOM before JavaScript injects content into it -->
Contagem de Itens no Carrinho — Incorreto
<!-- Cart badge updated via JavaScript after user clicks "Add to cart" -->
<button id='add-to-cart'>Add to Cart</button>
<span id='cart-count' class='badge'>0</span>
<!-- Problem: cart-count has no live region; update from 0 to 1 is silent to screen readers -->
Contagem de Itens no Carrinho — Correto
<!-- Separate polite live region announces cart update without interrupting the user -->
<button id='add-to-cart'>Add to Cart</button>
<span id='cart-count' class='badge' aria-hidden='true'>1</span>
<!-- Visually hidden live region provides the announcement -->
<div
id='cart-status'
role='status'
aria-live='polite'
aria-atomic='true'
class='visually-hidden'
>
<!-- JavaScript updates this text: "1 item in your cart" -->
</div>
<!-- aria-atomic="true" ensures the full sentence is read, not just the changed number -->
Contagem de Resultados de Pesquisa — Incorreto
<!-- Results count rendered after AJAX search -->
<p id='results-info'>Showing 24 of 140 results for "laptop"</p>
<!-- Problem: element is replaced entirely via innerHTML; no live region present -->
Contagem de Resultados de Pesquisa — Correto
<!-- Live region pre-exists in the DOM; JavaScript updates its content after search -->
<p
id='results-info'
role='status'
aria-live='polite'
aria-atomic='true'
>
Showing 24 of 140 results for "laptop"
</p>
<!-- role="status" implies polite + atomic; explicit attributes added for clarity and compatibility -->
Progresso de Upload de Arquivo — Incorreto
<!-- Progress percentage injected into DOM during upload -->
<div class='progress-container'>
<div class='progress-bar' style='width: 60%'></div>
<span id='progress-text'>60%</span>
</div>
<!-- Problem: percentage updates are visual only; no announcement to AT -->
Progresso de Upload de Arquivo — Correto
<!-- Use aria-valuenow on a progressbar role, plus a separate polite status for milestones -->
<div class='progress-container'>
<div
role='progressbar'
aria-valuenow='60'
aria-valuemin='0'
aria-valuemax='100'
aria-label='File upload progress'
class='progress-bar'
style='width: 60%'
>
</div>
</div>
<div
id='upload-status'
role='status'
aria-live='polite'
aria-atomic='true'
class='visually-hidden'
>
Upload complete. Your file has been saved.
</div>
<!-- Only announce key milestones (25%, 50%, 75%, complete) to avoid over-announcement -->
Erros Comuns
- Criar o elemento de região viva ao mesmo tempo que a mensagem: Adicionar
role="alert"a um elemento recém-criado no DOM e preenchê-lo imediatamente muitas vezes falha porque os leitores de tela ainda não registraram o novo nó como uma região viva. Sempre renderize o contêiner vazio no carregamento da página e apenas atualize seu conteúdo de texto quando a mensagem de status estiver pronta. - Usar
aria-live="assertive"para mensagens não urgentes: Regiões vivas assertivas interrompem o que quer que o leitor de tela esteja lendo. Usarassertivepara mensagens rotineiras como "Item adicionado ao carrinho" irá frustrar as pessoas usuárias, cortando constantemente o fluxo de leitura. Reserveassertive(ourole="alert") para erros ou avisos realmente sensíveis ao tempo; usepolitepara todo o resto. - Definir
aria-livecom um valor inválido como"true"ou"1": Apenas"off","polite"e"assertive"são valores válidos. Valores inválidos desativam silenciosamente a região viva sem aviso do navegador, fazendo com que a regraaria-livedo axe-core sinalize o elemento. - Confiar apenas em cor ou ícones para comunicar status: Um ícone de marca de verificação verde ou uma borda vermelha injetada na página é um sinal apenas visual. Sem texto correspondente em uma região viva, usuários de leitores de tela não recebem nenhuma informação. Sempre combine indicadores visuais com um anúncio baseado em texto em uma região viva.
- Omitir
aria-atomic="true"ao atualizar parte de uma frase: Se o JavaScript atualizar apenas um número dentro de uma frase (por exemplo, mudar "3" para "4" em "4 itens no carrinho"), alguns leitores de tela anunciarão apenas o nó alterado, dizendo "4" sem contexto. Definiraria-atomic="true"no contêiner informa à TA que deve ler toda a região como uma unidade. - Anunciar cada atualização incremental de progresso: Injetar uma nova mensagem de status a cada segundo durante um upload de arquivo ("10%", "11%", "12%"…) sobrecarrega a pessoa usuária com anúncios e torna o leitor de tela inutilizável. Anuncie apenas marcos significativos ou o estado final de conclusão.
- Colocar o contêiner da região viva dentro de elementos que são condicionalmente ocultos com
display:noneouvisibility:hidden: Uma região viva dentro de um elemento pai oculto é inerte e não anunciará nada, mesmo que o próprio elemento da região viva esteja visível. Garanta que a cadeia de ancestrais da região viva não esteja oculta no momento do anúncio. - Usar
role="alert"para mensagens de sucesso que aparecem após navegação: Quando uma mensagem de status persiste após um recarregamento de página (por exemplo, uma mensagem flash renderizada no lado do servidor após redirecionamento), usarrole="alert"pode causar anúncios duplicados ou excessivamente agressivos. Considererole="status"ou mover o foco para a região da mensagem em vez disso, para que o anúncio se integre naturalmente à navegação da pessoa usuária. - Presumir que bibliotecas de tooltip ou toast lidam automaticamente com regiões vivas: Muitas bibliotecas populares de componentes de UI (por exemplo, Bootstrap Toasts, sistemas de tooltip personalizados) não adicionam atributos de região viva ARIA por padrão. Sempre inspecione o HTML renderizado de componentes de terceiros e adicione
role="status"ouaria-livequando estiverem ausentes. - Não testar com leitores de tela reais antes da publicação: Ferramentas automatizadas como o axe não conseguem detectar a ausência de uma região viva em uma mensagem de status dinâmica. Confiar apenas em auditorias automatizadas deixará falhas no 4.1.3 sem detecção. Torne o teste manual com leitores de tela — NVDA, JAWS e VoiceOver — uma parte padrão do seu processo de QA para qualquer funcionalidade que gere feedback dinâmico.
Relação com os Regulamentos de Acessibilidade da Turquia
O Circular Presidencial nº 2025/10 da Turquia, publicado no Diário Oficial nº 32933 em 21 de junho de 2025, estabelece obrigações vinculantes de acessibilidade digital para uma ampla gama de organizações que operam na Turquia. O Circular faz referência ao WCAG 2.1 e ao WCAG 2.2 como padrão técnico para conformidade e exige especificamente conformidade em Nível AA como base para a maioria das entidades abrangidas.
O WCAG 4.1.3 Mensagens de Status é um critério de Nível AA, o que significa que está diretamente dentro do escopo obrigatório do Circular para todas as entidades abrangidas. Os seguintes tipos de organizações são explicitamente abrangidos:
- Instituições e órgãos públicos — todos os órgãos governamentais centrais e locais, ministérios, municípios e empresas estatais devem atender à conformidade AA em seus serviços digitais.
- Bancos e instituições financeiras — regulados pela Agência de Regulação e Supervisão Bancária (BDDK), essas entidades oferecem serviços online críticos (internet banking, solicitações de empréstimo, gestão de cartões) em que feedback dinâmico de status — como confirmações de transação, mensagens de erro e atualizações de saldo — é extremamente comum. Falhas no 4.1.3 prejudicam diretamente a independência financeira de pessoas com deficiência.
- Plataformas de e-commerce — o varejo online é um caso de uso principal para mensagens de status (atualizações de carrinho, confirmações de pedido, alertas de estoque). Operadores de e-commerce devem garantir que essas notificações dinâmicas sejam acessíveis a todas as pessoas usuárias.
- Hospitais e instituições de saúde — sistemas de agendamento de consultas, portais de resultados de exames e painéis de pacientes frequentemente usam mensagens de status. Informações de saúde inacessíveis podem ter consequências graves para pacientes com deficiência.
- Empresas de telecomunicações com 200.000 ou mais assinantes — portais de gestão de conta, notificações de cobrança e atualizações de status de serviço devem todos estar em conformidade com o Nível AA, incluindo o 4.1.3.
- Agências de viagem e empresas de transporte privado — confirmações de reserva, feedback de seleção de assento e mensagens de atualização de itinerário são centrais para a experiência do usuário e devem ser determináveis programaticamente.
- Escolas privadas e instituições educacionais autorizadas pelo Ministério da Educação Nacional (MoNE) — sistemas de gestão de aprendizagem, portais de notas e plataformas de matrícula devem expor mensagens de status de forma acessível para atender todas as pessoas estudantes e responsáveis.
O Logotipo de Acessibilidade (Erişilebilirlik Logosu), emitido pelo Ministério da Família e Serviços Sociais, é a marca oficial de certificação para sites e aplicativos turcos digitalmente acessíveis. Para ser elegível ao Logotipo, uma organização deve demonstrar conformidade total com o Nível AA — o que inclui o 4.1.3. Dado que mensagens de status são onipresentes em interfaces web modernas, qualquer organização que busque o Erişilebilirlik Logosu deve tratar o 4.1.3 como item obrigatório de auditoria e implementar padrões de regiões vivas de forma consistente em todas as áreas de conteúdo dinâmico.
Organizações que não cumprirem correm o risco de sofrer medidas administrativas sob o Circular, perder a elegibilidade para o Logotipo de Acessibilidade e sofrer danos reputacionais em um mercado cada vez mais atento à acessibilidade. Implementar corretamente o WCAG 4.1.3 não é apenas um item técnico de checklist — é um investimento concreto em acesso digital igualitário para aproximadamente 8,5 milhões de cidadãos turcos que vivem com deficiência.
