В Popper.js модификаторы (modifiers) — это
объекты, которые изменяют поведение поппера на этапе его вычисления
позиции. Они применяются последовательно и могут как корректировать
расположение поппера, так и изменять его стили, поведение при
столкновениях или добавлять кастомные эффекты. Каждый модификатор
содержит обязательное свойство name и функцию
fn, выполняющую основную логику модификатора. Кроме того,
модификаторы могут иметь флаги enabled и
phase, задающие активацию и фазу применения.
Фазы исполнения модификаторов:
Понимание фаз важно для правильного использования и создания кастомных модификаторов.
Popper.js предоставляет набор стандартных модификаторов, которые обеспечивают большинство функциональных требований.
offsetМодификатор смещения изменяет позицию поппера относительно целевого элемента.
Ключевые свойства:
{
name: 'offset',
options: {
offset: [0, 8] // смещение по оси X и Y
}
}
Особенности:
preventOverflowМодификатор предотвращает выход поппера за пределы видимой области.
Опции:
{
name: 'preventOverflow',
options: {
boundary: 'viewport', // или 'clippingParents'
padding: 8
}
}
Характеристики:
boundary задает границы, внутри которых поппер должен
оставаться.padding добавляет отступ от границ, предотвращая
прилипающий эффект к краям.flip для динамического изменения
позиции.flipПозволяет попперу автоматически менять положение при ограниченном пространстве.
Пример конфигурации:
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'right', 'left'],
padding: 5
}
}
Особенности:
fallbackPlacements — массив альтернативных позиций,
которые Popper.js будет проверять.preventOverflow для корректного
поведения при ограниченной видимости.arrowИспользуется для создания указателя (стрелки) на поппере.
Пример:
{
name: 'arrow',
options: {
element: '.arrow',
padding: 5
}
}
Особенности:
element — DOM-узел стрелки.padding защищает стрелку от соприкосновения с границами
popper или reference.Создание собственного модификатора возможно через объект с обязательными полями:
{
name: 'customModifier',
enabled: true,
phase: 'main',
fn({ state, options, name }) {
// логика модификатора
}
}
Параметры функции fn:
state — объект состояния поппера: позиции, размеры
элементов, активные модификаторы.options — настройки модификатора, переданные
пользователем.name — имя модификатора для удобства логирования и
отладки.Особенности кастомных модификаторов:
state.styles,
state.attributes и state.modifiersData.read, main,
write, afterWrite), что позволяет гибко
управлять порядком исполнения.Popper.js выполняет модификаторы в порядке их объявления. При этом важно учитывать:
offset,
flip, preventOverflow), должны идти раньше
визуальных модификаторов (arrow,
applyStyles).requires можно указать зависимость
модификатора от других, гарантируя корректный порядок вычислений.Пример:
{
name: 'arrow',
enabled: true,
phase: 'main',
requires: ['popperOffsets']
}
arrow будет выполняться только после того, как Popper.js
вычислит смещение поппера (popperOffsets).
requires.offset,
padding, fallbackPlacements).Модификаторы Popper.js являются мощным инструментом для создания сложных и адаптивных всплывающих элементов, позволяя гибко управлять поведением и визуальными характеристиками поппера в любой ситуации.