Popper.js — библиотека для точного позиционирования всплывающих элементов (tooltip, dropdown, popover) относительно опорного элемента (reference). Основная задача — выбрать такую позицию, при которой всплывающий элемент остаётся видимым, не перекрывает критичный контент и соответствует UX-ожиданиям.
Ключевым понятием является placement — начальное желаемое расположение:
top, bottom, left,
righttop-start, top-end и т.д.Однако реальная позиция редко остаётся фиксированной. В процессе вычислений Popper применяет стратегию адаптации с помощью модификаторов.
Крупный popper требует больше пространства и чаще вызывает смещение.
По умолчанию используется viewport, но можно задать:
Это влияет на поведение при переполнении.
Если контейнер имеет overflow: hidden | auto | scroll,
Popper учитывает:
Дополнительные ограничения, влияющие на минимальное расстояние до границ.
Popper не просто ставит элемент в заданную позицию. Он использует стратегию:
Пример:
createPopper(reference, popper, {
placement: 'top',
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['bottom', 'right', 'left']
}
}
]
});
flip: динамическая смена позицииОсновной инструмент адаптации.
Принцип работы:
Особенности:
Гибкая настройка:
{
name: 'flip',
options: {
fallbackPlacements: ['bottom-start', 'right-end'],
padding: 8,
boundary: document.body
}
}
preventOverflow: удержание внутри границЕсли flip отвечает за смену стороны, то preventOverflow
— за точную подстройку.
Задачи:
{
name: 'preventOverflow',
options: {
mainAxis: true,
altAxis: true,
tether: true
}
}
Параметры:
mainAxis — контроль по основной оси (например, по
вертикали для top/bottom)altAxis — контроль по перпендикулярной осиtether — ограничивает отрыв popper от referenceИспользуется, когда важно строгое положение:
placement: 'bottom',
modifiers: [
{ name: 'flip', enabled: false }
]
Применение:
Наиболее распространённый вариант:
placement: 'top',
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['bottom', 'right', 'left']
}
}
]
Плюсы:
Приоритет — сохранить положение, даже если часть popper выходит за границы:
{
name: 'preventOverflow',
options: {
tether: false
}
}
Применение:
Использование кастомной логики выбора:
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'bottom', 'right', 'left']
}
}
Popper выбирает позицию с максимальной доступной площадью.
Порядок fallback-значений критичен:
fallbackPlacements: ['top', 'right', 'left']
Рекомендации:
top → bottom)start, end)Placement может быть уточнён:
top-startbottom-endПоведение:
start — выравнивание по началу referenceend — по концуПри нехватке места Popper может:
Popper анализирует:
Можно явно задать границу:
{
name: 'preventOverflow',
options: {
boundary: 'viewport'
}
}
или
boundary: document.querySelector('.container')
fixed vs
absolutePopper поддерживает два режима позиционирования:
absolute (по умолчанию)fixedstrategy: 'fixed'
Когда использовать:
offset) как часть стратегииПозволяет корректировать итоговую позицию:
{
name: 'offset',
options: {
offset: [0, 10]
}
}
Используется для:
Popper допускает расширение через собственные модификаторы.
Пример логики:
const customModifier = {
name: 'customPlacement',
enabled: true,
phase: 'main',
fn({ state }) {
// анализ размеров и изменение placement
}
};
Частое пересчитывание позиции может быть дорогим:
Решения:
update()1. Игнорирование overflow
2. Неправильный порядок fallback
3. Отсутствие offset
4. Неверный boundary
placement)flip)preventOverflow)offset)fixed/absolute)Такая комбинация позволяет добиться устойчивого, предсказуемого и визуально корректного позиционирования в любых условиях интерфейса.