Filtros reduzem uma lista, mas também podem esconder o próprio estado da interface. A pessoa marca duas opções, a grade muda, o foco some e nenhum texto informa quantos itens sobraram. Em uma landing page feita por IA, isso aparece quando o agente trata o filtro como decoração lateral e não como um formulário que controla resultados.
O objetivo é simples de descrever: escolher critérios, saber quais estão ativos, perceber a atualização, remover uma escolha e recuperar o mesmo conjunto ao voltar ou compartilhar a URL. Cada decisão de marcação e JavaScript precisa apoiar esse percurso.
Defina os critérios e a combinação
Antes de escolher componentes, escreva o contrato:
Conjunto: modelos de landing pageTipo: uma opção por vezSetor: várias opções combinadas com OURecursos: várias opções combinadas com EOrdenação: uma opção por vezAplicação: botão Aplicar no celular, imediata no desktopURL: /modelos/?tipo=produto&setor=saude,educacao“E” e “OU” mudam o resultado. Se a pessoa marca Saúde e Educação, o sistema mostra itens de qualquer um dos setores ou apenas itens que pertencem aos dois? A interface, a contagem e a URL precisam seguir a mesma regra.
Não crie um filtro que sempre retorna a lista inteira. Também não mostre opções que nunca produzem resultado sem explicar que estão indisponíveis. O agente pode montar os controles, mas o produto define categorias, combinações e ordem.
Escolha o controle pelo tipo de decisão
Use HTML nativo como ponto de partida:
- checkbox para zero, uma ou várias opções independentes;
- radio para uma opção obrigatória entre alternativas;
selectpara uma escolha numa lista compacta;- botão para ações como “Aplicar” e “Limpar filtros”.
Uma grade de cartões clicáveis não substitui esses controles sem trabalho extra. Seria necessário recriar nome, estado, foco, teclado e contraste. O padrão de checkbox da W3C descreve estados marcado, desmarcado e misto, mas um input type="checkbox" já expõe os dois estados comuns.
Não use botão com aria-pressed para toda escolha só porque ele é fácil de estilizar. Botões alternáveis podem funcionar, mas checkboxes comunicam melhor uma lista de critérios independentes e participam do formulário sem código adicional.
Agrupe opções com fieldset e legend
Quando várias opções respondem à mesma pergunta, dê nome ao conjunto:
<fieldset> <legend>Setor</legend>
<label><input type="checkbox" name="setor" value="saude" /> Saúde</label> <label><input type="checkbox" name="setor" value="educacao" /> Educação</label> <label><input type="checkbox" name="setor" value="varejo" /> Varejo</label></fieldset>O tutorial da W3C sobre agrupamento de controles usa fieldset e legend para associar opções relacionadas. Isso permite que o leitor de tela anuncie “Setor” junto de cada escolha, sem repetir essa palavra no texto visível de todos os itens.
Cada controle precisa de um rótulo associado. Deixe o texto e a área clicável juntos. Um checkbox minúsculo cercado por texto não clicável exige precisão desnecessária no toque.
Se houver uma explicação, associe-a ao grupo ou ao controle com aria-describedby. Não coloque regras importantes apenas num tooltip. O guia sobre tooltips acessíveis explica por que ajuda essencial precisa continuar disponível por foco, toque e leitura.
Mostre quais filtros estão ativos
A barra lateral não deve ser o único lugar onde o estado aparece. Em tela pequena, ela pode ficar recolhida. Mostre um resumo perto dos resultados:
<section aria-labelledby="filtros-ativos"> <h2 id="filtros-ativos">Filtros ativos</h2> <ul> <li>Setor: Saúde <button type="button">Remover Saúde</button></li> <li>Tipo: Produto <button type="button">Remover Produto</button></li> </ul> <button type="button">Limpar filtros</button></section>O botão visível pode dizer “Remover”, mas o nome precisa identificar o critério quando há várias ações iguais. Ao remover uma opção pelo resumo, atualize também o controle original.
Não use só cor para marcar um chip ativo. Texto, estado do controle e aparência precisam concordar. Se um filtro está na URL, mas o checkbox aparece desmarcado, a página tem dois estados concorrentes.
Preserve os filtros na URL
Uma URL estável permite recarregar e compartilhar o conjunto:
/modelos/?setor=saude,educacao&tipo=produto&ordem=recentesDefina a ordem dos parâmetros para facilitar teste e comparação, mesmo que o servidor aceite qualquer ordem. Remova parâmetros com valor padrão quando eles não mudam o conjunto. Não guarde uma lista longa em um fragmento opaco que ninguém consegue inspecionar.
Ao abrir uma URL, reconstrua os controles antes de exibir a lista. Se um valor não existe mais, ignore-o de forma explícita e mantenha os critérios válidos. Não mostre “2 filtros ativos” quando apenas um foi aplicado.
Voltar e Avançar devem restaurar filtros, resultados, paginação e ordenação. O artigo sobre paginação acessível mostra como preservar o conjunto completo na navegação.
Escolha entre aplicação imediata e botão
Aplicar a cada mudança reduz um passo, mas pode causar recarregamentos, atrasos e anúncios repetidos. Um botão “Aplicar filtros” permite escolher várias opções antes da consulta. Nenhuma abordagem é universal.
Prefira um botão quando:
- a consulta é lenta ou custa processamento;
- vários critérios costumam ser combinados;
- a lista de filtros é longa;
- cada atualização reorganiza muito conteúdo;
- a versão móvel usa um painel sobreposto.
Se a aplicação for imediata, não mova o foco a cada checkbox. Cancele requisições antigas e mantenha os controles disponíveis. A pessoa pode querer marcar outra opção antes de explorar a lista.
No celular, um botão pode fechar o painel depois da resposta. Devolva o foco para o botão que abriu os filtros ou para um resumo estável. O padrão de diálogos modais acessíveis ajuda quando o painel realmente bloqueia o restante da página. Não chame de modal uma gaveta que deixa o conteúdo de fundo interativo.
Anuncie a atualização sem ler a grade inteira
Depois de aplicar ou remover um filtro, mostre uma frase curta:
<p role="status" aria-atomic="true">18 modelos encontrados com 2 filtros ativos.</p>A WCAG 2.2 sobre mensagens de status orienta mudanças que precisam ser percebidas sem receber foco. A contagem e o estado de carregamento entram nesse caso quando a lista muda na mesma página.
Não coloque todos os resultados numa região viva. Isso transforma cada filtro em uma leitura longa e difícil de interromper. Anuncie quantidade, carregamento, falha ou estado vazio. A pessoa navega pela lista no próprio ritmo.
Se a atualização falhar, não desmarque os controles silenciosamente. Mantenha as escolhas, informe que os resultados não foram atualizados e ofereça nova tentativa.
Trate o estado vazio como combinação de critérios
Quando nenhum item corresponde, diga quais filtros produziram o conjunto vazio:
Nenhum modelo encontrado para Tipo: Produto e Setor: Saúde.Remova um filtro ou limpe todos para ver o catálogo completo.Ofereça ações reais. “Tente novamente” não ajuda se a mesma combinação continuará vazia. Um botão “Remover Setor: Saúde” ou “Limpar filtros” deixa a saída explícita.
Não desative todas as opções restantes sem explicar por quê. Se o sistema conhece a contagem por opção, pode mostrá-la no rótulo, mas a contagem precisa acompanhar a mesma consulta e não pode substituir o nome do filtro.
Mantenha filtros recolhíveis operáveis
Listas longas costumam usar acordeões. O título de cada grupo deve ser um botão que informa expandido ou recolhido. Não esconda um grupo ativo sem deixar sinal no título, como “Setor, 2 selecionados”.
Ao recolher, os controles internos saem da ordem de foco. Ao reabrir, continuam com o estado anterior. O guia de acordeões acessíveis cobre botão, aria-expanded, região associada e navegação.
Não coloque checkbox dentro do mesmo botão que abre o grupo. São duas ações diferentes. Separe o controle de expansão das opções.
Teste mudanças, remoção e retorno
Uma matriz curta encontra os defeitos que uma captura de tela esconde:
| Cenário | Resultado esperado |
|---|---|
| teclado | percorre grupos, opções, aplicar e limpar em ordem lógica |
| leitor de tela | anuncia grupo, rótulo e estado de cada controle |
| aplicação imediata | mantém foco e ignora respostas antigas |
| botão Aplicar | comunica critérios pendentes e aplicados |
| remover um filtro | sincroniza resumo, controle, URL e resultados |
| limpar todos | retorna ao conjunto padrão e informa a quantidade |
| zero resultados | identifica a combinação e oferece uma saída |
| falha de rede | preserva escolhas e permite tentar novamente |
| histórico | Voltar restaura filtros e lista correspondentes |
| largura pequena | painel abre, fecha e devolve foco corretamente |
Teste também com um único filtro, todos os filtros, valores inválidos na URL e uma opção que deixa de existir. Repita com zoom e texto ampliado para verificar se rótulos e contagens não cobrem os controles.
Dê ao agente um pedido que possa ser testado
Em vez de “melhore os filtros”, use critérios concretos:
Revise os filtros do catálogo desta landing page.
Use checkbox para Setor e radio para Tipo.Agrupe cada conjunto com fieldset e legend.Mostre os filtros ativos e permita remover um ou limpar todos.Preserve critérios, ordenação e página na URL.Anuncie carregamento, quantidade, falha e estado vazio sem mover o foco.
Teste teclado, leitor de tela, celular, histórico e falha de rede.Não publique antes de apresentar URLs e evidências dos testes.O agente pode implementar os controles e automatizar parte da verificação. A equipe decide a lógica de combinação, as opções válidas e quando uma mudança deve consultar o serviço.
Reteste no endereço final
No Site no Ar, o agente mantém os arquivos em public/, executa deploy e acompanha deploy_status até o fim, conforme o guia de Publicação.
Na versão pública:
- aplique filtros apenas com teclado;
- confira grupos e estados com leitor de tela;
- remova critérios pelo resumo;
- compartilhe uma URL filtrada em outra sessão;
- use Voltar e Avançar depois de várias mudanças;
- simule carregamento lento e falha;
- repita com zoom, toque e largura pequena.
Filtros acessíveis mantêm quatro partes em acordo: controles, resumo, URL e resultados. Se uma delas fica para trás, a pessoa não sabe qual conjunto está vendo nem como recuperá-lo.
