Floating UI — это библиотека для позиционирования всплывающих элементов, таких как тултипы, поповеры, меню и другие элементы интерфейса, относительно целевых элементов на странице. Она предоставляет низкоуровневые утилиты для точного контроля позиционирования и управления коллизиями с краями экрана.
Для работы с Floating UI достаточно установить пакет через npm:
npm install @floating-ui/dom
После установки можно подключать его в проекте:
import { computePosition, offset, flip, shift } from '@floating-ui/dom';
Для отображения всплывающего блока рядом с целевым элементом
используется функция computePosition:
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
computePosition(reference, floating, {
placement: 'top',
middleware: [offset(8), flip(), shift({ padding: 5 })],
}).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`,
});
});
Ключевые моменты:
placement определяет предпочитаемое положение
всплывающего элемента (top, bottom,
left, right).middleware — массив функций, модифицирующих поведение
позиции. Можно комбинировать несколько модификаторов.В Floating UI встроенные стратегии предотвращения выхода всплывающих элементов за пределы окна или контейнера:
Пример с autoPlacement:
import { autoPlacement } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [autoPlacement({ alignment: 'start', padding: 10 })],
}).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`,
});
});
Floating UI позволяет отслеживать изменения размера окна или
положения цели с помощью функции autoUpdate:
import { autoUpdate } from '@floating-ui/dom';
autoUpdate(reference, floating, () => {
computePosition(reference, floating, {
placement: 'top',
middleware: [offset(10), flip(), shift({ padding: 5 })],
}).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`,
});
});
});
autoUpdate автоматически пересчитывает координаты при
изменении размеров окна, прокрутке или изменении позиции цели.В React можно использовать Floating UI с хуками:
import { useFloating, offset, flip, shift } from '@floating-ui/react';
function Tooltip({ children }) {
const { x, y, reference, floating } = useFloating({
placement: 'bottom',
middleware: [offset(8), flip(), shift({ padding: 5 })],
});
return (
<>
{children}
>
);
}
useFloating возвращает координаты и ссылки на
элементы.В Vue 3 интеграция реализуется через реактивные свойства:
import { ref, onMounted } from 'vue';
import { computePosition, offset, flip, shift, autoUpdate } from '@floating-ui/dom';
export default {
setup() {
const reference = ref(null);
const floating = ref(null);
onMounted(() => {
autoUpdate(reference.value, floating.value, () => {
computePosition(reference.value, floating.value, {
placement: 'right',
middleware: [offset(10), flip(), shift({ padding: 5 })],
}).then(({ x, y }) => {
Object.assign(floating.value.style, { left: `${x}px`, top: `${y}px` });
});
});
});
return { reference, floating };
},
};
absolute и
fixed позиционированием для разных сценариев.flip и shift для
предотвращения обрезки элементов.autoUpdate для интерактивных компонентов,
особенно при динамическом контенте.autoPlacement с
alignment и padding для лучшей подстройки под
разные размеры экрана.