Floating UI — это современная библиотека для позиционирования
плавающих элементов в браузере, которая позволяет управлять координатами
элементов с высокой точностью. Основными координатами, которые
используются в библиотеке, являются x и
y, определяющие положение плавающего
элемента относительно его reference-элемента или viewport.
x и y представляют собой
абсолютные значения позиции плавающего элемента на странице:
x — горизонтальное смещение от левого
края viewport или контейнера.y — вертикальное смещение от верхнего
края viewport или контейнера.Эти значения рассчитываются с учётом нескольких факторов:
floating element).shift или
flip).В Floating UI координаты вычисляются функцией
computePosition:
import { computePosition, offset, flip, shift } from '@floating-ui/dom';
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
computePosition(reference, floating, {
placement: 'bottom',
middleware: [offset(10), flip(), shift({ padding: 5 })]
}).then(({ x, y, placement }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`
});
});
Ключевые моменты:
x и y возвращаются как числа в
пикселях.placement: top, bottom, left, right.offset Добавляет смещение от
reference-элемента:
offset(10) // смещает floating на 10px от reference
x и y увеличиваются или уменьшаются в
зависимости от направления (top, bottom, left, right).flip Автоматически меняет сторону
плавающего элемента, если он выходит за границы viewport:
x и y пересчитываются с учётом
нового placement.shift Смещает элемент внутрь
viewport:
shift({ padding: 8 })
x и y корректируются на
минимальное значение, чтобы элемент оставался видимым.Floating UI позволяет вручную изменять координаты перед применением
стилей. Для этого можно использовать middleware transform
или кастомные функции:
computePosition(reference, floating).then(({ x, y }) => {
const adjustedX = x + 15; // смещение вправо
const adjustedY = y - 5; // смещение вверх
Object.assign(floating.style, {
left: `${adjustedX}px`,
top: `${adjustedY}px`
});
});
Для улучшения производительности часто используют CSS
transform: translate(), чтобы избежать перерисовки
layout при изменении координат:
Object.assign(floating.style, {
transform: `translate(${x}px, ${y}px)`
});
x и y остаются теми же значениями, которые
возвращает computePosition.x и y всегда вычисляются
относительно viewport по умолчанию.strategy: 'absolute' или
strategy: 'fixed':computePosition(reference, floating, { strategy: 'fixed' }).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`,
position: 'fixed'
});
});
fixed координаты игнорируют прокрутку контейнеров,
оставаясь привязанными к окну.absolute координаты привязываются к ближайшему
position: relative контейнеру.Floating UI предоставляет autoUpdate для отслеживания
изменений размеров или прокрутки:
import { autoUpdate } from '@floating-ui/dom';
const cleanup = autoUpdate(reference, floating, () => {
computePosition(reference, floating).then(({ x, y }) => {
Object.assign(floating.style, { left: `${x}px`, top: `${y}px` });
});
});
x и y автоматически
пересчитываются при resize, scroll или DOM изменениях.cleanup() можно вызвать, чтобы остановить
обновления.x и ycomputePosition для получения точных
координат.offset, flip,
shift) корректируют x и y для
адаптивного позиционирования.transform: translate(x, y).absolute или fixed) в
зависимости от контекста.autoUpdate для
автоматического пересчёта координат.