Popper.js предоставляет гибкий механизм управления положением всплывающих элементов относительно целевых объектов на странице. Центральной концепцией является поппер — элемент, позиционируемый относительно reference. Управление координатами поппера выполняется через конфигурацию options и методы, которые позволяют динамически корректировать позицию и смещение.
При создании поппера используются ключевые опции:
'top', 'bottom', 'left',
'right', а также комбинации с -start и
-end (например, 'top-start').'absolute' или 'fixed'. 'fixed'
блокирует поппер относительно окна просмотра, игнорируя скролл
страницы.Пример базовой конфигурации:
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, 10], // смещение по X и Y
},
},
],
});
В этом примере поппер будет расположен сверху кнопки с вертикальным смещением на 10 пикселей.
Popper.js предоставляет методы для обновления координат в реальном времени:
placement или
modifiers, и применить их без пересоздания экземпляра.Пример изменения позиции после события:
button.addEventListener('click', () => {
popperInstance.setOptions({
placement: 'right',
modifiers: [
{
name: 'offset',
options: { offset: [20, 0] }, // смещение по X
},
],
});
popperInstance.update();
});
Здесь поппер перемещается справа от кнопки с горизонтальным смещением 20px после клика.
Offset позволяет задавать конкретное смещение
поппера относительно reference. Он принимает массив
[skidding, distance]:
top/bottom) или по вертикали (для
left/right).Также возможна функция, возвращающая массив динамически:
modifiers: [
{
name: 'offset',
options: {
offset: ({ placement, reference, popper }) => {
if (placement.startsWith('top')) return [0, 15];
return [0, 5];
},
},
},
];
Такой подход позволяет изменять координаты в зависимости от расположения поппера.
Модификатор preventOverflow предотвращает выход поппера за границы контейнера или окна просмотра. Он корректирует координаты автоматически:
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: document.querySelector('#container'),
padding: 8, // минимальное расстояние до границы
},
},
];
В результате поппер будет сдвигаться, чтобы оставаться видимым, что особенно важно при динамическом контенте или изменении размеров окна.
Если требуется полностью управлять положением поппера, можно использовать модификатор popperOffsets:
modifiers: [
{
name: 'applyCustomOffsets',
enabled: true,
phase: 'write',
fn({ state }) {
state.styles.popper.top = `${state.rects.reference.top + 50}px`;
state.styles.popper.left = `${state.rects.reference.left + 30}px`;
},
},
];
В этом случае координаты задаются напрямую, игнорируя стандартные расчёты Popper.js. Такой метод подходит для специфических макетов, когда стандартное позиционирование не обеспечивает нужного результата.
При изменении координат важно учитывать плавность перехода. Для этого можно использовать CSS-переходы совместно с popperInstance.update(). Например:
#tooltip {
transition: transform 0.2s ease;
}
Popper.js обновляет позицию через CSS-трансформации, что делает анимацию плавной без резких перескоков.
update()
после любых изменений размеров или положения reference.offset, чтобы сохранять
совместимость с модификаторами preventOverflow и
flip.write-фазы, напрямую меняя
state.styles.popper.Эти возможности позволяют точно управлять координатами элементов на странице, обеспечивая гибкость и предсказуемость поведения всплывающих подсказок, тултипов и других интерактивных элементов.