Popper.js предоставляет набор утилитарных функций, которые упрощают работу с позиционированием элементов и вычислением координат. Они играют ключевую роль в создании кастомных решений поверх стандартного функционала библиотеки. Ниже рассмотрены основные функции и их применение.
getBoundingClientRect(element)Функция возвращает объект с координатами и размерами элемента
относительно видимой области окна
(viewport). Возвращаемый объект содержит свойства:
top, left, bottom,
right, width, height.
Применение:
import { getBoundingClientRect } from '@popperjs/core';
const element = document.querySelector('#tooltip');
const rect = getBoundingClientRect(element);
console.log(rect.top, rect.left, rect.width, rect.height);
Особенность: учитывает трансформации CSS, такие как
scale и rotate, что делает её точнее
стандартного element.getBoundingClientRect() в ряде
случаев.
getLayoutRect(element)Возвращает физические размеры элемента без учета
трансформаций CSS и прокрутки. Содержит свойства
x, y, width,
height.
Применение:
import { getLayoutRect } from '@popperjs/core';
const rect = getLayoutRect(element);
console.log(rect.width, rect.height);
Полезна при вычислении размеров, когда требуется чистая геометрия элемента.
orderModifiers(modifiers)Сортирует массив модификаторов в правильном порядке выполнения, учитывая их зависимости друг от друга.
Применение:
import { orderModifiers } from '@popperjs/core';
const modifiers = [
{ name: 'flip', phase: 'main', requires: ['preventOverflow'] },
{ name: 'preventOverflow', phase: 'main' }
];
const ordered = orderModifiers(modifiers);
console.log(ordered.map(mod => mod.name)); // ["preventOverflow", "flip"]
Используется при создании кастомных Popper-инстансов с модификаторами в специфическом порядке.
debounce(fn)Создает функцию с отложенным выполнением, предотвращая слишком частые вызовы, например, при изменении размера окна или скролле.
Применение:
import { debounce } from '@popperjs/core';
const updatePopper = () => console.log('Обновление позиции');
const debouncedUpdate = debounce(updatePopper, 100);
window.addEventListener('resize', debouncedUpdate);
Позволяет оптимизировать производительность при частых событиях.
getVariation(placement)Возвращает вариацию позиции, если она указана.
Например, для placement: 'top-start' вернет
'start'.
Применение:
import { getVariation } from '@popperjs/core';
const variation = getVariation('bottom-end');
console.log(variation); // "end"
Используется в модификаторах, когда необходимо обрабатывать вариации отдельно от основной позиции.
getOppositePlacement(placement)Возвращает противоположное положение относительно исходного.
Применение:
import { getOppositePlacement } from '@popperjs/core';
console.log(getOppositePlacement('top')); // "bottom"
console.log(getOppositePlacement('left-start')); // "right-start"
Ключевой инструмент для реализации логики flip в
кастомных модификаторах.
within(min, value, max)Функция ограничивает значение value в диапазоне
[min, max].
Применение:
import { within } from '@popperjs/core';
console.log(within(0, 150, 100)); // 100
console.log(within(0, -50, 100)); // 0
console.log(within(0, 50, 100)); // 50
Часто используется для предотвращения выхода всплывающих элементов за пределы контейнера.
mergeByName(modifiers)Объединяет массив модификаторов по имени, чтобы исключить дублирование и корректно объединить их опции.
Применение:
import { mergeByName } from '@popperjs/core';
const modifiers = [
{ name: 'offset', options: { offset: [0, 8] } },
{ name: 'offset', options: { offset: [0, 16] } }
];
const merged = mergeByName(modifiers);
console.log(merged); // [{ name: 'offset', options: { offset: [0, 16] } }]
Обеспечивает корректную работу пользовательских конфигураций с повторяющимися модификаторами.
detectOverflow(state, options)Вычисляет, насколько элемент выходит за пределы указанных границ
(boundary). Возвращает объект с величинами
top, bottom, left,
right.
Применение:
import { detectOverflow } from '@popperjs/core';
const overflow = detectOverflow({
state: popperState,
options: { boundary: document.body }
});
console.log(overflow.top, overflow.bottom);
Используется в модификаторах preventOverflow и
flip, а также при создании собственных ограничений
позиции.
computeOffsets({ reference, element, placement })Вычисляет смещение элемента относительно опорного
(reference) для конкретного placement.
Применение:
import { computeOffsets } from '@popperjs/core';
const offsets = computeOffsets({
reference: referenceRect,
element: elementRect,
placement: 'top'
});
console.log(offsets.x, offsets.y);
Фундаментальная функция для точного позиционирования при создании кастомных модификаторов.
getBoundingClientRect, getLayoutRect,
computeOffsetsorderModifiers, mergeByName,
getVariation, getOppositePlacementdebounce, withindetectOverflowЭти функции позволяют создавать сложные, динамически позиционируемые элементы, управлять их поведением и интегрировать Popper.js в кастомные интерфейсы, сохраняя высокую производительность и точность вычислений.