Экземпляр Popper создаётся с помощью конструктора
Popper.createPopper(reference, popper, options). Здесь:
reference – элемент, относительно
которого будет позиционироваться всплывающий блок. Может быть
DOM-элементом, объектом с координатами или виртуальным элементом с
функцией getBoundingClientRect.popper – всплывающий элемент, который
необходимо позиционировать.options – объект с настройками
позиционирования и поведения Popper. Включает
placement, modifiers,
strategy.Пример базового создания Popper:
const reference = document.querySelector('#button');
const popper = document.querySelector('#tooltip');
const popperInstance = Popper.createPopper(reference, popper, {
placement: 'top',
modifiers: [
{ name: 'offset', options: { offset: [0, 8] } }
],
});
Жизненный цикл Popper включает несколько ключевых этапов:
Инициализация При создании экземпляра происходит:
Обновление (update) Метод
popperInstance.update() пересчитывает позицию и применяет
новые стили к элементу. Может быть вызван вручную или автоматически при
изменении размеров окна или содержимого.
Асинхронное обновление
(forceUpdate) Метод
popperInstance.forceUpdate() выполняет немедленное
перерасчитывание позиции без ожидания очереди обновлений. Используется в
случаях, когда необходимо синхронное обновление.
Деструктуризация (destroy) Метод
popperInstance.destroy() полностью удаляет Popper:
Модификаторы — это плагины, влияющие на поведение Popper. Они работают в определённом порядке и могут изменять как вычисления, так и стили:
offset — смещает поппер относительно
reference.flip — автоматически меняет позицию,
если элемент не помещается в видимую область.preventOverflow — ограничивает выход
поппера за границы контейнера или окна.arrow — корректирует положение стрелки
на всплывающем элементе.Модификаторы имеют следующие жизненные этапы внутри Popper:
По умолчанию Popper отслеживает:
resize).scroll).Для контроля частоты обновлений используется
eventListeners модификатор. Он активируется автоматически,
если не указан вручную:
modifiers: [
{ name: 'eventListeners', enabled: true }
]
Можно отключить автоматическое слежение для оптимизации производительности, особенно при большом количестве Popper-элементов.
Popper позволяет работать с элементами, которые не находятся в DOM
напрямую, через объект с методом getBoundingClientRect:
const virtualReference = {
getBoundingClientRect: () => ({
width: 100,
height: 40,
top: 200,
left: 300,
right: 400,
bottom: 240,
}),
contextElement: document.body
};
const popperInstance = Popper.createPopper(virtualReference, popper);
Это полезно для всплывающих подсказок, связанных с координатами мыши или динамически созданными областями.
Popper поддерживает две стратегии:
absolute — элемент позиционируется
относительно ближайшего родителя с position: relative или
absolute.fixed — элемент позиционируется
относительно окна, игнорируя прокрутку.Стратегия задаётся через опцию strategy:
const popperInstance = Popper.createPopper(reference, popper, {
strategy: 'fixed'
});
Жизненный цикл можно контролировать через методы экземпляра:
update() — асинхронное обновление позиции.forceUpdate() — немедленное пересчитывание.setOptions(options) — обновление конфигурации и
модификаторов.destroy() — завершение работы Popper.Пример динамического изменения позиции:
popperInstance.setOptions({
placement: 'bottom',
modifiers: [{ name: 'offset', options: { offset: [0, 16] } }]
});
popperInstance.update();
eventListeners и flip
потребляют ресурсы при большом количестве элементов.virtual element и ручного управления
update() позволяет снизить нагрузку.Жизненный цикл Popper организован так, чтобы обеспечить плавное позиционирование, гибкость модификаций и эффективное управление ресурсами при работе с динамическими интерфейсами.