Popper.js — это библиотека для точного позиционирования всплывающих элементов относительно других элементов на странице. Она используется для создания всплывающих подсказок, тултипов, дропдаунов и модальных элементов с динамическим размещением. Основная цель Popper.js — обеспечить корректное позиционирование, учитывая размеры элементов, видимую область экрана и возможные препятствия.
Reference (ссылка) — элемент, относительно которого позиционируется Popper. Popper (всплывающий элемент) — элемент, который необходимо расположить.
Popper.js всегда рассчитывает позицию относительно
reference, автоматически подбирая координаты
top, bottom, left,
right с учётом размеров и ограничений видимой области.
placement задаёт базовое расположение Popper
относительно reference. Основные значения:
top — сверхуbottom — снизуleft — слеваright — справаДополнительные уточнения через -start и
-end:
top-start — сверху, по левому краюbottom-end — снизу, по правому краюPopper.js также позволяет динамически менять placement,
если выбранная позиция не помещается на экране.
Модификаторы (modifiers) — это функции, которые изменяют поведение Popper на этапе расчёта позиции. Основные модификаторы:
offset — задаёт смещение Popper относительно reference по оси X и Y.
modifiers: [{ name: 'offset', options: { offset: [0, 8] } }]flip — автоматически переворачивает Popper на противоположную сторону, если место ограничено.
preventOverflow — предотвращает выход Popper за границы видимой области.
arrow — позиционирует стрелку, указывающую на reference.
Модификаторы можно комбинировать, управляя порядком их выполнения
через phase (например, main,
write, beforeRead).
Popper.js использует точку привязки (reference point), определяемую размерами reference. Расчёт координат Popper выполняется с учётом:
Функция смещения может быть кастомной:
modifiers: [{
name: 'offset',
options: {
offset: ({ placement, reference, popper }) => {
if (placement.startsWith('top')) return [0, -10];
return [0, 10];
}
}
}]
Popper.js пересчитывает позицию при изменении размера окна или скролле контейнера. Для этого используется autoUpdate, которая слушает события и корректирует координаты Popper в реальном времени.
import { createPopper, autoUpdate } from '@popperjs/core';
const popperInstance = createPopper(reference, popper, {
placement: 'bottom',
modifiers: [{ name: 'offset', options: { offset: [0, 10] } }]
});
autoUpdate(reference, popper, popperInstance.update);
Стрелка — это элемент Popper, визуально указывающий на reference. Для её корректного позиционирования необходимо:
arrow, передав в него селектор
или DOM-элемент стрелкиmodifiers: [
{ name: 'arrow', options: { element: '.arrow' } },
{ name: 'offset', options: { offset: [0, 8] } }
]
Popper.js учитывает границы, чтобы избежать выхода элемента за видимую область. Существует два типа:
viewport) по умолчаниюМодификатор preventOverflow использует эти параметры для
ограничения позиции Popper.
Popper.js идеально справляется с адаптивной версткой, когда элементы могут менять размер или положение в зависимости от экрана.
placement, чтобы Popper имел базовую
ориентациюflip и preventOverflow для
адаптивностиoffset с учётом
конкретной логики интерфейсаPopper.js обеспечивает надёжное и предсказуемое позиционирование элементов, позволяя создавать интерфейсы с динамическими и интерактивными элементами без сложных вычислений вручную.