Нативный веб без JS: руководство по CSS Anchor Positioning API
Современная веб-разработка долгие годы страдала от отсутствия простого и производительного механизма для создания всплывающих окон, контекстных меню и подсказок (tooltips). Главная сложность заключалась в том, что абсолютно позиционированные элементы часто обрезаются родительскими контейнерами с включенным свойством overflow: hidden, а расчет координат относительно кнопки-триггера требовал постоянного отслеживания скролла и изменения размеров окна. Для решения этой проблемы разработчикам приходилось подключать громоздкие JavaScript-библиотеки вроде Popper.js или Floating UI. Это приводило к увеличению объема загружаемого кода и вызывало микролаги интерфейса при прокрутке страниц из-за частых пересчетов геометрии. Новая спецификация CSS Anchor Positioning API решает эту задачу нативно на уровне браузера, полностью избавляя разработчиков от необходимости использовать JavaScript для позиционирования.
Принцип работы и синтаксис привязки
В основе работы API лежит связывание двух элементов: элемента-якоря (anchor, обычно кнопка или ссылка) и позиционируемого элемента (target, например, всплывающее меню). Привязка и описание стилей реализуются в CSS в несколько шагов:
- Объявление якоря. Назначьте элементу-якорю уникальное имя с помощью свойства
anchor-name. Имя обязательно должно начинаться с двойного дефиса:.trigger-button { anchor-name: --tooltip-anchor; } - Позиционирование целевого элемента. Целевой элемент обязательно должен участвовать в positioned layout — без свойств
position: absoluteилиposition: fixedбраузер не запустит расчет координат относительно якоря. Задайте ему связь с якорем через свойствоposition-anchor:.tooltip-box { position: fixed; position-anchor: --tooltip-anchor; } - Размещение элемента на виртуальной сетке. Для быстрого размещения используйте свойство
position-area. Оно делит пространство вокруг якоря на виртуальную сетку 3x3. Вы можете разместить элемент в любой ячейке или растянуть его с помощью логических направлений, которые автоматически учитывают режим письма (writing mode) и направление текста:Свойство.tooltip-box { position-area: top center; }position-areaзаменяет собой ручные расчеты координат и декларативно выравнивает элемент, например, строго по центру над кнопкой-якорем. Расстояние между элементами при этом задается стандартными внешними отступами (margin). Подробности спецификации приведены на страницах W3C CSS Anchor Positioning Module Level 1 и MDN CSS anchor positioning.
Предотвращение переполнения и резервные положения
Одной из самых ценных функций API является встроенная обработка выхода элемента за границы экрана (overflow handling). Браузер самостоятельно рассчитывает свободное место и перестраивает положение всплывающего окна, если в исходной позиции оно перекрывается краями экрана.
Для настройки этого поведения используется свойство position-try-fallbacks (подробное описание в документации MDN position-try-fallbacks). Оно принимает список альтернативных положений или стандартные стратегии переворота, такие как flip-block (вертикальный переворот) или flip-inline (горизонтальный переворот):
.tooltip-box {
position-try-fallbacks: flip-block;
}
Если при исходном положении top center кнопка окажется у верхнего края экрана, браузер автоматически отразит подсказку вниз.
При реализации этой логики важно учитывать тип позиционирования. Если задать всплывающему окну свойство position: absolute, его ограничивающим контейнером (containing block) по умолчанию станет ближайший родительский элемент с позиционированием, отличным от static. Если этот родитель прокручивается, расчет выхода за границы экрана может сработать некорректно. Использование position: fixed делает ограничивающим контейнером окно просмотра (viewport), что гарантирует точное срабатывание механизмов предотвращения выхода за границы экрана.
Более новая спецификация Level 2 добавляет концепцию контейнерных запросов привязки (anchored container queries), позволяющих менять внутренние стили и стрелки-декоры всплывающего окна в зависимости от того, какое именно резервное положение выбрал браузер. Однако на текущий момент уровень поддержки этой функции существенно ниже базового синтаксиса.
Совместимость с браузерами и прогрессивное улучшение
На момент июля 2026 года базовая поддержка CSS Anchor Positioning API (статус Baseline 2026) реализована во всех основных семействах современных браузеров и охватывает около 81% устройств по данным сервиса Can I Use. Продвинутые возможности Level 2 поддерживаются на уровне примерно 64% браузеров. Подробный разбор практического использования и совместимости можно найти в руководстве web.dev: Anchor positioning.
Для сохранения работоспособности на старых устройствах рекомендуется использовать подход прогрессивного улучшения (progressive enhancement). В CSS-файлах выделите нативные стили привязки с помощью правила @supports:
@supports (position-area: top) {
.tooltip-box {
position: fixed;
position-anchor: --tooltip-anchor;
position-area: top center;
position-try-fallbacks: flip-block;
margin-bottom: 8px;
}
}
Для браузеров без поддержки API можно использовать JS-полифил от команды Oddbird, который эмулирует поведение нативной привязки. Однако стоит помнить, что полифил имеет ограничения по производительности на сложных макетах и не полностью покрывает свойства Level 2. В случаях с критически важными интерфейсами для старых браузеров использование классических JS-библиотек все еще остается надежным решением.
Пошаговое руководство по внедрению CSS Anchor Positioning
Для внедрения нативного позиционирования выполните следующие действия:
- Проверка окружения. Убедитесь, что используемая вами версия браузера поддерживает API, обратившись к справочнику.
- Разметка элементов. Создайте в HTML разметку кнопки-триггера и блока подсказки:
<button class="trigger-button">Наведи на меня</button><div class="tooltip-box">Всплывающая подсказка</div> - Объявление якоря в CSS. Задайте кнопке свойство
anchor-nameс уникальным именем, начинающимся с--. - Связывание целевого элемента. Задайте блоку подсказки свойства
position: fixedиposition-anchorсо ссылкой на имя кнопки. - Определение базовой позиции. Укажите свойство
position-areaдля размещения блока (например,top center). - Настройка резервных положений. Добавьте свойство
position-try-fallbacksсо значениемflip-blockдля автоматического переворота. - Добавление прогрессивного улучшения. Оберните стили привязки в блок
@supports (position-area: top)и настройте простую JS-заглушку или фиксированное положение в качестве резервного варианта для старых версий браузеров.
Успешное выполнение проверяется путем скролла страницы до упора: подсказка должна плавно следовать за кнопкой и автоматически менять положение на противоположное без задержек и скачков, которые ранее были характерны для решений на базе JavaScript.

