В Popper.js boundaries определяют область, внутри которой всплывающий элемент (popper) может позиционироваться. Они предотвращают выход подсказок, тултипов или меню за пределы видимой области или контейнера, улучшая юзабилити и визуальную согласованность интерфейса.
Popper.js поддерживает несколько способов задания boundaries: через
DOM-элемент, viewport или определённые контейнеры. Каждая из этих опций
управляется опцией preventOverflow в конфигурации
Popper.
import { createPopper } from '@popperjs/core';
const reference = document.querySelector('#button');
const popper = document.querySelector('#tooltip');
createPopper(reference, popper, {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport', // 'clippingParents' | HTMLElement | 'viewport'
padding: 8, // отступ от границ
},
},
],
});
В примере выше boundary: 'viewport' гарантирует, что
popper не выйдет за пределы видимой области экрана. Параметр
padding позволяет задать минимальное расстояние до
границ.
Viewport – ограничение видимой областью окна браузера. Используется по умолчанию, когда важно, чтобы popper всегда оставался в зоне видимости.
Clipping Parents – ограничения родительскими
элементами с установленным overflow (hidden,
scroll или auto). Это полезно, когда popper
находится внутри контейнера с прокруткой и нельзя позволить ему
«вылезать» за его пределы.
HTML элемент – можно передать конкретный элемент DOM для ограничения popper. Пример:
options: {
boundary: document.querySelector('#container')
}
top,
bottom, left, right. Это
расширенный вариант для сложных интерфейсов с нестандартной
версткой.preventOverflowМодификатор preventOverflow отвечает за соблюдение
границ и может быть тонко настроен через опции:
Пример:
{
name: 'preventOverflow',
options: {
mainAxis: true,
altAxis: true,
tether: true,
tetherOffset: 10,
boundary: 'clippingParents'
}
}
В этом случае popper будет максимально оставаться внутри родительских элементов с overflow, учитывая отступ 10px и возможность частично отходить к границе.
flipМодификатор flip автоматически меняет направление
popper, если он не помещается внутри boundaries. При корректной
настройке preventOverflow и flip popper
никогда не пересечёт заданные границы, а при нехватке места — изменит
placement.
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'right', 'bottom', 'left']
}
},
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
padding: 5
}
}
]
preventOverflow с flip, чтобы popper адаптивно
менял позицию.padding,
иначе popper может «прилипать» к краям и визуально ломать дизайн.getBoundingClientRect() и передавать объект вручную, что
позволяет контролировать нестандартные сценарии.Если размеры boundaries изменяются во время работы интерфейса (например, изменение размеров контейнера или окна), Popper.js обеспечивает автоматическое пересчитывание позиции popper через update():
popper.update();
Для динамических интерфейсов рекомендуется вызывать
update() после любых изменений DOM, которые могут повлиять
на boundaries, чтобы popper оставался корректно позиционированным.
preventOverflow и
boundary, а также параметры padding,
mainAxis, altAxis, tether.flip для автоматической смены позиции
при нехватке места.update() после изменения размеров или положения
boundaries.Эффективная настройка boundaries позволяет создавать стабильные и предсказуемые интерфейсы, где popper остаётся в видимой и логически корректной зоне отображения.