В Popper.js модификаторы играют ключевую роль в управлении позиционированием всплывающих элементов. Их выполнение происходит в нескольких четко определённых фазах, каждая из которых выполняет определённую задачу и предоставляет разработчику возможность изменять поведение поппера на разных этапах вычислений.
beforeReadНазначение: подготовка данных перед чтением размеров и позиции элементов.
На этом этапе модификаторы получают доступ к текущему состоянию, но ещё не выполнены вычисления геометрии. Обычно используется для:
Модификаторы этой фазы не должны изменять вычисленные размеры, а лишь настраивать состояние.
Пример использования:
const beforeReadModifier = {
name: 'beforeReadExample',
phase: 'beforeRead',
enabled: true,
fn({ state }) {
state.attributes.popper = { 'data-before-read': true };
}
};
readНазначение: считывание текущих размеров и расположения элементов в DOM.
Модификаторы этой фазы получают актуальные bounding
rects целевого элемента (reference) и всплывающего
блока (popper) и могут использовать эти данные для
дальнейших вычислений. Применяется для:
Важно понимать, что на этом этапе не рекомендуется изменять DOM или размеры элементов — только считывать.
Пример использования:
const readModifier = {
name: 'readExample',
phase: 'read',
enabled: true,
fn({ state }) {
state.modifiersData.readExample = {
width: state.rects.popper.width,
height: state.rects.popper.height
};
}
};
beforeMainНазначение: подготовка данных перед основной фазой
вычислений (main).
На этом этапе модификаторы могут изменять данные, которые будут использоваться для расчёта позиции, но ещё не происходит окончательного изменения позиции поппера. Обычно применяется для:
mainНазначение: основная фаза вычисления позиции и применения изменений.
В этой фазе выполняются ключевые модификаторы, влияющие на позицию поппера, например:
offset — смещение относительно целевого элемента.flip — автоматический выбор подходящей стороны.preventOverflow — предотвращение выхода за пределы
контейнера.Особенности:
Пример модификатора main:
const mainModifier = {
name: 'mainExample',
phase: 'main',
enabled: true,
fn({ state }) {
state.styles.popper.left += 10; // простое смещение
}
};
afterMainНазначение: действия после основной фазы расчёта позиции.
Позволяет:
beforeWriteНазначение: подготовка к записи изменений в DOM.
На этом этапе можно:
writeНазначение: непосредственное применение изменений в DOM.
Модификаторы этой фазы изменяют:
top, left,
transform и др.).Пример применения стилей:
const writeModifier = {
name: 'writeExample',
phase: 'write',
enabled: true,
fn({ state }) {
Object.assign(state.elements.popper.style, state.styles.popper);
}
};
afterWriteНазначение: завершающие действия после записи изменений.
Применяется для:
beforeRead → read → beforeMain → main → afterMain → beforeWrite → write → afterWrite.write.read и main, тем быстрее рендер поппера,
особенно при сложной верстке или анимации.Фазы модификаторов в Popper.js создают структуру, позволяющую управлять позиционированием гибко, разделяя чтение, вычисление и запись, что обеспечивает высокую точность и стабильность отображения всплывающих элементов.