Popper.js — это библиотека для управления позиционированием всплывающих элементов, таких как тултипы, поповеры, меню и другие всплывающие интерфейсы. Автоматическое позиционирование позволяет элементу динамически адаптироваться к доступному пространству и предотвращать его выход за пределы окна или контейнера.
Основные компоненты Popper.js:
placementКлючевым параметром для позиционирования является
placement. Он определяет первичное направление всплывающего
элемента относительно reference:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'top-start',
});
Возможные значения:
Использование auto позволяет создавать интерфейсы,
которые не требуют ручной корректировки при изменении размера окна или
положения элемента.
flipМодификатор flip отвечает за автоматическую
смену позиции, если выбранное направление выходит за пределы
видимой области:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'top',
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['bottom', 'right', 'left'],
},
},
],
});
Особенности:
fallbackPlacements задаёт порядок альтернативных
направлений.flip включён, Popper проверяет, помещается ли
элемент в окно, и при необходимости меняет позицию на первую доступную
из списка fallback.flip активен при использовании
auto.preventOverflow)Чтобы элемент не выходил за пределы контейнера или окна браузера,
используется модификатор preventOverflow:
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
padding: 8,
},
},
],
Параметры:
boundary — область, внутри которой Popper пытается
удержать элемент (viewport, scrollParent, или
любой DOM-элемент).padding — отступ от границы области видимости.flip, чтобы избежать
наложений и визуальных багов при автоматическом позиционировании.offset)Модификатор offset позволяет задавать дополнительное
смещение Popper относительно reference:
modifiers: [
{
name: 'offset',
options: {
offset: [0, 10], // горизонтальное, вертикальное смещение
},
},
],
Особенности:
[skidding, distance] управляет смещением по
оси reference и расстоянием от него.update и autoUpdate)Popper.js позволяет автоматически пересчитывать позицию при изменении размеров reference или окна:
import { autoUpdate } from '@popperjs/core';
const cleanup = autoUpdate(referenceElement, popperElement, popperInstance.update);
autoUpdate регистрирует слушатели resize,
scroll и мутации DOM.update.arrow для указателейДля отображения стрелки, указывающей на reference, применяется
модификатор arrow:
modifiers: [
{
name: 'arrow',
options: {
element: arrowElement,
padding: 5,
},
},
],
element — DOM-элемент стрелки.padding — минимальное расстояние от границ Popper до
стрелки.arrow автоматически корректирует позицию стрелки при
срабатывании flip или preventOverflow.Автоматическое позиционирование достигается через грамотное сочетание:
Пример полной конфигурации:
const popperInstance = Popper.createPopper(referenceElement, popperElement, {
placement: 'auto',
modifiers: [
{ name: 'offset', options: { offset: [0, 10] } },
{ name: 'flip', options: { fallbackPlacements: ['top', 'right', 'bottom', 'left'] } },
{ name: 'preventOverflow', options: { boundary: 'viewport', padding: 8 } },
{ name: 'arrow', options: { element: arrowElement, padding: 5 } },
],
});
Такой подход гарантирует, что Popper всегда занимает оптимальное положение, избегает перекрытий и корректно реагирует на динамические изменения интерфейса.
Автоматическое позиционирование Popper.js позволяет создавать гибкие, адаптивные интерфейсы без сложных ручных вычислений координат и обработки событий скролла и изменения размеров окна.