Floating UI — это библиотека для управления позиционированием плавающих элементов, таких как тултипы, поповеры, dropdown-меню и другие интерфейсные компоненты. Основная задача библиотеки — обеспечить точное, динамическое размещение элементов относительно их reference-элемента с учётом ограничений пространства, размеров окна и перекрытий других элементов.
Reference элемент — это элемент, относительно которого будет позиционироваться floating элемент. Floating элемент — это сам плавающий блок, который может отображать дополнительный контент, например, подсказку или меню.
Floating UI строит позиционирование, используя координаты reference элемента, размеры floating элемента и доступное пространство, чтобы корректно разместить плавающий элемент.
position: relative,
absolute или fixed. Используется для
классического позиционирования внутри DOM.viewport) и не смещается при прокрутке.
Используется для sticky тултипов, уведомлений и модальных окон.Выбор стратегии зависит от контекста:
absolute.fixed.Floating UI автоматически адаптирует координаты в зависимости от выбранной стратегии.
Floating UI предлагает несколько алгоритмов для определения оптимальной позиции:
Placement — направление расположения относительно reference элемента. Возможные значения:
top, bottom, left,
right-start и -end
(top-start, bottom-end), которые задают
выравнивание по горизонтали или вертикали.Middleware — цепочка функций для дополнительной настройки позиции:
offset — задаёт смещение от reference элемента.flip — автоматически меняет позицию, если выбранная
сторона выходит за пределы видимой области.shift — корректирует положение floating элемента, чтобы
избежать выхода за границы контейнера.size — динамически изменяет размеры floating элемента в
зависимости от доступного пространства.Пример конфигурации:
import { computePosition, offset, flip, shift } from '@floating-ui/dom';
computePosition(referenceEl, floatingEl, {
placement: 'bottom-start',
middleware: [offset(8), flip(), shift({ padding: 5 })]
}).then(({ x, y }) => {
Object.assign(floatingEl.style, {
left: `${x}px`,
top: `${y}px`
});
});
shift и
flip.size можно автоматически менять ширину или высоту floating
элемента для предотвращения обрезки контента.bottom), при невозможности
отображения применяется запасной вариант (top).Floating UI позволяет контролировать взаимодействие с другими элементами интерфейса:
flip предотвращает перекрытие границ viewport.preventOverflow защищает от выхода за контейнеры с
ограниченной шириной/высотой.arrow middleware вычисляет точное положение стрелки для
визуального соединения с reference элементом.Пример использования стрелки:
import { arrow } from '@floating-ui/dom';
computePosition(referenceEl, floatingEl, {
placement: 'top',
middleware: [offset(10), flip(), arrow({ element: arrowEl })]
});
top или
bottom), для меню — горизонтальное (left или
right).flip и shift для предотвращения выпадения
элементов за границы viewport.Floating UI предоставляет полный контроль над позиционированием, позволяя реализовывать сложные интерфейсные решения с минимальным количеством кода и высокой надёжностью. Оптимальная стратегия позиционирования достигается сочетанием placement, middleware и выбранной стратегии fixed/absolute, что позволяет адаптировать floating элементы под любые сценарии использования.