Библиотека Popper.js предназначена для управления позиционированием всплывающих элементов относительно их «опорных» элементов (reference elements). Одной из ключевых возможностей является автоматический выбор позиции, который позволяет динамически определять оптимальное расположение поппера с учётом пространства на экране и доступного места.
Автоматический выбор позиции реализован через стратегию
flip и алгоритм
preventOverflow. Эти модификаторы
анализируют ограничения контейнера, размеры поппера и размеры viewport,
чтобы корректно разместить элемент без обрезки или выхода за пределы
видимой области.
flipМодификатор flip позволяет попперу менять своё положение
в зависимости от доступного пространства. Основная идея: если поппер не
помещается в выбранной позиции, библиотека ищет альтернативную, согласно
массиву fallbackPlacements.
Пример настройки:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'top',
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['right', 'bottom', 'left'],
padding: 8, // минимальное расстояние до границ viewport
},
},
],
});
Ключевые моменты:
placement — начальная позиция, которую Popper пытается
использовать.fallbackPlacements — массив альтернативных позиций при
нехватке места.padding — задаёт минимальное расстояние до границ
экрана, предотвращая наложение поппера на края.Модификатор flip работает на основе виртуального
измерения доступного пространства. Если выбранная позиция не
помещается, Popper проверяет каждую fallback-позицию по очереди, пока не
найдёт подходящую. Если подходящей нет, возвращается позиция с
наименьшим перекрытием или обрезкой.
preventOverflowМодификатор preventOverflow отвечает за
корректировку позиции поппера внутри контейнера или
viewport. Даже если позиция была выбрана автоматически, элемент
может выходить за границы. Этот модификатор гарантирует, что поппер
останется видимым.
Настройка модификатора:
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport', // границы, относительно которых осуществляется проверка
padding: 8, // отступ от границ
tether: true, // позволяет привязать поппер к reference, смещая при необходимости
},
},
]
Основные параметры:
boundary — контейнер, внутри которого ограничивается
позиционирование (viewport, scrollParent,
window, или DOM-элемент).padding — минимальное расстояние от границ
контейнера.tether — включение «привязки» поппера к reference. Без
этого поппер может частично выйти за границы.placement.flip — выбирается
альтернативная позиция из fallbackPlacements.preventOverflow корректирует
смещение, чтобы поппер полностью помещался в границах контейнера.offset, для точной настройки позиции.offsetДля тонкой настройки позиции рекомендуется использовать модификатор
offset вместе с автоматическим выбором позиции. Он
позволяет задавать смещение в пикселях или процентах.
Пример:
modifiers: [
{
name: 'offset',
options: {
offset: [0, 10], // 0 по основной оси, 10px по перекрестной
},
},
{
name: 'flip',
options: { fallbackPlacements: ['right', 'bottom'] },
},
{
name: 'preventOverflow',
options: { padding: 5 },
},
]
Комбинация этих модификаторов позволяет динамически изменять позицию поппера, сохраняя визуальную целостность и предотвращая перекрытия.
flip с широким списком fallback-позиций.preventOverflow необходим для popper-элементов, которые
могут выходить за границы viewport или контейнера с прокруткой.padding стоит подбирать с учётом дизайна
интерфейса, чтобы поппер не прилипал к краям.update экземпляра Popper, чтобы автоматическое
позиционирование корректно пересчитало доступное пространство.Автоматический выбор позиции Popper.js — это результат взаимодействия нескольких модификаторов:
flip — определяет оптимальную сторону для
отображения.preventOverflow — удерживает элемент внутри видимой
области.offset — обеспечивает визуально комфортное расстояние
от reference.Такое взаимодействие гарантирует динамическую адаптацию поппера к различным условиям интерфейса, обеспечивая надёжное и корректное позиционирование без ручных вычислений.