В Floating UI управление переполнением (overflow) является ключевым аспектом при построении всплывающих элементов, таких как тултипы, поповеры и контекстные меню. Overflow возникает, когда плавающий элемент выходит за границы видимой области окна или родительского контейнера. Библиотека предоставляет мощные инструменты для контроля поведения таких элементов.
overflow в
Floating UIFloating UI использует middleware shift
и middleware flip для контроля
переполнения. Эти middleware автоматически корректируют позицию
элемента, чтобы он оставался видимым.
flipMiddleware flip позволяет элементу менять сторону
расположения при недостатке места.
import { flip, offset, autoUpdate, computePosition } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [offset(10), flip()]
}).then(({ x, y, placement }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`
});
});
placement – определяет начальную
позицию (top, bottom, left,
right).flip автоматически выбирает
альтернативное направление при переполнении.fallbackPlacements –
массив альтернативных позиций.flip({
fallbackPlacements: ['right', 'left']
})
shiftMiddleware shift смещает элемент, чтобы он полностью
помещался в видимую область, не меняя основной стороны.
shift({
padding: 8, // отступ от границ окна
})
padding определяет минимальное
расстояние от границы контейнера или окна.autoPlacement
и управление переполнениемИногда удобно позволить библиотеке автоматически выбирать оптимальную
позицию с учётом переполнения. Для этого используется middleware
autoPlacement:
import { autoPlacement } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [offset(5), autoPlacement()]
});
autoPlacement комбинирует поведение flip и
shift.autoPlacement({
alignment: 'start', // 'start', 'end', 'center'
padding: 10,
allowedPlacements: ['top', 'bottom', 'right']
})
overflow: hiddenЕсли родительский элемент имеет CSS-свойство
overflow: hidden или scroll, плавающий элемент
может обрезаться. Floating UI предоставляет middleware
detectOverflow, который позволяет получать информацию о
реальном переполнении и корректировать позицию вручную:
import { detectOverflow } from '@floating-ui/dom';
const overflowData = await detectOverflow(floating, {
padding: 5
});
if (overflowData.top > 0) {
console.log('Элемент выходит за верхнюю границу');
}
{top, bottom, left, right}.Для сложных интерфейсов рекомендуется комбинировать
offset, flip, shift и
detectOverflow:
computePosition(reference, floating, {
middleware: [
offset(10),
flip({ fallbackPlacements: ['right', 'left'] }),
shift({ padding: 5 })
]
});
offset), затем проверка на переполнение и
возможный flip, и в конце финальное смещение (shift).padding – минимальное расстояние до
края окна или контейнера.boundary – можно указать конкретный
элемент для ограничения (document.body по умолчанию).rootBoundary – определяет,
относительно чего проверяется переполнение (viewport или
document).shift({
padding: 8,
boundary: document.getElementById('modal'),
rootBoundary: 'viewport'
});
strategy: 'fixed' для элементов вне потокаЭлементы с position: fixed игнорируют родительские
ограничения, что особенно полезно при переполнении внутри скроллируемых
контейнеров:
Object.assign(floating.style, {
position: 'fixed'
});
shift и flip
позволяет полностью контролировать положение даже при сложных
layout.offset + flip + shift.autoPlacement, если требуется полностью
динамическая позиция.overflow: hidden, чтобы избежать обрезки.detectOverflow полезен для отладки и
кастомного поведения при сложных ограничениях.Floating UI предоставляет полный контроль над переполнением через гибкую систему middleware, позволяя создавать интерфейсы, где всплывающие элементы остаются видимыми, корректно позиционируются и адаптируются к изменениям окна и контейнеров.