Popper.js управляет позиционированием всплывающих элементов
относительно целевого элемента. Placement — ключевой
параметр, определяющий, где именно будет отображаться поппер
относительно референса. Основные значения placement:
top, bottom, left,
right — базовые позиции вокруг референсного элемента.top-start, top-end,
bottom-start, bottom-end,
left-start, left-end,
right-start, right-end — уточнённые позиции с
привязкой к началу или концу оси.Например:
import { createPopper } from '@popperjs/core';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
createPopper(button, tooltip, {
placement: 'top-end',
});
В этом случае tooltip будет расположен над кнопкой, смещён к правому краю.
Popper.js умеет динамически менять позицию, чтобы всплывающий элемент
не выходил за границы окна или родительского контейнера. Для этого
используется модуль preventOverflow:
createPopper(button, tooltip, {
placement: 'bottom',
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport', // можно указать родителя или конкретный элемент
padding: 8, // отступ от границ
},
},
],
});
Если снизу нет места, Popper автоматически сместит элемент вверх.
Опция boundary может принимать:
'viewport' — границы окна.'clippingParents' — ближайшие родительские элементы с
overflow ограничением.flip для автоматической смены позицииМодуль flip позволяет Popper.js менять
placement, если изначально выбранная позиция не
помещается:
createPopper(button, tooltip, {
placement: 'right',
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['left', 'top', 'bottom'],
padding: 5,
},
},
],
});
fallbackPlacements — массив альтернативных
позиций.mainAxis и
crossAxis для более тонкой настройки.offsetДаже при адаптивном размещении часто требуется точная настройка
позиции. Модуль offset позволяет смещать
поппер по основной и перекрёстной осям:
createPopper(button, tooltip, {
placement: 'bottom',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 10], // [смещение по основной оси, смещение по перекрёстной]
},
},
],
});
Popper.js поддерживает два типа позиционирования:
absolute и fixed. Для адаптивных всплывающих
элементов предпочтительна fixed стратегия, чтобы элемент
оставался на месте при прокрутке:
createPopper(button, tooltip, {
strategy: 'fixed',
});
absolute позиционирование подчиняется родительским
элементам с position.fixed игнорирует прокрутку, что полезно для глобальных
тултипов.Popper.js предоставляет методы для ручного управления позиционированием:
const popperInstance = createPopper(button, tooltip, { placement: 'top' });
// обновление позиции после изменения DOM
popperInstance.update();
Можно вызывать update() при изменении размера или
видимости референса. Это особенно важно для адаптивного размещения в
интерфейсах с изменяющимся контентом.
createPopper(button, tooltip, {
placement: 'top',
modifiers: [
{ name: 'flip', options: { fallbackPlacements: ['bottom', 'right', 'left'] } },
{ name: 'offset', options: { offset: [0, 12] } },
{ name: 'preventOverflow', options: { padding: 8, boundary: 'viewport' } },
],
});
createPopper(button, tooltip, {
placement: 'bottom-end',
strategy: 'fixed',
modifiers: [
{ name: 'preventOverflow', options: { boundary: window } },
],
});
Эти подходы позволяют создавать гибкие всплывающие элементы, которые корректно отображаются на любых экранах и при изменении размеров контейнеров или окна браузера.