Popper.js — это библиотека для управления позиционированием всплывающих элементов, таких как тултипы, всплывающие меню и модальные окна. Основная задача Popper.js — гарантировать корректное расположение элемента относительно целевого объекта, независимо от размеров окна, скроллинга и ограничений контейнеров.
Ключевые понятия:
top, bottom, left,
right, с возможностью уточнения варианта через
-start или -end.Для создания поппера используется конструктор Popper или
фабричная функция createPopper в более новых версиях:
import { createPopper } from '@popperjs/core';
const reference = document.querySelector('#button');
const popper = document.querySelector('#tooltip');
createPopper(reference, popper, {
placement: 'top',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8], // смещение по оси X и Y
},
},
{
name: 'preventOverflow',
options: {
boundary: 'viewport', // ограничение внутри окна
},
},
],
});
Выделение ключевых моментов:
placement задает первоначальное направление отображения
поппера.offset позволяет сдвигать поппер от
целевого элемента.preventOverflow защищает элемент от выхода
за пределы контейнера или окна.Модификаторы позволяют гибко управлять поведением поппера. Их можно комбинировать, добавлять свои и изменять стандартные.
Основные встроенные модификаторы:
top и
left.Пример кастомного модификатора:
const customModifier = {
name: 'customShift',
enabled: true,
phase: 'main',
fn({ state }) {
state.styles.popper.top = `${parseInt(state.styles.popper.top, 10) + 10}px`;
},
};
createPopper(reference, popper, {
modifiers: [customModifier],
});
Модификаторы можно управлять через enabled, изменять
порядок их применения и фазу исполнения (beforeRead,
read, afterRead, beforeMain,
main, afterMain, beforeWrite,
write, afterWrite).
Popper.js поддерживает динамическое обновление позиции через метод
update():
popperInstance.update();
Он пересчитывает координаты, учитывая текущее положение референса и
состояние окна. Для автоматической реактивности используется
autoUpdate:
import { autoUpdate } from '@popperjs/core';
const cleanup = autoUpdate(reference, popper, () => {
popperInstance.update();
});
Функция autoUpdate возвращает функцию очистки, которую
необходимо вызвать при удалении элементов, чтобы избежать утечек
памяти.
Popper.js применяет абсолютное позиционирование через стили
top, left, transform. Для
контроля можно использовать модификатор computeStyles:
{
name: 'computeStyles',
options: {
gpuAcceleration: true, // использование GPU-трансформаций
adaptive: true, // адаптивная корректировка под размеры окна
},
}
Особенности:
gpuAcceleration: true снижает нагрузку на CPU при
перемещении элементов.adaptive: true корректирует позицию при изменении
размеров окна и скроллинге.Popper.js легко интегрируется с React, Vue и Angular. Для React
существует обертка react-popper:
import { usePopper } from 'react-popper';
const { styles, attributes } = usePopper(referenceElement, popperElement, {
placement: 'bottom-start',
});
В Vue используется аналогичный подход через композиционные API или директивы, а Angular — через сервисы и директивы с реактивным обновлением.
Popper.js автоматически отслеживает изменения размеров референса и поппера. Для случаев динамического контента важно:
ResizeObserver или встроенный механизм
autoUpdate.arrow.Пример с динамическим контентом:
const observer = new ResizeObserver(() => {
popperInstance.update();
});
observer.observe(popper);
observer.observe(reference);
Popper.js рассчитан на высокую производительность, но при сложных интерфейсах стоит учитывать:
gpuAcceleration.cleanup после удаления
элементов.update() при анимациях через
requestAnimationFrame или throttle.placement и модификаторы для
стабильного позиционирования.flip и
preventOverflow.autoUpdate и ResizeObserver.Popper.js обеспечивает надежное позиционирование элементов в веб-интерфейсах и позволяет гибко управлять поведением всплывающих элементов без сложных ручных вычислений координат и учёта ограничений контейнеров.