Параметр fallbackPlacements используется в Floating UI
для управления стратегией позиционирования всплывающих элементов
(попапов, тултипов, меню) при недостатке пространства в основной
позиции. Его основная цель — гарантировать, что элемент будет корректно
отображаться даже в условиях ограниченной видимой области.
Когда основной placement (позиция относительно
reference-элемента) недоступен, например, из-за выхода за границы
viewport или перекрытия другими элементами, Floating UI последовательно
проверяет альтернативные позиции из массива
fallbackPlacements. Это предотвращает ситуации, когда
всплывающий элемент оказывается обрезанным или полностью невидимым.
import { computePosition, offset, flip, shift } from '@floating-ui/dom';
computePosition(reference, floating, {
placement: 'top',
middleware: [
offset(10),
flip({
fallbackPlacements: ['right', 'bottom', 'left']
}),
shift()
]
});
placement — основное предпочтение
(top, bottom, left,
right и их вариации с -start или
-end).fallbackPlacements — массив
альтернативных позиций, которые проверяются в порядке следования при
невозможности использовать основную.Приоритетность Floating UI сначала пытается
разместить элемент в указанной placement. Если это
невозможно из-за ограничений viewport, библиотека последовательно
перебирает позиции из fallbackPlacements.
Совместимость с flip middleware
fallbackPlacements работает только в сочетании с
flip. Без flip альтернативные позиции не
учитываются.
Поведение по умолчанию Если
fallbackPlacements не указан, Floating UI использует
собственный алгоритм выбора позиций, обычно это зеркальные варианты
(top → bottom, left →
right).
Учет ограничений и смещения При каждом варианте
позиционирования учитываются дополнительные middleware:
offset, shift, arrow, что
позволяет не только выбирать место, но и корректно позиционировать
элемент относительно reference-элемента.
flip({
fallbackPlacements: ['bottom', 'right', 'left']
});
Здесь основное положение — top (по умолчанию задано в
placement). Если top не подходит, элемент
будет проверять bottom, затем right, и,
наконец, left.
computePosition(reference, floating, {
placement: 'left-start',
middleware: [
offset(12),
flip({
fallbackPlacements: ['top-start', 'bottom-start', 'right-start']
}),
shift({ padding: 5 })
]
});
offset(12) добавляет отступ от reference-элемента.flip с fallbackPlacements позволяет
попробовать три альтернативные позиции.shift({ padding: 5 }) гарантирует, что всплывающее окно
не выйдет за границы viewport, даже если альтернативная позиция почти
полностью перекрыта.top, bottom, left,
right) обеспечивает максимальную надежность на устройствах
с ограниченным пространством.shift и
offset позволяет создать адаптивное поведение:
элемент корректно смещается и не обрезается при изменении размеров окна
или скролле.fallbackPlacements работает только внутри middleware
flip. Использование вне его контекста не имеет
эффекта.fallbackPlacements не
подходит, элемент может частично или полностью выйти за пределы
viewport, если не подключен shift.computePosition вызывается один раз. Для
обновления позиции необходимо повторно вызывать
computePosition или использовать
autoUpdate.fallbackPlacementsflip.shift и
offset.Использование fallbackPlacements обеспечивает
предсказуемое и надежное поведение всплывающих элементов в любых
условиях пространства на странице.