Popper.js предоставляет мощные инструменты для управления позиционированием всплывающих элементов, таких как тултипы, выпадающие меню и модальные окна. Одним из ключевых аспектов является возможность динамически изменять настройки Popper в процессе работы приложения, без необходимости пересоздавать экземпляр полностью.
setOptionsКаждый экземпляр Popper создается с набором опций, передаваемых при инициализации:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'bottom',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8],
},
},
],
});
Для динамического изменения параметров используется метод
setOptions. Он позволяет обновить любые
настройки, включая позицию (placement), смещения
(offset), стратегии (strategy) и модификаторы
(modifiers):
popperInstance.setOptions({
placement: 'top',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 16],
},
},
],
});
После вызова setOptions Popper автоматически
пересчитывает положение всплывающего элемента с учетом новых
настроек.
Ключевые моменты:
setOptions выполняются
немедленно, но пересчет позиции может занять несколько миллисекунд.placement)Опция placement определяет начальное расположение
всплывающего элемента относительно целевого. Для динамического поведения
можно менять placement в зависимости от условий
интерфейса:
function updatePlacement(isDropdownAbove) {
popperInstance.setOptions({
placement: isDropdownAbove ? 'top-start' : 'bottom-end',
});
}
Поппер автоматически применяет флип-модификатор (если он включен) для предотвращения выхода за пределы видимой области.
popperInstance.setOptions({
modifiers: [
{ name: 'flip', options: { fallbackPlacements: ['top', 'right', 'left'] } }
]
});
Таким образом, элемент может адаптироваться к экрану или контейнеру, изменяя позицию динамически.
offset)Модификатор offset управляет смещением всплывающего
элемента относительно reference. Его динамическая настройка позволяет
точно подгонять расположение:
popperInstance.setOptions({
modifiers: [
{
name: 'offset',
options: { offset: [10, 20] },
},
],
});
Советы по применению:
[x, y] — горизонтальное
смещение.[x, y] — вертикальное смещение.strategy)Popper поддерживает две стратегии: absolute и
fixed. Динамическое изменение стратегии позволяет
контролировать поведение при скролле и внутри контейнеров с
overflow:
popperInstance.setOptions({
strategy: 'fixed'
});
absolute — позиционирование относительно ближайшего
родителя с position: relative.fixed — позиционирование относительно окна просмотра.
Полезно для всплывающих элементов поверх фиксированных контейнеров.Модификаторы можно активировать или деактивировать на лету с помощью
свойства enabled:
popperInstance.setOptions({
modifiers: [
{ name: 'preventOverflow', enabled: false },
{ name: 'flip', enabled: true },
],
});
Это позволяет:
Даже после изменения опций иногда требуется принудительно пересчитать позицию:
popperInstance.update();
update() пересчитывает координаты элемента с учетом
текущих настроек и состояния DOM. Это полезно при динамических
изменениях контента внутри reference или popper элементов.
Для еще более гибкого управления можно передавать функцию в
setOptions, возвращающую объект с настройками:
popperInstance.setOptions(() => ({
placement: window.innerWidth < 600 ? 'bottom' : 'right',
modifiers: [
{ name: 'offset', options: { offset: [0, 12] } }
]
}));
Такой подход позволяет адаптировать Popper под любые изменения интерфейса в реальном времени.
fixed для модальных окон
поверх скроллящихся контейнеров.flip только на мобильных
устройствах).Динамическое изменение настроек Popper.js делает библиотеку гибкой и адаптивной, позволяя создавать интерфейсы, которые реагируют на изменения экрана, состояния элементов и поведения пользователя без необходимости полностью пересоздавать Popper-инстансы.