Popper.js работает через создание экземпляров для
управления позиционированием элементов относительно их
reference. Экземпляр создаётся с помощью функции
createPopper(reference, popper, options), где:
reference — элемент DOM, относительно которого будет
позиционироваться поппер.popper — элемент DOM, который должен
позиционироваться.options — объект конфигурации, включающий стратегии
позиционирования и модификаторы.Пример базового создания экземпляра:
import { createPopper } from '@popperjs/core';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
const popperInstance = createPopper(button, tooltip, {
placement: 'top',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8],
},
},
],
});
Экземпляр Popper.js обладает рядом методов и свойств, позволяющих управлять поведением поппера:
statestate — объект, содержащий текущее состояние поппера.
Основные поля:
elements —
{ reference, popper } — DOM-элементы, участвующие в
позиционировании.options — объект опций, переданный при
создании экземпляра.modifiersData — данные, собранные
модификаторами во время расчётов.rects — размеры и позиции
reference и popper.placement — текущее выбранное
расположение ('top', 'bottom',
'right', 'left' и их вариации
'top-start' и т.д.).strategy — стратегия позиционирования
('absolute' или 'fixed').Пример доступа к state:
console.log(popperInstance.state.placement); // 'top'
console.log(popperInstance.state.rects.popper.width); // ширина поппера
update()Метод update() выполняет расчёт и обновление
позиции поппера. Возвращает промис, который разрешается после
применения всех изменений:
popperInstance.update().then(() => {
console.log('Позиция обновлена');
});
update() полезен при динамическом изменении размеров
reference или popper.
forceUpdate()forceUpdate() выполняет немедленный пересчёт
позиции, синхронно. В отличие от update(), не
возвращает промис:
popperInstance.forceUpdate();
Используется, когда необходимо мгновенно изменить положение поппера без ожидания следующего цикла рендеринга.
setOptions()Метод setOptions(options) позволяет динамически
изменять конфигурацию экземпляра. Все переданные настройки
заменяют текущие, хотя modifiers и placement
можно корректировать частично:
popperInstance.setOptions({
placement: 'bottom',
modifiers: [
{ name: 'offset', options: { offset: [0, 16] } },
],
});
После вызова setOptions() экземпляр автоматически
вызывает update() для пересчёта позиции.
destroy()Метод destroy() полностью удаляет
экземпляр, очищает внутренние события и отменяет привязку
поппера к DOM:
popperInstance.destroy();
После этого popperInstance становится неактивным, и
дальнейшие вызовы методов update() или
forceUpdate() не имеют эффекта.
modifiers — массив модификаторов,
применяемых к текущему экземпляру. Можно получить через
popperInstance.state.options.modifiers.placement — удобный доступ к текущему
расположению поппера без обхода state.reference и popper —
прямой доступ к DOM-элементам через
popperInstance.state.elements.button.addEventListener('mouseenter', () => {
popperInstance.setOptions({ placement: 'right' });
});
const popperRect = popperInstance.state.rects.popper;
tooltip.style.transformOrigin = `${popperRect.width / 2}px ${popperRect.height}px`;
button.addEventListener('mouseleave', () => {
popperInstance.destroy();
});
Экземпляр Popper.js обеспечивает полный контроль над:
update,
forceUpdate)setOptions)state)destroy)Это позволяет создавать гибкие, динамические интерфейсы с точным позиционированием элементов, независимо от их размеров, положения на странице и изменений DOM.