Floating UI предоставляет гибкие инструменты для позиционирования элементов на странице с учётом ограничений экрана, динамических изменений размера и поведения пользователя. Центральная идея — адаптивное позиционирование, при котором плавающий элемент автоматически подстраивается под доступное пространство вокруг целевого элемента (reference element).
Основной механизм работы — это стратегии позиционирования, которые определяют, как и куда смещается элемент относительно reference. Floating UI использует концепцию middleware — цепочки функций, которые поэтапно вычисляют финальное положение.
absolute и
fixedИспользование стратегии задаётся через опцию strategy
при вызове computePosition:
import { computePosition } from '@floating-ui/dom';
computePosition(referenceElement, floatingElement, {
strategy: 'fixed',
});
offsetПозволяет задать смещение плавающего элемента от reference:
import { offset } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [offset(10)] // смещаем на 10px
});
Особенности:
flipОбеспечивает автоматический поворот элемента при нехватке пространства:
import { flip } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [flip()]
});
Ключевые моменты:
top,
bottom, left, right).flip({ fallbackPlacements: ['right', 'left'] }).shiftСдвигает элемент внутрь видимой области, если часть выходит за границы:
import { shift } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [shift({ padding: 8 })] // отступ от границ viewport
});
Примечание: рекомендуется использовать вместе с
flip для предотвращения выхода за экран.
sizeПозволяет адаптировать размеры floating-элемента в зависимости от доступного пространства:
import { size } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [size({
apply({ rects, availableHeight, elements }) {
elements.floating.style.maxHeight = `${availableHeight}px`;
}
})]
});
availableHeight и availableWidth
вычисляются автоматически.Для реальных интерфейсов часто применяется комбинация нескольких middleware:
import { computePosition, offset, flip, shift, size } from '@floating-ui/dom';
computePosition(reference, floating, {
strategy: 'absolute',
placement: 'bottom',
middleware: [
offset(8),
flip({ fallbackPlacements: ['top', 'right'] }),
shift({ padding: 5 }),
size({
apply({ availableHeight, elements }) {
elements.floating.style.maxHeight = `${availableHeight}px`;
}
})
]
});
Преимущества такой схемы:
Floating UI поддерживает реакцию на изменения DOM и
скролл через autoUpdate:
import { autoUpdate } from '@floating-ui/dom';
const cleanup = autoUpdate(reference, floating, () => {
computePosition(reference, floating, {
middleware: [offset(10), flip(), shift()]
}).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`
});
});
});
Особенности:
shift и flip критично при
маленьких экранах.size позволяет ограничивать размеры и предотвращает
переполнение.fixed стратегию
с динамическим смещением.computePosition(reference, floating, {
strategy: 'fixed',
placement: 'bottom',
middleware: [offset(5), flip(), shift({ padding: 10 }), size({ padding: 10 })]
});
autoUpdate, поэтому тяжёлые операции в apply
следует минимизировать.requestAnimationFrame внутри
apply.flip + shift +
size обеспечивает максимальную адаптивность без ручного
пересчёта.Адаптивное позиционирование в Floating UI строится на комбинации стратегий, middleware и автоматического обновления позиции. Такой подход позволяет создавать динамичные интерфейсы, которые корректно реагируют на изменения экрана, скролл и размер целевых элементов, минимизируя визуальные баги и улучшая пользовательский опыт.