Popper.js предоставляет мощный механизм для управления
позиционированием всплывающих элементов, таких как тултипы, выпадающие
меню и модальные подсказки. Одним из ключевых элементов управления
является параметр placement, который определяет, где именно
относительно целевого элемента будет отображаться поппер. Помимо
стандартных значений (top, bottom,
left, right и их вариаций с
-start и -end), Popper.js позволяет создавать
кастомные конфигурации placement для точного контроля
позиции.
placementplacement принимает строку, описывающую направление и
выравнивание:
top, bottom,
left, right — определяют основное
расположение.-start,
-end — уточняют горизонтальное или вертикальное смещение
относительно цели.Пример стандартного использования:
import { createPopper } from '@popperjs/core';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
createPopper(button, tooltip, {
placement: 'top-start'
});
В этом примере тултип будет располагаться сверху кнопки, начиная с её левой стороны.
placement через модификатор offsetДля создания уникальных смещений можно использовать модификатор
offset. Он позволяет управлять расстоянием между поппером и
reference-элементом, а также сдвигать его по оси X или Y.
createPopper(button, tooltip, {
placement: 'top',
modifiers: [
{
name: 'offset',
options: {
offset: [10, 20] // [skew по основной оси, смещение по поперечной оси]
}
}
]
});
top → вертикальная ось, left → горизонтальная
ось).Это позволяет создавать кастомные позиции, которые невозможно
выразить стандартными значениями placement.
popperOffsetsДля более точного контроля используется модификатор
popperOffsets. Он позволяет задать координаты поппера
вручную:
createPopper(button, tooltip, {
modifiers: [
{
name: 'popperOffsets',
enabled: true,
phase: 'main',
fn({ state }) {
state.styles.popper.top = '50px';
state.styles.popper.left = '200px';
}
}
]
});
Особенности:
placement.placement через computeStylesМодификатор computeStyles отвечает за вычисление
финальных координат с учетом смещений и ограничений. При создании
кастомного placement его можно настраивать:
createPopper(button, tooltip, {
modifiers: [
{
name: 'computeStyles',
options: {
adaptive: false, // отключает автоматическую адаптацию к краям окна
gpuAcceleration: false // можно использовать топ/лев координаты напрямую
}
}
]
});
adaptive: false особенно полезен, когда требуется, чтобы
поппер не менял позицию при скролле или изменении размера окна, что
важно для кастомных layouts.
placementPopper.js поддерживает динамическую смену placement в зависимости от
доступного пространства или других условий. Для этого используется
модификатор flip:
createPopper(button, tooltip, {
placement: 'bottom',
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['top-start', 'right', 'left'], // возможные альтернативы
padding: 8
}
}
]
});
flip автоматически выбирает наилучший placement из
заданных fallback в случае, если основной placement перекрывается
границами viewport. Для кастомных решений можно комбинировать
flip с offset, чтобы добиться уникальных
позиций.
Начиная с версии Popper.js 2, можно создавать полностью кастомные функции для определения placement:
createPopper(button, tooltip, {
placement: ({ reference, popper, placement }) => {
if (window.innerWidth < 600) return 'bottom';
return 'top-end';
}
});
Особенности такого подхода:
Для сложных сценариев рекомендуется комбинировать:
offset — для смещения относительно
reference-элемента.popperOffsets — для точного
позиционирования по координатам.computeStyles с адаптацией — контроль
за поведением при скролле или изменении размеров.flip — обеспечение корректного
отображения на экранах разной ширины.Такой подход позволяет создавать абсолютно любые, кастомные позиции попперов без ограничения стандартными предустановленными вариантами.