Popper.js строит позиционирование всплывающих элементов (попперов) на основе ядра библиотеки, которое вычисляет положение относительно целевого элемента (reference element) с учётом доступного пространства, размеров и предпочтений. Центральным механизмом управления поведением поппера являются модификаторы.
Модификатор — это объект с набором свойств, который расширяет или изменяет стандартное поведение Popper.js. Каждый модификатор выполняет конкретную задачу: управление позиционированием, корректировку отступов, обработку границ экрана, автоматическую смену направления и многое другое.
Структура модификатора обычно выглядит так:
const modifier = {
name: 'название',
enabled: true,
phase: 'phase',
fn: ({ state, name, options }) => { /* логика модификатора */ },
options: { /* дополнительные параметры */ },
};
Ключевые свойства:
name — уникальное имя модификатора.enabled — активирован ли модификатор.phase — стадия жизненного цикла, на которой выполняется
модификатор (read, beforeMain,
main, afterMain, write).fn — функция, реализующая логику модификатора.options — объект с настройками, специфичными для
данного модификатора.Жизненный цикл Popper.js разделён на фазы, что позволяет модификаторам работать последовательно и независимо. Основные фазы:
Правильное определение фазы критично для производительности: тяжелые
вычисления лучше помещать на ранние стадии, а манипуляции с DOM — на
фазу write.
Popper.js поставляется с набором встроенных модификаторов, которые решают большинство типовых задач:
Пример использования встроенных модификаторов:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8], // смещение по оси X и Y
},
},
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'right', 'left'], // альтернативные позиции
},
},
],
});
Кастомные модификаторы позволяют реализовать уникальные сценарии. Основные шаги:
const myModifier = {
name: 'highlight',
enabled: true,
phase: 'main',
};
fn:fn({ state, options }) {
const popper = state.elements.popper;
if (state.placement.startsWith('top')) {
popper.style.backgroundColor = options.color || 'yellow';
}
}
Popper.createPopper(referenceElement, popperElement, {
modifiers: [myModifier],
});
Модификаторы выполняются по порядку, указанному
в массиве modifiers.
Модификаторы одной фазы выполняются
последовательно, каждая функция получает актуальное
состояние state, которое может быть изменено предыдущими
модификаторами.
state содержит:
elements — DOM-элементы (popper, reference,
arrow).rects — размеры элементов.modifiersData — данные модификаторов для передачи
информации между ними.placement — текущая позиция поппера.styles — объект CSS-стилей, применяемых к popper.Это обеспечивает гибкую и модульную архитектуру, где модификаторы могут как дополнять, так и полностью переопределять поведение друг друга.
state.modifiersData.arrow использует данные popperOffsets,
рассчитанные модификатором computeStyles.main, обновление DOM на write.main.Модификаторы в Popper.js создают мощный и гибкий инструмент управления поведением всплывающих элементов, позволяя точно контролировать позиционирование, стиль и реакцию на изменения DOM или размеров окна.