В Popper.js boundary определяет область, за пределы
которой всплывающий элемент (popper) не должен выходить. Одним из часто
используемых вариантов является viewport — граница,
ограниченная видимой областью окна браузера. Этот подход позволяет
обеспечить корректное позиционирование элементов даже при динамических
изменениях размеров окна или скроллинге страницы.
import { createPopper } from '@popperjs/core';
const reference = document.querySelector('#button');
const popper = document.querySelector('#tooltip');
createPopper(reference, popper, {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
},
},
],
});
В этом примере используется модификатор
preventOverflow, который контролирует выход popper за
границы. Опция boundary: 'viewport' указывает, что поппер
не должен выходить за пределы видимой области окна браузера.
Модификатор preventOverflow работает путем
вычисления доступного пространства вокруг reference и
корректировки позиции popper так, чтобы он полностью помещался внутри
заданной границы. При использовании viewport алгоритм
учитывает:
padding.Пример с добавлением padding:
createPopper(reference, popper, {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
padding: 8,
},
},
],
});
padding позволяет оставить отступ от границы viewport, предотвращая прилипание popper к краям окна. Это особенно важно для элементов с тенями или закругленными углами, чтобы сохранить эстетичность интерфейса.
Popper.js позволяет использовать viewport не только как строковую опцию. Модификатор preventOverflow поддерживает массив или функцию, что дает гибкость при сложных интерфейсах.
Массив сторон для ограничения:
createPopper(reference, popper, {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
altAxis: true, // также ограничивает вторичную ось
},
},
],
});
altAxis: true — активирует проверку второй оси, что
особенно полезно для вертикально или горизонтально ориентированных
всплывающих элементов, предотвращая пересечение границ viewport.Функция как boundary:
createPopper(reference, popper, {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: (popperElement) => {
return popperElement.ownerDocument.documentElement;
},
},
},
],
});
В этом случае boundary вычисляется динамически, что дает возможность учитывать нестандартные контейнеры или кастомные ограничения.
Использование viewport как границы тесно связано с другими модификаторами:
viewport flip корректно реагирует на доступное
пространство в окне.Пример комплексной настройки:
createPopper(reference, popper, {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
padding: 5,
altAxis: true,
},
},
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'bottom'],
},
},
{
name: 'offset',
options: {
offset: [0, 10],
},
},
],
});
Popper.js динамически пересчитывает позицию popper при изменении размеров viewport или скролле, если установлен модификатор eventListeners (включен по умолчанию). Это позволяет поддерживать boundary viewport даже при перемещении страницы или изменении размеров окна.
createPopper(reference, popper, {
modifiers: [
{
name: 'eventListeners',
options: {
scroll: true,
resize: true,
},
},
],
});
Таким образом, viewport как boundary обеспечивает адаптивность и корректное отображение popper, предотвращая выход за видимую область, даже в динамически изменяющихся интерфейсах.
Viewport как boundary — основной инструмент Popper.js для ограничения всплывающих элементов в пределах видимой области, обеспечивающий предсказуемое и надежное поведение интерфейсов.