Posicionamento de Âncora CSS Atinge a Baseline: O que Desenvolvedores Frontend Precisam Saber para Substituir Popper.js e Floating UI
Por mais de uma década, posicionar um tooltip, popover ou dropdown em relação a outro elemento tem sido uma das tarefas enganosamente mais difíceis no desenvolvimento frontend. O Posicionamento de Âncora CSS, agora oficialmente um recurso da Baseline desde janeiro de 2026, muda tudo. Ele fornece uma forma nativa e declarativa de anexar um elemento a outro, eliminando a necessidade de bibliotecas JavaScript como Popper.js e Floating UI na grande maioria dos casos de uso.
Neste mergulho profundo, você aprenderá exatamente como o Posicionamento de Âncora CSS funciona, verá comparações de código reais e entenderá o caminho de migração a partir de mecanismos de posicionamento JavaScript pesados. Ao final, você terá um roteiro claro para reduzir o tamanho do seu bundle e simplificar seu código de UI.
Por que o Posicionamento Sempre Foi um Problema
Até um simples tooltip requer calcular a posição do elemento alvo, colisões com a viewport e comportamento de inversão. Bibliotecas como Popper.js (mais de 12 milhões de downloads semanais no npm) e Floating UI (a evolução moderna) resolveram isso com milhares de linhas de JavaScript, ao custo de overhead em tempo de execução e integração complexa. Mas elas eram necessárias porque apenas o CSS não conseguia lidar com posicionamento dinâmico.
"Por anos, dissemos a nós mesmos que JavaScript era a única maneira de posicionar elementos flutuantes de forma confiável. O Posicionamento de Âncora CSS prova que estávamos errados, e é glorioso."
Considere o clássico dilema do tooltip: um botão na borda da tela. Você quer que o tooltip apareça acima ou abaixo, mas se não houver espaço, ele deve inverter para o lado. Conseguir isso com JS puro significava ouvir eventos de scroll e redimensionamento, medir dimensões e alternar classes, uma batalha contra o layout thrashing. O Posicionamento de Âncora CSS resolve isso com algumas propriedades.
Como Funciona o Posicionamento de Âncora CSS
A especificação introduz dois conceitos principais: elementos âncora e elementos posicionados. Uma âncora é qualquer elemento que serve como ponto de referência; o elemento posicionado é aquele que você deseja colocar em relação a essa âncora. A mágica acontece através da função anchor() e da propriedade anchor-name .

/* Define uma âncora */
.target \{
anchor-name: --my-anchor;
\}
/* Posiciona um tooltip relativo a essa âncora */
.tooltip \{
position: absolute;
position-anchor: --my-anchor;
bottom: anchor(top);
left: anchor(center);
translate: -50% 0;
\}
Isso é um tooltip básico posicionado acima do alvo, centralizado horizontalmente. Sem JavaScript, sem medições, apenas CSS. E quando o tooltip ultrapassa a viewport, @position-fallback permite definir posicionamentos alternativos sem uma única linha de script.
O Posicionamento de Âncora CSS não é apenas para tooltips. Menus dropdown, seletores de data, menus de contexto e até painéis de UI aninhados complexos podem ser ancorados declarativamente, tornando o código mais fácil de manter e depurar.
Principais Propriedades CSS para Ancora
anchor-name: dá a um elemento um identificador de âncoraposition-anchor: especifica qual âncora o elemento posicionado usainset-area: uma abreviação para posicionar o elemento posicionado em relação à âncora (ex.: "top center", "bottom right")anchor()função: resolve para uma borda específica da âncora (top, bottom, left, right, center, etc.)@trybloco: define posições de fallback quando o posicionamento padrão causa overflow
Substituindo Popper.js pelo Posicionamento de Âncora CSS
Popper.js tem sido o padrão ouro para posicionamento em bibliotecas como Bootstrap, Material UI e milhares de implementações personalizadas. Vamos comparar uma configuração típica do Popper.js com o equivalente nativo em CSS.
Uma inicialização típica do Popper.js se parece com isso:
import { createPopper } from '@popperjs/core';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
const popperInstance = createPopper(button, tooltip, \{
placement: 'top',
modifiers: [
\{ name: 'offset', options: \{ offset: [0, 8] \} \},
\{ name: 'flip', options: \{ fallbackPlacements: ['bottom', 'left'] \} \}
]
\});
Com o Posicionamento de Âncora CSS, o mesmo comportamento é alcançado apenas com CSS e semântica HTML:
button \{
anchor-name: --tooltip-anchor;
\}
[role="tooltip"] \{
position-anchor: --tooltip-anchor;
inset-area: top center;
margin-bottom: 8px;
/* Fallback defined via @try */
position-try: --bottom, --left;
\}
@position-try --bottom \{
inset-area: bottom center;
margin-top: 8px;
margin-bottom: 0;
\}
@position-try --left \{
inset-area: center left;
margin-right: 8px;
\}
Ao migrar, você pode manter os mesmos papéis ARIA e manipulação de eventos (mouseenter/focus) para mostrar/ocultar o tooltip. A lógica de posicionamento simplesmente passa inteiramente para o CSS.
Substituindo Floating UI (o Sucessor do Popper)
O Floating UI modernizou a abordagem com uma arquitetura baseada em middleware e melhor tree-shaking. No entanto, ainda envia JavaScript. Veja como um tooltip do Floating UI migra:

// Floating UI com React
import { useFloating, offset, flip, shift } from '@floating-ui/react';
function Tooltip({ children, content }) \{
const \{ x, y, strategy, refs \} = useFloating(\{
placement: 'top',
middleware: [offset(8), flip(), shift()]
\});
// ... render with style=\{\{ position: strategy, left: x, top: y \}\}
\}
Substitua tudo isso por CSS estático. Em frameworks modernos como Next.js ou Remix, você pode enviar zero código de posicionamento em JavaScript. O efeito nas Core Web Vitals é imediato.

O gráfico acima mostra a queda drástica no tempo de bloqueio da thread principal ao mudar de posicionamento baseado em cálculo JavaScript para a âncora CSS nativa. Para sites de e-commerce com dezenas de tooltips e dropdowns, o ganho cumulativo é substancial.
Benefícios de Desempenho e Tamanho do Bundle
Cada kilobyte de JavaScript importa. Popper.js + suas dependências podem adicionar 15–20 kB (gzipados) ao seu bundle. Floating UI é mais leve, mas ainda 8–12 kB. Para um site móvel médio, isso é uma melhoria mensurável no Time to Interactive.
Mas o verdadeiro ganho de desempenho está em tempo de execução. O Posicionamento de Âncora CSS é tratado pelo mecanismo de layout do navegador; ele não precisa recalcular posições em cada evento de scroll ou redimensionamento via JavaScript. Pode usar transformações aceleradas por GPU e evitar completamente o layout thrashing.
Testamos um dashboard com 50 tooltips ancorados. Com Popper.js, o scroll causava múltiplos reflows forçados e um engasgo perceptível. A versão com âncora CSS renderizou suavemente mesmo em um dispositivo móvel de gama média.
Suporte de Navegadores e Fallbacks
Desde janeiro de 2026, o Posicionamento de Âncora CSS faz parte do conjunto Baseline , o que significa que é suportado nativamente em todos os principais navegadores: Chrome, Firefox, Safari e Edge. Para navegadores mais antigos, um fallback gracioso é simples: o elemento posicionado aparecerá em seu local de fluxo normal (muitas vezes não ideal, mas funcional) ou você pode usar um pequeno polyfill se precisar suportar versões mais antigas.

Você pode usar @supports para aplicar condicionalmente as novas propriedades:
@supports (anchor-name: --test) \{
.tooltip \{
position-anchor: --my-anchor;
inset-area: top;
\}
\}
/* Fallback para navegadores que não suportam posicionamento de âncora */
@supports not (anchor-name: --test) \{
.tooltip \{
top: 0;
left: 50%;
/* ... simple static position */
\}
\}
Embora seja Baseline, sempre teste em dispositivos mais antigos. No início de 2026, o corte global de suporte é de aproximadamente 95% dos usuários. Para aplicações empresariais, pode ser necessário um período de transição onde você detecte recursos e sirva a lógica JS antiga apenas quando necessário.
Guia de Migração Passo a Passo
Pronto para abandonar sua biblioteca de posicionamento? Siga este roteiro prático:
- Auditar uso existente: Catalogue cada tooltip, popover, dropdown e menu que usa Popper.js ou Floating UI.
- Definir nomes de âncora: Adicione
anchor-nameaos elementos de referência. Escolha nomes descritivos como--profile-menu-anchor. - Reescrever CSS de posicionamento: Substitua a lógica JS de posicionamento por
inset-areaeanchor(). Use blocos@trypara comportamento de inversão/fallback. - Remover listeners e middlewares JS: Exclua listeners de redimensionamento/rolagem, funções modificadoras e a importação da biblioteca. Sua alternância de exibir/ocultar permanece (via classes CSS ou algumas linhas de JS puro).
- Testar em diferentes viewports: Verifique o comportamento de
