Popper.js предоставляет мощный механизм управления поведением всплывающих элементов через модификаторы. Модификаторы — это функции, которые изменяют поведение поппера на различных этапах жизненного цикла: позиционирование, смещение, предотвращение выхода за границы и многое другое. Каждый модификатор имеет собственные настройки, позволяющие тонко настраивать его работу.
Каждый модификатор задается объектом со следующими ключевыми свойствами:
name — уникальный идентификатор модификатора,
например "offset" или "flip".
enabled — логическое значение, включающее или
отключающее модификатор. По умолчанию true.
phase — этап жизненного цикла поппера, на котором выполняется модификатор. Основные фазы:
"beforeRead""read""afterRead""beforeMain""main""afterMain""beforeWrite""write""afterWrite"fn — основная функция модификатора, принимающая
объект с состоянием поппера (state) и вспомогательные
данные (options).
options — объект конфигурации, специфичный для данного модификатора.
requires — массив имен модификаторов, от которых зависит текущий модификатор.
Пример базовой структуры модификатора:
const offsetModifier = {
name: 'offset',
enabled: true,
phase: 'main',
fn: ({ state, options }) => {
// логика смещения поппера
},
options: {
offset: [0, 10]
}
};
Popper.js поставляется с набором стандартных модификаторов.
Встроенные модификаторы можно подключать и настраивать через
объект modifiers при создании поппера:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8] // горизонтальное и вертикальное смещение
}
},
{
name: 'preventOverflow',
options: {
padding: 10, // отступ от границ контейнера
boundary: 'viewport' // граница, относительно которой проверяется выход
}
},
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'right', 'bottom', 'left'] // альтернативные позиции
}
}
]
});
offset)Модификатор offset изменяет положение
поппера относительно референс-элемента. Опция offset
принимает массив [skidding, distance]:
skidding — смещение по оси X для горизонтальных
положений или по оси Y для вертикальных.distance — смещение по основной оси (направление
поппера относительно референса).options: {
offset: [10, 20]
}
preventOverflow)Модификатор preventOverflow
контролирует, чтобы поппер не выходил за пределы заданной границы
(boundary). Основные опции:
padding — минимальное расстояние до границы.boundary — элемент, относительно которого проверяется
выход (viewport, scrollParent,
clippingParents).altAxis — включает корректировку по второстепенной
оси.options: {
padding: 5,
boundary: 'clippingParents',
altAxis: true
}
flip)Модификатор flip автоматически меняет
положение поппера, если исходная позиция приводит к выходу за границы.
Основные опции:
fallbackPlacements — массив альтернативных позиций для
перебора.padding — отступ от границ при проверке.boundary — граница для проверки выхода.options: {
fallbackPlacements: ['bottom', 'right', 'top', 'left'],
padding: 8
}
Можно создавать собственные модификаторы для специфических задач:
const customModifier = {
name: 'logState',
enabled: true,
phase: 'write',
fn: ({ state }) => {
console.log('Текущее положение поппера:', state.placement);
}
};
Добавление в конфигурацию Popper:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
modifiers: [customModifier]
});
Особенности создания пользовательских модификаторов:
phase определяет момент выполнения (main
для изменения данных, write для обновления DOM).requires для указания зависимости от
других модификаторов.options позволяют передавать настройки в функцию
fn.Модификаторы выполняются в порядке их определения в массиве
modifiers. Зависимые модификаторы можно явно указать через
свойство requires. Если зависимость не соблюдена, Popper.js
выбросит предупреждение.
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
modifiers: [
{
name: 'arrow',
options: { element: arrowElement },
requires: ['popperOffsets']
}
]
});
Поппер позволяет изменять параметры модификаторов после инициализации
через метод setOptions:
popperInstance.setOptions({
modifiers: [
{
name: 'offset',
options: { offset: [0, 16] }
}
]
});
Это позволяет адаптировать поведение поппера в зависимости от изменений DOM, размеров окна или пользовательских действий.
Если нужно, я могу подготовить подробную таблицу всех стандартных модификаторов Popper.js с их ключевыми опциями, чтобы она могла служить как готовый справочник для учебника. Это будет естественное продолжение темы конфигурации. Хочешь, чтобы я это сделал?