В Floating UI смещение (offset) используется для управления положением плавающего элемента относительно его целевого элемента (reference element). Смещение определяется в пикселях и может быть положительным или отрицательным. Положительное значение смещения смещает элемент в сторону оси смещения, отрицательное — в противоположную сторону.
Смещение в Floating UI реализуется через модуль
offset, который подключается как middleware к
функции computePosition. Этот модуль позволяет
задавать:
mainAxis) —
смещение вдоль основной оси позиции (например, вниз при
placement: "bottom").crossAxis)
— смещение вдоль перпендикулярной оси (например, вправо при
placement: "bottom").Пример базового использования:
import { computePosition, offset } from '@floating-ui/dom';
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
computePosition(reference, floating, {
middleware: [
offset({ mainAxis: 10, crossAxis: 5 })
],
}).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`,
});
});
В этом примере плавающий элемент смещается на 10 пикселей по основной оси и на 5 пикселей по перпендикулярной оси относительно кнопки.
Middleware offset принимает не только числовые значения,
но и функцию, возвращающую объект со свойствами
mainAxis и crossAxis. Это позволяет изменять
смещение динамически в зависимости от состояния элемента, размера экрана
или других параметров.
Пример:
offset(({ placement, reference, floating }) => {
if (placement.startsWith('top')) {
return { mainAxis: -10, crossAxis: 0 };
}
return { mainAxis: 10, crossAxis: 0 };
})
Здесь смещение автоматически меняется в зависимости от расположения
плавающего элемента (top или bottom).
Смещение часто используется вместе с
flip и
shift:
flip позволяет переворачивать положение, если элемент
не помещается на экране. Смещение применяется после
переворота, корректируя итоговую позицию.shift позволяет подвинуть элемент внутрь видимой
области, если он выходит за границы окна. Смещение также учитывается
вместе с этим сдвигом.Пример комплексного middleware:
import { computePosition, offset, flip, shift } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [
offset({ mainAxis: 12 }),
flip(),
shift({ padding: 5 })
],
});
В этом случае элемент сначала смещается на 12 пикселей, затем при необходимости переворачивается и сдвигается внутрь окна.
Для создания адаптивных tooltip и dropdown смещение часто зависит от размеров элементов:
offset(({ reference, floating }) => {
const refRect = reference.getBoundingClientRect();
const floatRect = floating.getBoundingClientRect();
const dynamicOffset = Math.max(10, refRect.height / 2 - floatRect.height / 2);
return { mainAxis: dynamicOffset, crossAxis: 0 };
})
Такое смещение гарантирует, что плавающий элемент всегда будет визуально выровнен по центру целевого элемента независимо от его высоты.
top, bottom, left,
right), отрицательные — в обратную сторону.offset должен быть
размещён до flip и shift, чтобы корректно
применялось к исходной позиции элемента.offset.mainAxis) отвечает за движение вдоль
направления позиции, второстепенная (crossAxis) — за
перпендикулярное смещение.flip и shift, но
порядок middleware критичен.Эти возможности делают Floating UI гибким инструментом для точного позиционирования всплывающих элементов в любых интерфейсах.