Перейти к содержимому

62. CSS Anchor Positioning

Иллюстрация к уроку

CSS Anchor Positioning — одна из самых мощных новинок в CSS 2024–2025. Она позволяет позиционировать один элемент относительно другого — якоря — без JavaScript. Всё, что раньше требовало Popper.js или Floating UI, теперь делается нативно в CSS.

Chrome 125+, Edge 125+. Safari и Firefox — в разработке. Для продакшена используй с feature detection или полифилом.


Раньше чтобы показать тултип под кнопкой, нужно было:

  1. Рассчитывать позицию через getBoundingClientRect() в JS
  2. Пересчитывать при скролле и ресайзе
  3. Подключать библиотеки типа Popper.js

Теперь:

button {
anchor-name: --my-button; /* 1. Называем якорь */
}
.tooltip {
position: absolute;
position-anchor: --my-button; /* 2. Привязываемся к нему */
top: anchor(bottom); /* 3. Позиционируем через anchor() */
left: anchor(center);
translate: -50% 0;
}

Любой элемент может быть якорем. Нужно только дать ему имя через anchor-name:

.button {
anchor-name: --btn; /* имя начинается с -- (как CSS-переменные) */
}
.badge {
anchor-name: --badge;
}

Плавающий элемент (position: absolute или fixed) привязывается к якорю:

.tooltip {
position: absolute;
position-anchor: --btn; /* привязываемся к якорю --btn */
}

anchor() возвращает координату якоря. Используется в top, right, bottom, left, inset:

.tooltip {
position: absolute;
position-anchor: --btn;
/* Расположить снизу от якоря */
top: anchor(bottom); /* верх тултипа = низ кнопки */
left: anchor(center); /* центр тултипа = центр кнопки */
translate: -50% 8px; /* сдвиг для точного выравнивания */
}

Доступные ключевые слова в anchor():

ЗначениеЧто означает
topверхняя граница якоря
bottomнижняя граница якоря
leftлевая граница якоря
rightправая граница якоря
centerцентр якоря (по оси зависит от свойства)
start / endлогические значения

Можно задавать размер плавающего элемента относительно якоря:

.dropdown {
position: absolute;
position-anchor: --btn;
top: anchor(bottom);
width: anchor-size(width); /* ширина = ширина кнопки */
}

Если тултип не помещается вверху — пусть отображается снизу. @position-try описывает альтернативные варианты, position-try-fallbacks — порядок перебора:

@position-try --flip-bottom {
top: anchor(top);
translate: -50% -100%;
}
.tooltip {
position: absolute;
position-anchor: --btn;
top: anchor(bottom);
left: anchor(center);
translate: -50% 8px;
/* Если не влезает — попробовать --flip-bottom */
position-try-fallbacks: --flip-bottom;
}

inset-area — сетка позиционирования (новый подход)

Заголовок раздела «inset-area — сетка позиционирования (новый подход)»

inset-area делает позиционирование ещё проще — через воображаемую сетку 3×3 вокруг якоря:

.tooltip {
position: absolute;
position-anchor: --btn;
inset-area: bottom center; /* ниже и по центру якоря */
}

Значения — комбинации направлений: top, bottom, left, right, center, span-all, block-start и др.