Floating UI — это библиотека для управления позиционированием всплывающих элементов, таких как тултипы, меню, модальные окна и поповеры. Ключевая задача автоматического позиционирования заключается в том, чтобы элемент всегда оставался видимым, корректно располагался относительно якоря и избегал выхода за границы viewport или контейнера.
Для этого Floating UI использует концепцию позиционных
стратегий и middleware. Основная стратегия —
absolute или fixed, а middleware позволяет
динамически изменять расположение и учитывать ограничители
пространства.
flip проверяет
доступное пространство вокруг якоря и автоматически выбирает
альтернативное направление, если стандартное приводит к обрезанию
элемента. Пример использования:import { computePosition, flip, offset } from '@floating-ui/dom';
computePosition(referenceElement, floatingElement, {
placement: 'bottom',
middleware: [
offset(8),
flip()
],
}).then(({ x, y, placement }) => {
Object.assign(floatingElement.style, {
left: `${x}px`,
top: `${y}px`
});
});
Ключевые моменты:
placement задаёт первоначальное направление (top,
bottom, left, right).flip проверяет альтернативные направления в порядке
приоритета, чтобы элемент не выходил за границы.offset для отступа от якоря.shift корректирует
позицию, если элемент частично выходит за границы viewport. Отличается
от flip тем, что не меняет направление, а
смещает элемент внутри выбранного placement.import { shift } from '@floating-ui/dom';
computePosition(referenceElement, floatingElement, {
placement: 'top',
middleware: [
shift({ padding: 5 })
],
});
Особенности:
padding задаёт минимальное расстояние от границ
viewport.autoPlacement
объединяет логику flip и shift, анализируя все
доступные направления и автоматически выбирая лучшее с учётом размеров
элемента и ограничений.preferredPlacements).boundary для ограничения области
видимости.Floating UI позволяет детально управлять поведением позиционирования через параметры middleware:
viewport.Пример:
computePosition(referenceElement, floatingElement, {
placement: 'right',
middleware: [
offset(10),
flip({ fallbackPlacements: ['bottom', 'top'] }),
shift({ padding: 5 })
],
});
Здесь элемент сначала пытается расположиться справа, если не хватает места — пробует снизу или сверху, при этом сдвигается внутрь viewport на 5px при необходимости.
Floating UI поддерживает middleware для изменения размеров элементов, чтобы они помещались в доступное пространство:
Пример динамического подбора ширины:
import { size } from '@floating-ui/dom';
computePosition(referenceElement, floatingElement, {
placement: 'bottom',
middleware: [
flip(),
shift(),
size({
apply({ availableWidth }) {
floatingElement.style.width = `${availableWidth}px`;
}
})
],
});
Floating UI обеспечивает гибкий, точный и динамический контроль над
позиционированием, что делает её идеальной для создания современных
интерфейсов с всплывающими элементами. Использование комбинаций
flip, shift и autoPlacement
позволяет автоматически подбирать оптимальное положение без ручного
расчёта координат и сложных условных конструкций.