В библиотеке Popper.js механизм позиционирования основан на вычислении доступного пространства вокруг опорного (reference) элемента. Для контроля этих вычислений используется параметр boundary, определяющий границы, внутри которых должен находиться всплывающий элемент (popper).
Boundary — это ограничивающий контейнер, за пределы которого popper
не должен выходить при автоматическом позиционировании и применении
модификаторов (например, preventOverflow или
flip).
Основные задачи boundary:
Без корректно заданного boundary popper может:
Boundary применяется в первую очередь в модификаторах:
preventOverflowflipПример конфигурации:
createPopper(referenceElement, popperElement, {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'clippingParents',
},
},
],
});
clippingParents (значение по умолчанию)Наиболее распространённый вариант. В этом режиме Popper определяет все родительские элементы с overflow (scroll, auto, hidden) и использует их как ограничивающую область.
Особенности:
viewportОграничивает popper размерами области просмотра браузера.
boundary: 'viewport'
Особенности:
windowИспользует окно браузера как границу.
boundary: 'window'
Отличие от viewport:
Можно явно указать конкретный HTML-элемент:
boundary: document.querySelector('#container')
Особенности:
Модификатор preventOverflow проверяет, выходит ли popper
за пределы boundary, и корректирует его позицию.
Пример:
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
padding: 8,
},
}
Здесь:
padding задаёт отступ от границыМодификатор flip меняет сторону отображения popper
(например, с top на bottom), если текущая
позиция не помещается в пределах boundary.
{
name: 'flip',
options: {
boundary: 'clippingParents',
},
}
Логика:
Помимо boundary, существует параметр
rootBoundary, который задаёт “корневую” область:
{
name: 'preventOverflow',
options: {
boundary: 'clippingParents',
rootBoundary: 'viewport',
},
}
Различие:
| Параметр | Назначение |
|---|---|
| boundary | локальные ограничения |
| rootBoundary | глобальные ограничения |
Boundary часто используется вместе с параметром padding,
который задаёт внутренний отступ от границы.
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
padding: {
top: 10,
bottom: 10,
left: 5,
right: 5,
},
},
}
Результат:
При использовании clippingParents Popper:
Это важно в интерфейсах с:
Причина:
Решение:
viewport или windowПричина:
Решение:
boundary: 'viewport'
Причина:
Решение:
boundary: 'clippingParents'
Поведение:
boundary: modalElement
Поведение:
boundary: 'viewport'
Поведение:
Если popper использует strategy: 'fixed', boundary
становится особенно важным:
createPopper(reference, popper, {
strategy: 'fixed',
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport',
},
},
],
});
Особенности:
Использование сложных boundary (особенно
clippingParents) может влиять на производительность:
Оптимизация:
clippingParentsДля диагностики:
Пример:
console.log(popperInstance.state.modifiersData);
clippingParents для стандартных
случаевviewport — для глобальных интерфейсовflip и
preventOverflowBoundary пересчитывается при:
Popper автоматически отслеживает эти изменения через встроенные механизмы наблюдения.
flip,
preventOverflow)Boundary является ключевым элементом системы позиционирования Popper.js, определяющим не только ограничения, но и поведение всех адаптивных механизмов библиотеки.