Back

Posicionamento de Âncora CSS Explicado

Posicionamento de Âncora CSS Explicado

Por anos, posicionar tooltips, menus dropdown e popovers significava lutar com cálculos JavaScript. Você precisava medir elementos, rastrear posições de scroll e recalcular constantemente para manter seus elementos de UI devidamente alinhados. O Posicionamento de Âncora CSS muda isso completamente ao permitir que você anexe elementos uns aos outros usando CSS puro—sem necessidade de JavaScript.

Pontos-Chave

  • O Posicionamento de Âncora CSS permite posicionamento de elementos com CSS puro, sem cálculos JavaScript
  • Use anchor-name e position-anchor para criar relacionamentos entre elementos
  • A propriedade position-area oferece posicionamento simples baseado em grid
  • Mecanismos de fallback integrados lidam automaticamente com casos extremos de viewport

O que é o Posicionamento de Âncora CSS?

O Posicionamento de Âncora CSS é uma API nativa do navegador que permite posicionar elementos relativos a outros elementos na página. Pense nisso como criar conexões invisíveis entre elementos: um atua como “âncora” (o ponto de referência), e outro atua como “alvo” (o elemento posicionado).

Isso elimina a necessidade de bibliotecas JavaScript de posicionamento ao construir padrões comuns de UI como tooltips, menus de contexto e diálogos flutuantes. O navegador lida com todos os cálculos complexos, incluindo limites do viewport e posições de scroll.

Propriedades Principais: Construindo Relacionamentos de Âncora

Configurando Âncoras com anchor-name

Primeiro, você precisa designar um elemento como âncora dando a ele um identificador único:

.menu-button {
  anchor-name: --main-menu;
}

O nome da âncora deve começar com dois traços (--), similar às propriedades customizadas do CSS.

Conectando Elementos com position-anchor

Em seguida, conecte seu elemento alvo à âncora:

.dropdown-menu {
  position: absolute;
  position-anchor: --main-menu;
}

O elemento alvo deve ter position: absolute ou position: fixed para funcionar com o posicionamento de âncora.

Posicionando Elementos com position-area

A propriedade position-area fornece a maneira mais simples de posicionar seu alvo. Ela usa um modelo de grid 3×3 com a âncora no centro:

.dropdown-menu {
  position: absolute;
  position-anchor: --main-menu;
  position-area: bottom center;
}

Você pode usar valores físicos (top, bottom, left, right) ou valores lógicos (block-start, inline-end) para melhor suporte à internacionalização. O prefixo span- permite que elementos se estendam por múltiplas células do grid:

.tooltip {
  position-area: top span-inline;
}

Ajuste Fino com a Função anchor()

Para controle preciso, use a função anchor() com propriedades inset:

.tooltip {
  position: absolute;
  position-anchor: --trigger;
  top: anchor(bottom);
  left: anchor(left);
}

Isso posiciona a borda superior do tooltip na borda inferior da âncora, com as bordas esquerdas alinhadas. Você também pode referenciar âncoras específicas explicitamente:

.multi-anchor-target {
  top: anchor(--anchor-1 bottom);
  right: anchor(--anchor-2 left);
}

Dimensionamento Responsivo com anchor-size()

A função anchor-size() permite dimensionar elementos baseado nas dimensões de sua âncora:

.dynamic-tooltip {
  position-anchor: --button;
  width: anchor-size(width);
  max-height: calc(anchor-size(height) * 2);
}

Isso cria tooltips que escalam proporcionalmente com suas âncoras—perfeito para designs responsivos.

Lidando com Casos Extremos usando position-try

O que acontece quando seu elemento posicionado atinge a borda do viewport? A propriedade position-try fornece posições de fallback:

.context-menu {
  position: absolute;
  position-anchor: --menu-trigger;
  position-area: bottom start;
  position-try: flip-block, flip-inline;
}

O navegador automaticamente tenta posições alternativas quando a posição primária causaria overflow. Palavras-chave integradas como flip-block e flip-inline lidam com cenários comuns, ou você pode definir fallbacks personalizados:

@position-try --compact-menu {
  position-area: top;
  width: 200px;
}

.context-menu {
  position-try: --compact-menu, flip-block;
}

Status de Suporte dos Navegadores

No final de 2024, o Posicionamento de Âncora CSS tem suporte crescente nos navegadores:

  • Chrome/Edge: Suporte completo desde a versão 125
  • Safari: Suportado a partir da versão 18
  • Firefox: Implementação em progresso

Para uso em produção, considere o polyfill da Oddbird que fornece compatibilidade retroativa até o Firefox 54 e Chrome 51. A detecção de funcionalidade é direta:

@supports (anchor-name: --test) {
  /* Estilos de posicionamento de âncora */
}

Dicas Práticas de Implementação

Ao implementar posicionamento de âncora CSS para tooltips e menus:

  1. Sempre redefina o posicionamento padrão para elementos popover: inset: auto
  2. Use propriedades lógicas para melhor internacionalização
  3. Combine com a API Popover para interações completamente livres de JavaScript
  4. Lembre-se da acessibilidade—adicione atributos ARIA apropriados para manter relacionamentos semânticos

Conclusão

O Posicionamento de Âncora CSS transforma como construímos elementos de UI flutuantes. Ao mover a lógica de posicionamento do JavaScript para o CSS, obtemos melhor performance, código mais limpo e tratamento automático de casos extremos. Enquanto aguardamos suporte completo dos navegadores, o polyfill fornece um caminho sólido para uso em produção. Comece experimentando com tooltips e menus dropdown—você rapidamente apreciará a simplicidade de declarar relacionamentos ao invés de calcular posições.

Perguntas Frequentes

Sim, o Posicionamento de Âncora CSS funciona com elementos criados dinamicamente. Contanto que as propriedades anchor-name e position-anchor estejam devidamente configuradas, o navegador estabelecerá o relacionamento de posicionamento independentemente de quando os elementos foram adicionados ao DOM.

O Posicionamento de Âncora CSS automaticamente rastreia posições de scroll dentro de contêineres. O elemento posicionado mantém seu relacionamento com a âncora mesmo quando o scroll ocorre, sem necessitar de event listeners JavaScript ou recálculo manual de posições.

Quando múltiplos elementos compartilham o mesmo anchor-name, o último elemento na ordem do DOM se torna a âncora ativa. Esse comportamento pode causar posicionamento inesperado, então é uma boa prática usar nomes de âncora únicos para cada relacionamento de posicionamento.

Sim, você pode animar elementos posicionados por âncora usando transições e animações CSS padrão. O relacionamento de âncora é mantido durante as animações, e propriedades como position-area podem ser suavemente transicionadas entre diferentes valores para efeitos de UI fluidos.

Truly understand users experience

See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..

OpenReplay