Библиотека Floating UI предоставляет гибкий способ
управления позиционированием всплывающих элементов, таких как тултипы,
дропдауны и модальные окна. Центральным элементом управления является
функция computePosition, которая принимает объект с
обязательными параметрами и опциональными
настройками.
import { computePosition } from '@floating-ui/dom';
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
computePosition(reference, floating);
Объект options передается вторым аргументом функции
computePosition. Основные из них:
placement – задаёт предпочтительное размещение
элемента. Возможные значения: 'top', 'bottom',
'left', 'right', а также вариации с
-start и -end ('top-start',
'bottom-end').
strategy – определяет метод позиционирования:
'absolute' – стандартное абсолютное позиционирование
относительно ближайшего позиционированного предка.'fixed' – позиционирование относительно окна браузера,
игнорирует прокрутку.middleware – массив функций для модификации расчета позиции. Часто используемые middleware:
offset – задаёт смещение от reference элемента.flip – автоматически меняет сторону при недостатке
места.shift – корректирует положение для предотвращения
выхода за границы viewport.arrow – позиционирует стрелку относительно reference
элемента.Пример с использованием middleware:
import { offset, flip, shift } from '@floating-ui/dom';
computePosition(reference, floating, {
placement: 'top',
strategy: 'absolute',
middleware: [offset(10), flip(), shift({ padding: 5 })]
});
Каждое middleware имеет свои параметры:
padding добавляет отступ от
границ.computePositionФункция возвращает Promise, который разрешается объектом с ключевыми координатами и информацией о позиции:
computePosition(reference, floating, options).then(({ x, y, placement, strategy, middlewareData }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`,
position: strategy
});
});
x, y – абсолютные координаты floating элемента относительно документа или окна.
placement – финальная выбранная позиция, может
отличаться от запрошенной при использовании flip.
strategy – стратегия позиционирования
(absolute или fixed).
middlewareData – объект с результатами middleware, например:
{
arrow: { x: 10, y: 5 },
shift: { x: 0, y: 3 }
}import { arrow } from '@floating-ui/dom';
const arrowElement = document.querySelector('.tooltip-arrow');
computePosition(reference, floating, {
middleware: [arrow({ element: arrowElement })]
}).then(({ x, y, middlewareData }) => {
Object.assign(arrowElement.style, {
left: `${middlewareData.arrow.x}px`,
top: `${middlewareData.arrow.y}px`
});
});
import { shift } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [shift({ padding: 10 })]
}).then(({ x, y, middlewareData }) => {
console.log('Смещение для видимости:', middlewareData.shift);
});
Floating UI позволяет комбинировать несколько middleware для тонкой настройки позиции:
computePosition(reference, floating, {
placement: 'right-start',
middleware: [
offset(8),
flip({ fallbackPlacements: ['left-start', 'bottom-start'] }),
shift({ padding: 5 }),
arrow({ element: arrowElement, padding: 5 })
]
});
Такой подход гарантирует, что floating элемент не только находится в правильной позиции, но и автоматически подстраивается под пространство вокруг reference, корректно отображает стрелку и не выходит за границы viewport.
{
x: number, // координата X
y: number, // координата Y
placement: string, // финальная позиция
strategy: 'absolute' | 'fixed', // стратегия позиционирования
middlewareData: { // данные middleware
[middlewareName: string]: any
}
}
Эта структура позволяет динамически управлять стилями элементов, создавать адаптивные тултипы и выпадающие панели, полностью контролируя их поведение на странице.