Floating UI — это современная библиотека для управления позиционированием всплывающих элементов, таких как тултипы, поповеры, дропдауны и модальные окна. В отличие от библиотеки flip, Floating UI ориентирована на модульность, гибкость и поддержку динамических условий размещения элементов в интерфейсе.
В flip позиционирование строится вокруг фиксированных алгоритмов с ограниченными возможностями настройки. Например, flip чаще всего использует готовые «флипы» (перевороты позиции) и смещения, которые заранее определяются.
В Floating UI:
Middleware — это цепочка функций, которые управляют положением всплывающего элемента. Каждый middleware получает текущие координаты и возвращает модифицированные значения. Основные middleware в Floating UI:
Преимущество Floating UI в том, что middleware можно комбинировать произвольным образом, создавая кастомные правила поведения.
flip имеет ограниченный набор конфигураций для смещения и проверки границ. Floating UI позволяет задавать:
import { computePosition, offset, flip, shift } from '@floating-ui/dom';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
computePosition(button, tooltip, {
middleware: [
offset(10),
flip({ fallbackPlacements: ['top', 'right'] }),
shift({ padding: 5 })
]
}).then(({ x, y }) => {
Object.assign(tooltip.style, {
left: `${x}px`,
top: `${y}px`
});
});
Пример показывает, как комбинируются middleware для достижения гибкого поведения, чего невозможно достичь с использованием только flip.
Floating UI поддерживает асинхронное вычисление позиции, что критично для современных SPA и динамического контента. В отличие от flip:
import { autoUpdate } from '@floating-ui/dom';
autoUpdate(button, tooltip, () => {
computePosition(button, tooltip, { middleware: [offset(5), flip()] })
.then(({ x, y }) => {
Object.assign(tooltip.style, { left: `${x}px`, top: `${y}px` });
});
});
autoUpdate автоматически пересчитывает позицию при
скролле, изменении размеров или контента.
В flip fallback ограничен фиксированными «запасными» позициями. Floating UI позволяет:
Floating UI не привязывается к body или fixed-элементам. Можно позиционировать всплывающие элементы внутри любых контейнеров с относительным позиционированием. Это делает библиотеку гибкой для сложных макетов с nested scroll или overflow-hidden контейнерами, что в flip реализуется ограниченно или требует дополнительных трюков.
| Характеристика | flip | Floating UI |
|---|---|---|
| Подход к позиционированию | фиксированный, статичный | динамический, асинхронный |
| Middleware | нет | есть, модульная цепочка |
| Комбинирование правил | ограничено | гибкое, любое сочетание |
| Реактивность | минимальная | встроенная, поддержка autoUpdate |
| Контейнерная гибкость | ограничена | поддержка любых контейнеров |
| Настройка fallback-позиций | фиксированная | массив с приоритетами, кастомные стратегии |
Floating UI предлагает более гибкий и современный инструмент для позиционирования всплывающих элементов, который легко интегрируется в сложные интерфейсы и реактивные приложения.