Popper.js предоставляет гибкую систему позиционирования элементов относительно другого элемента (reference element) с учетом границ окна браузера, скролла и других ограничений. Центральным понятием является popper, который отображается в позиции относительно reference. Контроль над выравниванием осуществляется через свойства placement и modifiers.
placementСвойство placement задает базовое направление появления
popper относительно reference. Доступны следующие значения:
Каждое направление может быть уточнено через суффиксы:
top-start выравнивает popper к левому краю reference.bottom-end выравнивает popper к правому краю
reference.Примеры использования:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'top-start',
});
offsetДаже при точном указании placement может потребоваться сместить popper относительно reference. Для этого применяется модификатор offset.
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'bottom',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 10], // [смещение по основной оси, смещение по перекрестной оси]
},
},
],
});
flipКогда popper не помещается в указанном направлении из-за границ окна или родительских элементов, модификатор flip автоматически изменяет направление:
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'right', 'left'], // варианты, если основной placement не помещается
},
},
]
Особенности работы flip:
preventOverflow для предотвращения
выхода popper за границы.mainAxis и
crossAxisPopper.js делит позицию на две оси:
top → вертикальная ось).Модификатор offset и встроенные механизмы позиционирования позволяют управлять смещением по обеим осям. Пример тонкой настройки:
modifiers: [
{
name: 'offset',
options: {
offset: ({ placement }) => {
if (placement.startsWith('top')) {
return [0, 20]; // смещение вниз при top
}
return [0, 10]; // стандартное смещение
},
},
},
]
preventOverflowЧтобы popper не выходил за пределы viewport или родительского контейнера, используется модификатор preventOverflow:
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport', // ограничения: viewport, window, элемент
padding: 8, // минимальное расстояние до границ
},
},
]
Ключевые моменты:
Поппер позволяет комбинировать все инструменты: placement, offset, flip, preventOverflow. Пример:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'right-start',
modifiers: [
{ name: 'offset', options: { offset: [0, 12] } },
{ name: 'flip', options: { fallbackPlacements: ['left-start', 'bottom-start'] } },
{ name: 'preventOverflow', options: { boundary: 'viewport', padding: 5 } },
],
});
В этом примере popper:
update() для пересчета
позиции.Этот подход обеспечивает полное управление положением элементов, позволяя создавать сложные интерфейсы с всплывающими подсказками, тултипами и контекстными меню, адаптируемыми под любые размеры окна и ограничения.