Структура документации

Floating UI — это библиотека для управления позиционированием плавающих элементов на веб-странице. Она предоставляет инструменты для создания тултипов, дропдаунов, поповер-окошек и других элементов интерфейса, которые должны быть динамически привязаны к определённой цели (anchor). Библиотека фокусируется на точности позиции, автоматическом смещении и адаптивности к изменениям viewport.

Floating и reference элементы

В основе работы лежат два ключевых понятия:

  • Reference элемент – это элемент DOM, к которому привязан плавающий элемент. Он определяет исходную точку отсчёта.
  • Floating элемент – это элемент, который будет позиционироваться относительно reference.

Floating UI вычисляет координаты x и y для плавающего элемента исходя из позиции reference и правил смещения.

Контроль позиции

Позиционирование реализуется через middleware — функции, которые обрабатывают вычисления и корректируют координаты. Основные middleware:

  • offset — добавляет смещение по осям X и Y, чтобы плавающий элемент не перекрывал reference.
  • flip — изменяет сторону появления элемента, если на исходной стороне не хватает места в viewport.
  • shift — корректирует позицию плавающего элемента, чтобы он полностью помещался в видимую область.
  • autoPlacement — автоматически выбирает оптимальное направление появления, комбинируя flip и shift.

Пример использования middleware:

import { computePosition, offset, flip, shift } from '@floating-ui/dom';

const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');

computePosition(reference, floating, {
  middleware: [offset(10), flip(), shift({ padding: 5 })],
}).then(({ x, y }) => {
  Object.assign(floating.style, {
    left: `${x}px`,
    top: `${y}px`,
  });
});

Управление размерами и адаптивность

Floating UI позволяет динамически управлять размерами элементов:

  • size middleware — изменяет размеры floating-элемента в зависимости от доступного пространства.
  • Поддержка maxWidth и maxHeight через вычисляемые свойства.
  • Совместимость с реактивными фреймворками позволяет обновлять размеры и позицию при изменении содержимого.

События и реактивность

Библиотека предоставляет API для отслеживания изменений:

  • autoUpdate — следит за изменением размеров reference или floating элементов и автоматически пересчитывает позицию.
  • Можно подключать scroll и resize listeners, чтобы плавающие элементы оставались корректно позиционированными при прокрутке или изменении размера окна.

Пример использования autoUpdate:

import { autoUpdate } from '@floating-ui/dom';

const cleanup = autoUpdate(reference, floating, () => {
  computePosition(reference, floating, {
    middleware: [offset(10), flip(), shift()],
  }).then(({ x, y }) => {
    Object.assign(floating.style, { left: `${x}px`, top: `${y}px` });
  });
});

// Для отключения слежения
cleanup();

Позиционирование в сложных структурах DOM

Floating UI умеет корректно работать в следующих сценариях:

  • Плавающие элементы внутри scrollable containers — middleware shift корректирует положение с учётом прокрутки.
  • Portals и модальные окна — можно рендерить floating элементы вне обычного DOM-дерева reference, сохраняя точное позиционирование.
  • Комбинированные middleware — позволяет создавать сложные сценарии, например тултип с ограничением по ширине и автофлипом при нехватке места.

Интеграция с фреймворками

  • В React существует отдельный пакет @floating-ui/react, который предоставляет хуки useFloating, упрощающие привязку позиции к компоненту.
  • В Vue можно использовать кастомные директивы или composables для реактивного слежения.
  • В Svelte применяется реактивная подписка на координаты, обновляемые computePosition и autoUpdate.

Ключевые преимущества

  • Высокая точность вычислений позиции, даже при сложной структуре DOM.
  • Гибкость через middleware, позволяющая комбинировать смещение, флип и сдвиг под конкретные задачи.
  • Реактивное обновление позиции и размеров при изменениях viewport, содержимого или скролла.
  • Независимость от CSS-фреймворков, работа с чистым DOM и современными фреймворками.

Практические рекомендации

  • Всегда использовать middleware shift и flip для элементов, которые должны оставаться видимыми.
  • При динамически изменяемом содержимом подключать autoUpdate.
  • Для сложных интерфейсов с модальными окнами или порталами корректно задавать контейнер для floating элемента.
  • Контролировать z-index и pointer-events через CSS, чтобы floating элемент не блокировал взаимодействие с другими элементами.

Floating UI позволяет создавать надёжные, адаптивные интерфейсы с плавающими элементами, обеспечивая точное позиционирование, высокую гибкость и совместимость с современными фронтенд-фреймворками.