Утилита detectOverflow является одной из ключевых
функций библиотеки Popper.js, предназначенной для вычисления возможного
выхода всплывающих элементов за пределы видимой области или контейнера.
Она используется внутри механизмов позиционирования Popper для
реализации корректной логики предотвращения перекрытий, ограничения
выхода за границы и автоматического выбора подходящей позиции для
поппера.
Функция detectOverflow вычисляет, на сколько каждый край
поппера выходит за границы определённого контейнера. Контейнером может
быть viewport, scrollParent,
window, либо кастомный элемент, который задается через
опцию boundary. Результатом работы утилиты является объект
с четырьмя свойствами:
top — отрицательное значение указывает, на сколько
пикселей верхняя граница поппера выходит за пределы контейнера.bottom — отрицательное значение указывает, на сколько
пикселей нижняя граница выходит за пределы.left — аналогично для левой стороны.right — аналогично для правой стороны.Если значение свойства положительное или равно нулю, это означает, что поппер полностью помещается в пределах соответствующей границы.
import { detectOverflow } from '@popperjs/core';
const overflow = detectOverflow(state, options);
state — объект состояния поппера, содержащий информацию о позиционировании, размере поппера и ссылки на элементы.
options — объект с дополнительными параметрами:
boundary — элемент или строка
('clippingParents', 'viewport',
'window'), определяющая границы, внутри которых происходит
проверка.rootBoundary — верхний уровень границ
('viewport' или 'document').padding — число или объект, добавляющий отступ вокруг
границ для более мягкой проверки.Пример использования с настройкой отступа:
const overflow = detectOverflow(state, {
boundary: 'viewport',
padding: 8
});
В результате будет получен объект вида:
{
top: -10,
bottom: 5,
left: 0,
right: -20
}
Это означает, что верхняя и правая границы поппера выходят за контейнер, а нижняя и левая полностью помещаются.
padding и их
назначениеПараметр padding позволяет учитывать отступы внутри
границ, что особенно важно при динамических интерфейсах. Он может
задаваться как:
padding: {
top: 10,
right: 5,
bottom: 15,
left: 5
}
Отступ уменьшает пространство, доступное для поппера, и увеличивает значение отрицательного overflow, если поппер близок к краю.
detectOverflow для модификаторовНаиболее часто detectOverflow применяется внутри
модификаторов Popper.js:
Пример интеграции с модификатором preventOverflow:
import { createPopper } from '@popperjs/core';
const popperInstance = createPopper(reference, popper, {
modifiers: [
{
name: 'preventOverflow',
options: {
padding: 10,
boundary: 'viewport'
}
}
]
});
Внутри preventOverflow Popper вызывает
detectOverflow для определения, на какие стороны нужно
скорректировать позицию поппера.
Комбинация boundary и
rootBoundary Позволяет точно контролировать
поведение поппера внутри вложенных контейнеров с различными
scrollParent.
Использование с пользовательскими контейнерами Можно передавать любой DOM-элемент в качестве границы, чтобы ограничить поппер в пределах конкретного блока:
const container = document.querySelector('#custom-container');
const overflow = detectOverflow(state, {
boundary: container,
padding: 12
});
detectOverflow можно вызывать вручную для вычисления
текущего состояния поппера после изменения размера окна или
контента.padding, если интерфейс имеет
визуальные границы или рамки.boundary: 'clippingParents' для автоматического учёта
родительских элементов с overflow.detectOverflow для
динамического добавления классов, анимаций и смещений, чтобы поппер
выглядел естественно при ограниченных пространствах.detectOverflow является фундаментальным инструментом в
Popper.js, обеспечивающим точное позиционирование и предотвращение
визуальных ошибок при выходе всплывающих элементов за пределы
контейнеров. Она предоставляет полный контроль над пространством вокруг
поппера и позволяет создавать адаптивные и безопасные интерфейсы.