Понятие boundary

В контексте библиотеки Popper.js термин boundary относится к области, ограничивающей позиционирование всплывающего элемента (popper). Эта область определяет, до каких границ popper может «выходить», и используется для предотвращения наложения на другие элементы страницы или выхода за пределы видимой области.

boundary является ключевым параметром при работе с модификатором preventOverflow, который отвечает за удержание popper внутри допустимой зоны. Понимание работы boundary позволяет точно контролировать поведение всплывающих подсказок, дропдаунов и тултипов.


Типы значений boundary

Popper.js поддерживает несколько вариантов задания boundary:

  1. clippingParents (по умолчанию) Использует ближайших родителей элемента, которые обрезают overflow, в качестве границ. Это гарантирует, что popper не выйдет за видимую область контейнеров с ограниченной прокруткой.

  2. viewport Ограничивает popper видимой областью окна браузера. Это полезно для элементов, которые должны оставаться полностью видимыми на экране независимо от родительских контейнеров.

  3. window Подобно viewport, но учитывает весь размер окна документа, включая прокрутку. Используется реже, чаще для полных страниц с фиксированными элементами.

  4. Элемент DOM Можно указать конкретный элемент, например document.querySelector('#container'). В этом случае popper не будет выходить за границы указанного элемента.


Использование boundary с модификатором preventOverflow

Модификатор preventOverflow обеспечивает автоматическое корректирование позиции popper, если он выходит за границы boundary. Пример конфигурации:

const popperInstance = Popper.createPopper(referenceElement, popperElement, {
  modifiers: [
    {
      name: 'preventOverflow',
      options: {
        boundary: 'viewport', // ограничения относительно видимой области
        padding: 8,           // отступ от границы
      },
    },
  ],
});

Ключевые моменты:

  • padding задаёт расстояние между popper и границей, предотвращая слипание с краем.
  • boundary может быть массивом элементов, если нужно учитывать несколько зон.

Особенности работы

  1. Реакция на прокрутку и изменение размеров Popper пересчитывает позицию при изменении размеров окна или прокрутке, учитывая границы boundary. Это обеспечивает стабильное отображение элементов, не выходящих за отведённое пространство.

  2. Приоритет по осям Модификатор preventOverflow учитывает оси mainAxis и altAxis. При конфликте с границей, popper сначала корректирует основную ось, затем второстепенную.

  3. Взаимодействие с flip Модификатор flip может менять ориентацию popper для соблюдения границ boundary. Например, если тултип не помещается справа, он автоматически перемещается влево.


Советы по использованию

  • Для элементов внутри сложных контейнеров лучше использовать clippingParents, чтобы popper не «вылезал» за пределы родительских блоков.
  • Для глобальных тултипов и модальных окон предпочтителен viewport или конкретный контейнер, если нужно строгое ограничение.
  • Всегда задавать padding, чтобы избежать наложения popper на границы и соседние элементы.

Визуализация границ

Можно визуально проверить границы boundary с помощью небольшого CSS:

.boundary-test {
  outline: 2px dashed red;
}

Присвоив этот класс родительскому элементу или viewport, можно убедиться, что popper корректно остаётся внутри зоны.


Примечания

  • Если boundary задан неправильно (например, элемент не существует в DOM), popper может выйти за пределы видимой области.
  • Множественные boundaries применяются только к модификатору preventOverflow, другие модификаторы их игнорируют.
  • boundary тесно связан с вычислением rect popper и reference. Понимание структуры DOM и overflow контейнеров критично для точного позиционирования.