Popper.js использует концепцию модификаторов для управления поведением всплывающих элементов (popper’ов). Модификаторы — это функции или объекты с определёнными свойствами, которые выполняют различные задачи: вычисляют положение, изменяют стили, обрабатывают события и обеспечивают динамическое обновление.
Понимание порядка выполнения модификаторов критично для правильного позиционирования элементов, особенно в сложных интерфейсах.
Каждый модификатор имеет следующие ключевые свойства:
Функция createPopper автоматически учитывает эти
свойства, строя цепочку выполнения модификаторов.
Модификаторы выполняются по строгой последовательности, определяемой свойством phase. Популярные фазы:
Понимание фаз позволяет управлять взаимодействием модификаторов и гарантирует, что данные, используемые одним модификатором, будут корректны и окончательны к моменту его выполнения.
Свойства requires и
requiresIfExists создают цепочки зависимостей. Если
модификатор A требует выполнения модификатора
B, Popper.js гарантирует, что B будет выполнен
раньше. Нарушение порядка зависимостей может привести к некорректному
позиционированию.
Пример конфигурации модификатора с зависимостями:
const flipModifier = {
name: 'flip',
enabled: true,
phase: 'main',
requires: ['preventOverflow'],
fn({ state, options }) {
// Логика флипа popper’а
}
};
В этом примере модификатор flip не начнёт работу, пока
не будет выполнен preventOverflow, обеспечивая корректное
вычисление границ и предотвращение выхода popper’а за пределы
контейнера.
Popper.js строит граф зависимостей модификаторов, используя алгоритм топологической сортировки. Это обеспечивает:
Если цикл обнаружен, библиотека генерирует предупреждение, чтобы избежать бесконечной рекурсии.
Пользовательские модификаторы можно вставлять в цепочку, указывая фазу и зависимости. Это позволяет:
Пример пользовательского модификатора:
const customOffset = {
name: 'customOffset',
enabled: true,
phase: 'main',
requires: ['computeStyles'],
fn({ state }) {
state.styles.popper.top += 10;
state.styles.popper.left += 5;
}
};
Здесь модификатор customOffset выполняется после
computeStyles, гарантируя, что базовые стили уже
рассчитаны.
requires или фаз могут приводить к
неправильному позиционированию popper’а.Понимание этих принципов позволяет строить сложные всплывающие интерфейсы с полной контролируемостью над процессом позиционирования и стилями.