Padrões de menus suspensos e popovers
Crie menus suspensos e popovers acessíveis usando posicionamento CSS e a API Popover.
Padrões de menus suspensos e popovers é uma aula grátis de CSS Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de CSS Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de CSS Academy inclui 4 aulas no total.
A API de popover
A API de popover do HTML (Chrome 114+, amplamente compatível) oferece um comportamento declarativo de exibição e ocultação: o atributo popover no alvo e popovertarget no botão acionador. Nenhum JavaScript é necessário para a abertura e o fechamento básicos, incluindo o fechamento ao clicar fora e o tratamento da tecla Escape.
Estilização dos elementos sobrepostos
Selecione os elementos popover com [popover] ou :popover-open. O pseudo-elemento ::backdrop está disponível para escurecer o plano de fundo. Os elementos popover são renderizados na camada superior, como os diálogos — sem problemas de empilhamento causados por z-index.
Posicionamento de menus suspensos com posicionamento por âncora
O posicionamento por âncora do CSS (Chrome 125+) posiciona um elemento popover em relação ao seu acionador sem JavaScript: anchor-name: --btn no acionador, position-anchor: --btn no elemento popover e, em seguida, top: anchor(bottom); left: anchor(left) para alinhá-lo abaixo do acionador.
Alternativa com position: absolute
Sem o posicionamento por âncora, use um elemento contêiner pai posicionado: position: relative no contêiner e position: absolute; top: 100%; left: 0 no menu suspenso. Isso funciona em diferentes navegadores, mas exige que o acionador e o menu suspenso sejam elementos irmãos dentro de um contêiner posicionado.
CSS do menu suspenso
Estilize a lista do menu como position: absolute; background: var(--color-surface); box-shadow: var(--shadow-md); border-radius: var(--radius-md); padding: var(--spacing-1) 0; min-width: 200px. Os itens do menu usam preenchimento, plano de fundo ao passar o cursor e exibição em largura total.
Animação
Anime a abertura e o fechamento do elemento popover usando @starting-style para a entrada e transition-behavior: allow-discrete para animar a alteração da propriedade display. Isso permite criar animações de entrada e saída somente com CSS, vinculadas ao estado aberto ou fechado do elemento popover.
Acessibilidade do teclado
Os menus suspensos precisam oferecer suporte ao teclado: as teclas de seta navegam pelos itens do menu, Enter/Espaço ativam o item em foco, e Escape fecha o menu e devolve o foco ao acionador. A API de popover trata Escape automaticamente; a navegação pelas teclas de seta exige o tratamento de eventos em JavaScript.
ARIA para menus suspensos personalizados
Menu suspenso personalizado (sem usar a API de popover): adicione aria-haspopup="listbox" e aria-expanded ao acionador, role="listbox" à lista e role="option" e aria-selected a cada item. Os leitores de tela anunciam o estado expandido e a quantidade de itens.
Transbordamento e colisão com a janela de visualização
Um menu suspenso posicionado abaixo do acionador pode transbordar pela parte inferior da janela de visualização. Detecte isso com IntersectionObserver ou getBoundingClientRect e inverta o menu para que fique acima do acionador. O posicionamento por âncora do CSS lida com isso usando position-try-fallbacks.
Menus suspensos multinível
Menus suspensos aninhados (submenus) adicionam complexidade. Posicione os submenus à direita dos itens pai. Adicione um atraso antes de ocultá-los ao mover o mouse para fora (usando transition-delay do CSS ou um tempo limite do JS) para impedir que os submenus sejam fechados durante movimentos diagonais do mouse.
Considerações para dispositivos sensíveis ao toque
Menus suspensos acionados ao passar o cursor não funcionam em dispositivos sensíveis ao toque — não existe estado de passar o cursor. Use acionadores de clique ou toque universalmente. Fechar ao tocar fora funciona por meio do fechamento ao clicar fora da API de popover ou de um ouvinte de cliques no documento que feche os menus suspensos abertos.
Verificação de conhecimento
O que a API de popover fornece automaticamente e que antes exigia JavaScript personalizado?
Resumo
A API de popover e o posicionamento por âncora do CSS permitem criar, em conjunto, padrões declarativos de menus suspensos e elementos sobrepostos com uso mínimo de JavaScript. Para obter suporte mais amplo nos navegadores, os padrões com contêineres posicionados funcionam de forma confiável. Acessibilidade do teclado, atributos ARIA, tratamento de colisões com a janela de visualização e suporte a dispositivos sensíveis ao toque completam componentes de menus suspensos prontos para produção.
Perguntas Frequentes
A aula “Padrões de menus suspensos e popovers” é grátis?
Sim — o texto completo de “Padrões de menus suspensos e popovers” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de CSS Academy, atualize para CoddyKit PRO. O curso de CSS Academy inclui 4 aulas no total.
O que vou aprender em “Padrões de menus suspensos e popovers”?
Crie menus suspensos e popovers acessíveis usando posicionamento CSS e a API Popover. Você pratica CSS Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar CSS Academy?
Nenhuma experiência prévia é necessária. CSS Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.
Quanto tempo leva a aula “Padrões de menus suspensos e popovers”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de CSS Academy?
Sim. Cada aula de CSS Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Componente de cartão com propriedades personalizadas de CSS
- Estilização de modais e diálogos
- Padrões de menus suspensos e popovers
- Componente de abas com :checked versus JS