Автоматическое переворачивание — один из ключевых механизмов позиционирования в Popper.js, обеспечивающий корректное отображение всплывающих элементов (tooltip, dropdown, popover) в условиях ограниченного пространства. Основная задача — предотвратить выход элемента за границы видимой области (viewport) или заданного контейнера.
Изначально всплывающий элемент (popper) размещается относительно
опорного элемента (reference) согласно заданному placement (например,
top, bottom, left,
right). Однако при нехватке пространства Popper.js
анализирует доступные области и при необходимости изменяет сторону
отображения.
Пример:
createPopper(referenceElement, popperElement, {
placement: 'top'
});
Если сверху недостаточно места, библиотека автоматически попробует
разместить элемент снизу (bottom), затем по бокам.
Автоматическое переворачивание реализовано через модификатор
flip. Он включён по умолчанию и управляет логикой выбора
альтернативных позиций.
Пример настройки:
createPopper(referenceElement, popperElement, {
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['bottom', 'right', 'left']
}
}
]
});
Свойство fallbackPlacements определяет порядок
альтернативных позиций, которые Popper.js будет проверять при нехватке
места.
Принцип:
placement)fallbackPlacementsЕсли список не задан, Popper.js использует стандартную стратегию:
top →
bottom)Процесс включает несколько этапов:
Вычисление границ
viewport, clippingParents, или
пользовательского контейнера)Проверка переполнения (overflow)
detectOverflowСравнение доступных вариантов
Применение лучшего варианта
Контроль области, внутри которой работает flip:
{
name: 'flip',
options: {
boundary: 'clippingParents',
rootBoundary: 'viewport'
}
}
boundary — контейнер, относительно которого проверяется
переполнениеrootBoundary — глобальная граница (обычно
viewport)Возможные значения:
'viewport''document'Позволяет задать отступ от границы, чтобы popper не прилегал вплотную:
{
name: 'flip',
options: {
padding: 8
}
}
Это значение учитывается при расчёте доступного пространства.
По умолчанию переполнение рассчитывается относительно popper. Опция
altBoundary переключает расчёт на reference-элемент:
{
name: 'flip',
options: {
altBoundary: true
}
}
Полезно при сложных вложенных контейнерах и прокрутке.
Если используется вариативное размещение (start,
end), можно разрешить или запретить их изменение:
{
name: 'flip',
options: {
flipVariations: true
}
}
Пример:
top-start может превратиться в top-end,
если это уменьшает переполнениеPopper.js оптимизирует производительность, не перебирая бесконечно все варианты. Алгоритм прекращает поиск, когда найден допустимый вариант без переполнения или с минимальным отклонением.
flip тесно связан с preventOverflow. Их
различие:
flip — меняет сторону размещенияpreventOverflow — сдвигает popper внутри текущей
стороныПример совместного использования:
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['bottom', 'right']
}
},
{
name: 'preventOverflow',
options: {
padding: 8
}
}
]
После переворачивания сохраняется логика смещения
(offset), что может влиять на итоговую позицию.
topbottomДля анализа поведения:
instance.state.placement
fallbackPlacements для
предсказуемостиpadding, чтобы избежать «прилипания» к
краямpreventOverflow, а не заменятьboundary1. Игнорирование контейнеров прокрутки Popper может «обрезаться», если boundary задан некорректно.
2. Слишком длинный список fallbackPlacements Увеличивает вычисления без реальной пользы.
3. Отключение flip без альтернативы Приводит к выходу элемента за экран.
4. Неправильная работа с вариациями
(start/end) Может вызывать неожиданные
смещения.
Пример комплексной конфигурации:
createPopper(reference, popper, {
placement: 'top-start',
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['bottom-start', 'right-start'],
padding: 10,
boundary: document.body,
rootBoundary: 'viewport',
flipVariations: true
}
}
]
});
Flip использует данные из state.rects и
state.modifiersData. Ключевые этапы:
Это делает поведение адаптивным и независимым от конкретной верстки.
Если ни один вариант полностью не помещается:
preventOverflow корректирует позицию внутри
допустимой областиТаким образом достигается максимально возможная видимость popper-элемента даже в ограниченных условиях.