Референсный элемент в Floating UI — это точка
привязки, относительно которой позиционируется плавающее окно
(floating element). Его можно рассматривать как якорь: все расчёты
положения всплывающих элементов (tooltip, dropdown, popover и др.)
строятся относительно него. Референсный элемент может быть любым
DOM-узлом, включая <div>, <button>
или даже виртуальные элементы, которые не отображаются на странице, но
имеют координаты.
Ключевой особенностью Floating UI является отделение вычислений позиции от рендеринга, что позволяет гибко управлять поведением элементов без прямой привязки к CSS.
Floating UI использует функцию computePosition, которая
принимает референсный элемент и плавающий
элемент, а возвращает объект с координатами:
import { computePosition } from '@floating-ui/dom';
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
computePosition(reference, floating).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`
});
});
Floating UI поддерживает виртуальные референсы, которые полезны, когда позицию нужно вычислить на основе мыши, курсора или динамических координат:
const virtualReference = {
getBoundingClientRect: () => ({
x: 100,
y: 150,
width: 0,
height: 0,
top: 150,
right: 100,
bottom: 150,
left: 100,
}),
contextElement: document.body
};
computePosition(virtualReference, floating).then(({ x, y }) => {
floating.style.left = `${x}px`;
floating.style.top = `${y}px`;
});
Такой подход особенно удобен для всплывающих подсказок при наведении мыши или кастомных элементов интерфейса без реального DOM-узла.
Референсный элемент работает в связке с middleware (модификаторами), которые корректируют позицию плавающего окна. Основные middleware:
import { offset } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [offset(10)]
});
Middleware используют информацию о bounding rect референсного элемента, что делает расчёты точными и гибкими.
Референсный элемент может быть динамическим, поэтому Floating UI предлагает функции обновления позиции в реальном времени. Два подхода:
function update() {
computePosition(reference, floating).then(({ x, y }) => {
Object.assign(floating.style, { left: `${x}px`, top: `${y}px` });
});
requestAnimationFrame(update);
}
update();
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` });
});
});
// для остановки наблюдения
cleanup();
autoUpdate автоматически отслеживает изменения положения
или размера референсного элемента и обновляет координаты плавающего
элемента.
display: none), getBoundingClientRect вернёт
нулевые значения. Для скрытых элементов нужно использовать виртуальные
референсы.computePosition при скролле или ресайзе могут быть
затратными; рекомендуется использовать autoUpdate с
оптимизацией или throttling.Референсный элемент — ядро позиционирования в Floating UI. Правильное использование DOM-узлов или виртуальных объектов обеспечивает точные, адаптивные и гибкие всплывающие интерфейсы.