Menus, abas e paginação: navegação que não perde o visitante
Menu mal resolvido perde o visitante em silêncio: ele deixa de achar o que procura e sai sem reclamar com ninguém. O Nielsen Norman Group mediu esse custo em 2016: no desktop, o menu escondido atrás do ícone de três linhas foi usado em 27% dos casos, contra 48% da navegação visível, e as tarefas ficaram pelo menos 39% mais lentas. Cada decisão aqui vem com o número e o dono: quando o mega menu vence e o atraso de hover que 60% dos sites esquecem (Baymard, 2023), o papel ARIA certo para cada tipo de menu (W3C), os alvos de toque do WCAG 2.2, o critério de abas do Nielsen Norman Group e a escolha entre paginar, carregar mais e rolagem infinita, com o que o Google exige por baixo. A mesma matéria está em aula de vídeo e podcast logo abaixo.
Guia do menu Design do portal, construído sobre pesquisa de fontes primárias verificada em 18/08/2026 e sobre os capítulos de navegação do curso Frontends com Vibecoding, de Alexandre Caramaschi. Ele compõe o menu com o guia de ícones, ilustrações, animação e geração de imagens e conversa com a aula de landing e formulário.
A aula, em vídeo e em podcast
O conteúdo deste guia virou uma aula gerada no NotebookLM a partir do dossiê de pesquisa, servida nos arquivos originais, sem recompressão. O vídeo apresenta o panorama em minutos; o podcast aprofunda a conversa para ouvir no deslocamento.
Arquivos originais: vídeo em MP4 · podcast em M4A · legenda
O custo de esconder a navegação
Esconder o menu custa uso, descoberta e velocidade, e o custo tem medição. O estudo do Nielsen Norman Group de 2016, com 179 participantes em seis sites, registrou: no desktop, as pessoas usaram o menu escondido em 27% dos casos, contra 48% com a navegação visível e 50% com a navegação combinada, em que parte dos itens fica exposta. No mesmo estudo do Nielsen Norman Group, a descoberta de conteúdo caiu mais de 20% com a navegação escondida e as tarefas no desktop ficaram pelo menos 39% mais lentas. No celular do mesmo teste a lentidão foi de 15%, e essa diferença sustenta a regra prática: o hambúrguer é tolerável no celular e um erro no desktop.
A consequência operacional é uma divisão de camadas. Ação de alta frequência mora na superfície, visível; o secundário desce para a gaveta. E antes de qualquer forma vem o rótulo: o Nielsen Norman Group chama de "aroma de informação" a propriedade de um link dizer, antes do clique, o que existe do outro lado. Trocar Saiba mais por Ver planos e preços é a melhoria mais barata de uma navegação, e o teste cabe numa frase: leia cada rótulo isolado do resto da tela e pergunte se dá para saber o que vem depois do clique.
A gaveta que o time entrega esta semana tem quatro requisitos: foco preso dentro do painel, fechamento por Esc, fechamento por clique fora e devolução do foco ao gatilho. O ícone leva a palavra "Menu" escrita ao lado do desenho. E o botão voltar do celular fecha a gaveta em vez de expulsar a pessoa do site: registra uma entrada no histórico ao abrir, escuta o evento de voltar para fechar, e desfaz a entrada quando o painel fecha pelo X ou pelo Esc. O curso Frontends com Vibecoding resolve isso em quinze linhas, e o prompt pronto está no fim da página.
Os quatro sentidos de "menu", e o erro que a IA repete
O erro mais caro em acessibilidade de navegação é usar o papel ARIA de menu em navegação de site. O exemplo oficial de navegação do W3C, no guia de práticas WAI-ARIA, declara que a própria implementação dispensa esse papel: navegação típica de site fica sem as interações de teclado que as tecnologias assistivas esperam de um widget com o papel de menu, então o padrão certo é o de área que abre e fecha (disclosure), com <nav> e links. O papel de menu fica reservado ao menu de ação, com comandos como editar, duplicar e excluir, que imita os menus do sistema operacional e responde ao teclado completo: setas circulando entre os itens, Home e End, uma letra pulando para o item, Enter acionando e Esc fechando com o foco de volta no gatilho.
1. Navegação de site
Lista de links para outras páginas: <nav>, lista e link do próprio HTML. O papel de menu traria navegação por setas que ninguém espera em link de site.
2. Área que abre e fecha
Um botão mostra e esconde um trecho: submenu, navegação de celular, FAQ. O botão declara se está aberto e a que área se refere. É o padrão que resolve a maioria dos mega menus.
3. Menu de ação
Comandos sobre a própria tela. Aqui entra o papel de menu, com o teclado completo descrito acima. Improvisar com div e onClick exclui em silêncio quem navega sem mouse.
4. Barra de menu de aplicativo
Faixa permanente tipo Arquivo/Editar. É rara na web e quase sempre escolhida por engano.
Esse é também o erro mais frequente em código gerado por inteligência artificial: o modelo lê a palavra "menu" e aplica o papel de aplicativo. A correção entra no próprio pedido ao agente, numa frase: a navegação primária usa <nav> e links, sem papel de menu. Nas primitivas, o shadcn/ui separa os dois propósitos em componentes distintos, NavigationMenu para links e DropdownMenu para ações, e desde julho de 2026 abre projetos novos sobre o Base UI, mantido pela equipe do MUI e estável desde 11 de dezembro de 2025. Do lado nativo, o atributo popover entrega abertura, fechamento, Esc e clique fora sem JavaScript, com uma ressalva: ele define papel nenhum, então o menu de ação continua precisando do papel declarado ou de uma primitiva por baixo.
Alvos de toque: cada número com o dono certo
Números de alvo de toque circulam misturados, e a mistura reprova auditoria. A tabela separa o que é norma exigível do que é recomendação de plataforma, com a fonte de cada linha.
| Régua | Valor | Quem exige, e a que título |
|---|---|---|
| Piso de conformidade | 24 por 24 pixels de CSS | WCAG 2.2, critério 2.5.8, nível AA, com exceções para alvos espaçados e links em linha de texto (W3C, 2023) |
| Conforto de norma | 44 por 44 pixels de CSS | WCAG 2.2, critério 2.5.5, nível AAA (W3C, 2023) |
| Recomendação Android | 48 por 48 dp | Google, documentação de acessibilidade do Android |
| Padrão Apple | 44 por 44 pontos, mínimo de 28 por 28 | Apple Human Interface Guidelines, tabela de tamanhos de controle do iOS |
| Barra inferior de aplicativo | Três a cinco destinos de igual importância | Material Design 3 (Google); a Apple pede "o número apropriado", sem fixar quantidade |
| Folga entre alvos | Pelo menos 8 pixels entre vizinhos | Curso Frontends com Vibecoding: três alvos de 24 colados passam no piso e continuam errados |
Fontes verificadas nos textos normativos e nas documentações oficiais em 18/08/2026. A formulação "a Apple exige 44 como mínimo" caiu na verificação: 44 é o padrão recomendado dela, e o mínimo listado é 28.
Abas: visões paralelas, com o critério de decisão
Abas alternam visões paralelas do mesmo recurso e ficam fora da navegação de topo do site. O Nielsen Norman Group, em revisão de 2024 do artigo clássico sobre abas, dá o critério que decide: quando a pessoa precisa comparar informação entre painéis, a troca repetida de aba cobra memória de curto prazo e aumenta o custo de interação, e uma página única vence. Quanto menos abas, melhor; o conteúdo das abas não padrão é suplementar, nunca crítico; e quando o conteúdo não forma grupos nítidos, aba é o controle errado.
O teclado vem do guia de práticas do W3C: as setas circulam entre as abas, e a ativação automática ao focar só é recomendada quando o painel aparece sem latência perceptível, o que na prática exige conteúdo pré-carregado. Painel que carrega da rede pede ativação manual, com Enter ou Espaço. A aba selecionada se marca para o leitor de tela, com o indicador visual somando mais de um sinal além da cor. Dois usos dos estudos de caso do curso: na documentação da Stripe, as abas de linguagem do painel de código são um grupo de abas de verdade, com troca pelas setas; na Booking e na LATAM, a caixa de busca da home pede a intenção primeiro em abas de produto, e cada aba herda os dados de viagem já digitados.
Aba é estado, e o lugar dela é a URL. A documentação oficial do Next.js lista os três ganhos: o endereço fica favoritável e compartilhável, o servidor monta a página já no estado certo, e a analítica enxerga filtro e busca sem código extra no cliente. A ferramenta de referência em React é o nuqs, um useState que mora na query string, na versão 2.9.6 de 17/08/2026. Filtro em useState comum some no recarregamento, quebra o botão Voltar e faz o link chegar vazio na mão de quem o recebe.
Paginar, carregar mais ou rolagem infinita: a decisão com dono
Para lista de produtos, o teste de usabilidade do Baymard Institute concluiu que o botão de carregar mais, combinado com carregamento preguiçoso, é a implementação superior, e a atualização de pesquisa de 2024 do instituto, com mais de 5.550 horas de teste, manteve a preferência. As faixas de quantidade medidas em 2020: o desktop carrega de 100 a 150 itens para produto visual e de 50 a 100 para produto de especificação; o celular, de 15 a 30; e 52% dos sites erram essa quantidade.
O Nielsen Norman Group, em artigo de 2022, delimita o território da rolagem infinita: fluxo de itens homogêneos consumido sem tarefa específica, como um feed social. Fora desse território, a rolagem infinita clássica cobra três vezes: o rodapé fica inalcançável, o SEO sofre e a acessibilidade quebra.
| Padrão | Onde vence | O preço, com a fonte |
|---|---|---|
| Paginação numerada | Consulta com destino, comparação e volta ao ponto; grids de dados | Um clique a mais por página; o AG Grid a recomenda como a melhor saída de acessibilidade para volume grande (documentação oficial) |
| Carregar mais + lazy-load | Lista de produtos em e-commerce | Implementação superior no teste do Baymard (2016, mantida na atualização de 2024); exige URLs paginadas por baixo para o Google |
| Rolagem infinita | Feed homogêneo sem tarefa específica (Nielsen Norman Group, 2022) | Rodapé inalcançável, SEO e acessibilidade; em resultados de busca, o Baymard a desaconselha desde 2016 |
A falha que mais irrita tem número e mecanismo. Em 2020 o Baymard mediu que 13% dos grandes e-commerces devolvem o visitante ao topo da lista quando ele volta da página de produto, e o visitante desiste de refazer a rolagem. O controle disso é a History API do navegador, com scrollRestoration, e a condição real: em lista carregada dinamicamente, restaurar a posição só funciona se o aplicativo repovoar os itens antes de restaurar. Os prompts de lista longa no fim da página cobrem o caso.
O que o Google exige por baixo
A documentação vigente do Google Search Central aposentou o rel=next/prev ("o Google não usa mais essas tags") e explica o risco da rolagem infinita para descoberta: os rastreadores do Google clicam botão nenhum e em geral disparam função nenhuma de JavaScript. De uma coleção indexável, ela pede três coisas:
- Links de âncora reais (
<a href>) entre as páginas da coleção. - Uma URL única por página, com a numeração fora do fragmento
#, que o Google ignora. - Canonical próprio de cada página, nunca tudo apontando para a página 1.
A saída é manter URLs paginadas por baixo da experiência de rolagem. Em 2026 isso vale dobrado, porque agentes de IA também leem sites: a Cloudflare mediu em junho de 2025 a plataforma Claude fazendo cerca de 71.000 requisições de página para cada visita referida, e conteúdo que só existe atrás de um clique fica fora dessa leitura.
Acessibilidade e a régua legal
O padrão oficial do W3C para rolagem infinita acessível é o Feed Pattern do guia de práticas: Page Down e Page Up movem o foco entre os artigos, e Ctrl+End e Ctrl+Home saltam para depois e antes do feed, que é como o usuário de leitor de tela escapa da lista. Nada disso vem de graça: exige gestão de foco e atributos de posição.
Virtualização cobra em acessibilidade
A documentação do próprio AG Grid admite que as linhas saem de ordem no DOM para leitores de tela e recomenda paginação como a melhor saída em volume grande.
O custo de memória caiu
O TanStack Table v9, estável desde 4 de agosto de 2026, reduziu em até 86% o heap retido no cenário de um milhão de linhas, segundo o benchmark do fornecedor.
A alternativa nativa
content-visibility: auto pula a renderização mantendo o conteúdo no Ctrl+F e na ordem de tabulação, ao contrário da virtualização por JavaScript, que remove o nó (MDN).
A régua legal fecha a conta. O European Accessibility Act se aplica desde 28 de junho de 2025 e alcança nominalmente o comércio eletrônico; o artigo 63 da Lei 13.146/2015 obriga acessibilidade nos sites de empresas com sede ou representação no Brasil; e em julho de 2026 a Justiça Federal deu à União 180 dias para apresentar o plano de acessibilidade dos sites federais, sob multa diária de R$ 10 mil.
O que a plataforma web já entrega, com data
Recurso de navegação nativo se adota pelo status Baseline conferido no dia, com o estado final funcionando sem o recurso. O retrato de 18/08/2026, pelo webstatus.dev:
| Recurso | Status em 18/08/2026 | O que muda no menu |
|---|---|---|
Atributo popover | Baseline desde 27/01/2025, fechado pelo Safari do iOS 18.3 | Painel flutuante com abertura, fechamento, Esc e clique fora sem JavaScript |
<details name> (acordeão exclusivo) | Baseline desde 03/09/2024, fechado pelo Firefox 130 | Grupo de seções em que só uma fica aberta, sem script |
| View Transitions no mesmo documento | Baseline desde 14/10/2025, fechado pelo Firefox 144 | Transição de tela contínua em navegação de aplicação |
| View Transitions entre documentos | Fora do Baseline, sem Firefox | Só como melhoria progressiva |
| Posicionamento por âncora do CSS | Chegou ao Firefox 147 em 13/01/2026; o conjunto segue como limitado no webstatus.dev | Popover ancorado ao gatilho sem biblioteca, ainda atrás de verificação de suporte |
Carrossel CSS (::scroll-button, ::scroll-marker) | Só Chrome e Edge, desde a versão 135 de 01/04/2025 | Botões e marcadores nativos de carrossel; produção exige retaguarda |
Status lidos na API oficial do webstatus.dev e nas release notes de Mozilla e Google em 18/08/2026. Baseline é retrato datado: confira no dia em que for escrever o código.
O resumo em uma peça
O infográfico condensa os números da aula para colar no mural do time ou mandar no grupo: o uso do menu visível contra o escondido, o atraso do mega menu, o papel certo de cada menu, os alvos de toque e a decisão de lista longa. Gerado no NotebookLM a partir do dossiê de pesquisa desta página.
Prompts prontos
Menu suspenso operável por teclado (do curso)
Torne este menu suspenso totalmente operável por teclado:
- Enter/Espaço no gatilho abre; Esc fecha e devolve o foco ao botão gatilho.
- O botão expõe aria-expanded e aria-haspopup.
- A navegação primária do site usa <nav> e links, SEM role="menu";
role="menu" só no menu de ações.
- Respeite prefers-reduced-motion na animação de abertura.
- Foco visível em todos os itens (:focus-visible, anel de 2px).
Mostre o TSX.Gaveta que fecha no botão voltar do aparelho (do curso)
Implemente uma gaveta de filtros para celular com o botão voltar do
aparelho significando "fechar o painel", em três movimentos:
1. Ao abrir, registre uma parada no histórico
(window.history.pushState({ gaveta: true }, "")).
2. Escute o evento popstate e use-o apenas para fechar a gaveta,
nunca para navegar.
3. Se a gaveta fechar pelo X ou pelo Esc, desfaça a parada
(window.history.back() se o estado atual for da gaveta);
sem esta limpeza sobra um "voltar" morto no histórico.
Complete com: foco preso no painel, Esc fecha, clique fora fecha,
foco devolvido ao gatilho, e a lista interna com
overflow-y: auto e overscroll-behavior: contain.Lista longa que o Google e o leitor de tela enxergam
Implemente a lista de itens com botão "Carregar mais" e lazy-load,
com estas garantias:
- URLs paginadas reais por baixo (History API): cada lote avança
?pagina=N, com link <a href> para a próxima página presente no HTML
e canonical próprio por página (nunca tudo para a página 1).
- Ao voltar da página de detalhe, o visitante retorna à MESMA posição:
repovoe os itens carregados antes de restaurar o scroll
(history.scrollRestoration).
- Acessibilidade: siga o Feed Pattern do W3C APG (Page Down/Page Up
entre itens; Ctrl+End/Ctrl+Home saltam o feed); o rodapé permanece
alcançável; o foco nunca fica preso na lista.
- Estado de filtro e página na URL com nuqs, nunca em useState solto.
Critério de aceite: com JavaScript desligado, a página 2 existe e tem
conteúdo; com leitor de tela, dá para sair da lista.Por onde começar
Assista à aula, abra a navegação da peça que o time mantém hoje e aplique três decisões nesta ordem: meça o atraso de hover do menu (a faixa do Baymard é 300 a 500 milissegundos); confira se a navegação primária usa <nav> com links e se o item ativo soma mais de um sinal além da cor; e navegue a lista mais longa do site até o rodapé só com o teclado. O que falhar vira o backlog da semana, com os prompts desta página. O menu Design continua no guia de ícones, ilustrações, animação e geração de imagens, e o restante do portal em landing e formulário e no glossário.