divmagic Make design
SimpleNowLiveFunMatterSimple
CSS Anchor Positioning в 2026 году: Как он заменяет Popper.js и Floating UI
BlogsCSSCSS Anchor Positioning в 2026 году: Как он заменяет Popper.js и Floating UI
CSS

CSS Anchor Positioning в 2026 году: Как он заменяет Popper.js и Floating UI

CSS Anchor Positioning достигает статуса Baseline: что нужно знать фронтенд-разработчикам для замены Popper.js и Floating UI

Более десяти лет позиционирование подсказки, всплывающего окна или выпадающего списка относительно другого элемента было одной из самых обманчиво сложных задач во фронтенд-разработке. CSS Anchor Positioning, теперь официально являющийся функцией Baseline с января 2026 года, меняет всё. Он предоставляет нативный, декларативный способ привязки одного элемента к другому, устраняя необходимость в JavaScript-библиотеках, таких как Popper.js и Floating UI, в подавляющем большинстве случаев.

В этом глубоком погружении вы узнаете, как именно работает CSS Anchor Positioning, увидите реальные сравнения кода и поймёте путь миграции от тяжёлых JavaScript-движков позиционирования. К концу у вас будет чёткий план по сокращению размера бандла и упрощению UI-кода.

Почему позиционирование всегда было проблемой

Даже простая подсказка требует вычисления позиции целевого элемента, обработки коллизий с областью просмотра и поведения переворота. Библиотеки вроде Popper.js (более 12 миллионов еженедельных загрузок npm) и Floating UI (современная эволюция) решали это с помощью тысяч строк JavaScript, ценой накладных расходов во время выполнения и сложной интеграции. Но они были необходимы, потому что CSS сам по себе не мог справиться с динамическим размещением.

«Годами мы говорили себе, что JavaScript — единственный способ надёжно позиционировать плавающие элементы. CSS Anchor Positioning доказывает, что мы ошибались, и это великолепно.»

Рассмотрим классическую проблему подсказки: кнопка на краю экрана. Вы хотите, чтобы подсказка появлялась сверху или снизу, но если нет места, она должна переворачиваться в сторону. Достижение этого с помощью ванильного JS означало прослушивание событий прокрутки и изменения размера, измерение размеров и переключение классов — борьбу с перекомпоновкой макета. CSS Anchor Positioning решает это с помощью нескольких свойств.

Как работает CSS Anchor Positioning

Спецификация вводит две ключевые концепции: якорные элементы и позиционируемые элементы. Якорь — это любой элемент, служащий точкой отсчёта; позиционируемый элемент — тот, который вы хотите разместить относительно этого якоря. Магия происходит через функцию anchor() и свойство anchor-name .

work, desk, computer, night, hacker, anonymous, office, computer desk, worker, person, technology, professional, sitting, internet, modern, hacker, hacker, hacker, hacker, hacker

/* Определяем якорь */
.target \{
  anchor-name: --my-anchor;
\}

/* Позиционируем подсказку относительно этого якоря */
.tooltip \{
  position: absolute;
  position-anchor: --my-anchor;
  bottom: anchor(top);
  left: anchor(center);
  translate: -50% 0;
\}

Это базовая подсказка, расположенная над целью, с центрированием по горизонтали. Никакого JavaScript, никаких измерений, только CSS. А когда подсказка выходит за пределы области просмотра, @position-fallback позволяет определить альтернативные размещения без единой строки скрипта.

CSS Anchor Positioning — это не только подсказки. Выпадающие меню, выбор даты, контекстные меню и даже сложные вложенные UI-панели могут быть привязаны декларативно, что упрощает поддержку и отладку кода.

Ключевые CSS-свойства для привязки

  • anchor-name: присваивает элементу идентификатор якоря
  • position-anchor: указывает, какой якорь использует позиционируемый элемент
  • inset-area: сокращение для размещения позиционируемого элемента относительно якоря (например, "top center", "bottom right")
  • anchor() функция: разрешается в конкретный край якоря (верх, низ, лево, право, центр и т.д.)
  • @try блок: определяет запасные позиции, когда размещение по умолчанию вызывает переполнение

Замена Popper.js на CSS Anchor Positioning

Popper.js был золотым стандартом позиционирования в таких библиотеках, как Bootstrap, Material UI и тысячах пользовательских реализаций. Давайте сравним типичную настройку Popper.js с нативным CSS-эквивалентом.

Типичная инициализация Popper.js выглядит так:

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'] \} \}
  ]
\});

С CSS Anchor Positioning то же поведение достигается только с помощью CSS и 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;
\}

При миграции вы можете сохранить те же ARIA-роли и обработку событий (mouseenter/focus) для показа/скрытия подсказки. Логика позиционирования просто полностью переходит в CSS.

Замена Floating UI (преемника Popper)

Floating UI модернизировал подход с помощью архитектуры на основе middleware и лучшего tree-shaking. Однако он всё ещё поставляет JavaScript. Вот как мигрирует подсказка Floating UI:

coding, programming, working, macbook, laptop, technology, office, desk, business, coding, coding, coding, coding, coding, programming, programming, programming

// Floating UI с 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 \}\}
\}

Замените всё это статическим CSS. В современных фреймворках, таких как Next.js или Remix, вы можете поставлять нулевой JS-код для позиционирования. Влияние на Core Web Vitals немедленное.

Bar chart showing page load time decreasing from 2.3 seconds with Popper.js to 1.2 seconds using native CSS Anchor Positioning.

Диаграмма выше показывает резкое снижение времени блокировки основного потока при переходе от позиционирования на основе вычислений JavaScript к нативному CSS Anchor. Для сайтов электронной коммерции с десятками подсказок и выпадающих списков совокупный выигрыш значителен.

Преимущества в производительности и размере бандла

Каждый килобайт JavaScript имеет значение. Popper.js вместе с его зависимостями может добавить 15–20 кБ (сжатых gzip) в ваш бандл. Floating UI легче, но всё равно 8–12 кБ. Для среднего мобильного сайта это измеримое улучшение времени до интерактивности.

Но настоящий выигрыш в производительности — во время выполнения. CSS Anchor Positioning обрабатывается движком макета браузера; ему не нужно пересчитывать позиции при каждой прокрутке или изменении размера через JavaScript. Он может использовать GPU-ускоренные трансформации и полностью избежать перекомпоновки макета.

Мы протестировали панель с 50 привязанными подсказками. С Popper.js прокрутка вызывала множественные принудительные перерисовки и заметные подёргивания. Версия с CSS Anchor рендерилась плавно даже на среднебюджетном мобильном устройстве.

Поддержка браузеров и запасные варианты

С января 2026 года CSS Anchor Positioning входит в набор Baseline , что означает его нативную поддержку во всех основных браузерах: Chrome, Firefox, Safari и Edge. Для старых браузеров плавный запасной вариант прост: позиционируемый элемент будет просто отображаться в своём обычном потоке (часто не идеально, но функционально), или вы можете использовать крошечный полифилл, если вам нужно поддерживать старые версии.

coding, programming, css, html, php, web, site, programmer, gray web, gray code, gray coding, gray programming, css, css, php, php, php, programmer, programmer, programmer, programmer, programmer

Вы можете использовать @supports для условного применения новых свойств:

@supports (anchor-name: --test) \{
  .tooltip \{
    position-anchor: --my-anchor;
    inset-area: top;
  \}
\}

/* Запасной вариант для браузеров, не поддерживающих позиционирование якорей */
@supports not (anchor-name: --test) \{
  .tooltip \{
    top: 0;
    left: 50%;
    /* ... simple static position */
  \}
\}

Хотя это Baseline, всегда тестируйте на старых устройствах. По состоянию на начало 2026 года глобальный порог поддержки составляет примерно 95% пользователей. Для корпоративных приложений может потребоваться переходный период, когда вы будете определять поддержку функции и обслуживать старую JS-логику только при необходимости.

Пошаговое руководство по миграции

Готовы отказаться от библиотеки позиционирования? Следуйте этому практическому плану:

  1. Проверьте текущее использование: Составьте каталог всех подсказок, всплывающих окон, выпадающих списков и меню, использующих Popper.js или Floating UI.
  2. Задайте имена якорей: Добавьте anchor-name к ссылочным элементам. Выбирайте описательные имена, например --profile-menu-anchor.
  3. Перепишите CSS позиционирования: Замените JS-логику размещения на inset-area и anchor(). Используйте блоки @try для поведения переворота/запасного варианта.
  4. Удалите JS-слушатели и промежуточное ПО: Удалите слушатели изменения размера/прокрутки, функции-модификаторы и импорт библиотеки. Переключение показа/скрытия остается (через CSS-классы или несколько строк чистого JS).
  5. Тестируйте на разных окнах просмотра: Проверьте поведение при переполнении и интерактивные состояния.
  6. Постепенно внедряйте: Используйте функциональный флаг для включения CSS-якорей в современных браузерах, сохраняя JS-запасной вариант для старых, пока не будете уверены.

Pie chart indicating 70% of developers now prefer CSS Anchor Positioning, 20% still use Floating UI for legacy, and 10% use custom JavaScript.

Внедрение в реальном мире и будущее

Крупные UI-библиотеки уже интегрируют CSS Anchor Positioning. Bootstrap 6 (по слухам, в конце 2026 года) предложит чистый CSS-компонент подсказок. MUI и Ant Design экспериментируют с позиционированием без выполнения кода. Даже инструменты дизайна, такие как Figma, используют его для UI плагинов.

"CSS Anchor Positioning — это недостающий элемент, который действительно делает CSS полноценным языком разметки для всех UI-паттернов."

Преимущества в производительности неоспоримы. Разработчики экономят часы, не настраивая смещения и не отлаживая логику переворота. Повышение производительности происходит автоматически. А долгосрочное обслуживание значительно упрощается.

Заключение

CSS Anchor Positioning больше не экспериментальная функция, она готова к производству. Она позволяет фронтенд-разработчикам создавать сложные, адаптивные интерфейсы с меньшим количеством кода и лучшей производительностью. Начинаете ли вы новый проект или поддерживаете устаревшую кодовую базу, сейчас самое время внедрить её.

Примите перемены. Откажитесь от долга по JavaScript-позиционированию. Ваши пользователи (и анализатор сборки) скажут вам спасибо.

Начните создавать с помощью DivMagic сегодня

Присоединяйтесь к более чем 10 000 разработчиков, дизайнеров и владельцев бизнеса, чтобы копировать код с любого веб-сайта и использовать его в своих проектах.

Get DivMagic for 42% off

Limited time deal for 22:45