Popper.js строит позиционирование всплывающих элементов на основе отдельной системы координат, которая учитывает как положение целевого элемента (reference), так и его контейнеры и ограничивающие элементы. Основная концепция заключается в том, что Popper.js оперирует контекстами отображения, вычисляя положение всплывающего элемента (popper) относительно reference с учетом всех трансформаций, прокрутки и границ родительских элементов.
Reference — это элемент, относительно которого позиционируется
popper. Popper.js вычисляет его bounding client rect,
включающий top, left, right,
bottom, width и height. Эти
значения формируют точку отсчета для popper.
Popper.js применяет к этим координатам следующие преобразования:
translate, scale) на родительских
контейнерах влияют на вычисленную позицию.Popper.js позволяет задавать смещение через опцию
modifiers с модификатором offset. Смещение
работает в локальных координатах popper:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
modifiers: [{
name: 'offset',
options: {
offset: [10, 20], // [skew по оси x, skew по оси y]
},
}],
});
Первое значение массива — сдвиг по основной оси
(main axis), второе — по перекрестной оси (cross axis).
Основная ось зависит от выбранного placement (top,
bottom, left, right).
Popper.js учитывает ограничивающие области видимости, называемые clipping parents. Это элементы, которые могут обрезать popper по своим границам. Ключевые моменты:
overflow установлен как
hidden, scroll или auto.Модификатор preventOverflow позволяет popper оставаться внутри видимой области. Его конфигурация включает:
mainAxis — ограничение по основной оси.altAxis — ограничение по перекрестной оси.boundary — элемент или массив элементов, задающих
границы.tether — логика «привязки» popper к reference. Если
true, popper не выходит за границы даже при смещении.Пример:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
modifiers: [{
name: 'preventOverflow',
options: {
boundary: 'viewport',
mainAxis: true,
altAxis: true,
tether: true,
},
}],
});
Popper.js поддерживает две стратегии позиционирования:
Выбор стратегии влияет на вычисление координат
reference, а также на поведение clipping.
Например, при fixed popper не обрезается контейнерами с
прокруткой.
getBoundingClientRect.top,
bottom, left, right).transform: translate3d(x, y, 0) или абсолютные координаты
top/left в зависимости от стратегии.Модификатор flip позволяет менять сторону, если popper выходит за границы clipping rectangle. Flip работает в системе координат Popper.js, проверяя:
Popper.js реагирует на события:
Механизм update() позволяет вручную инициировать
пересчет координат с учетом всех модификаторов:
popperInstance.update();
С таким подходом Popper.js предоставляет гибкую и точную систему позиционирования, позволяя строить сложные интерфейсы с тултипами, всплывающими меню и кастомными модальными окнами, которые всегда остаются в видимой области и корректно реагируют на динамические изменения страницы.