Модификатор offset в библиотеке Popper.js отвечает за
смещение всплывающего элемента (popper) относительно опорного элемента
(reference). В отличие от базового позиционирования, где popper строго
следует вычисленной геометрии, offset позволяет тонко
управлять расстоянием и положением, создавая визуально более корректные
и удобные интерфейсы.
Функциональная форма offset предоставляет максимальную
гибкость, позволяя вычислять смещение динамически на основе текущего
состояния — размеров элементов, выбранного размещения
(placement) и других параметров.
Смещение задаётся в виде двух значений:
Пример статического offset:
{
name: 'offset',
options: {
offset: [0, 10]
}
}
В этом случае popper будет отодвинут на 10 пикселей от reference.
offset: динамическое вычислениеФункциональный вариант позволяет передать не массив, а функцию:
{
name: 'offset',
options: {
offset: ({ placement, reference, popper }) => {
return [skidding, distance];
}
}
}
Функция получает объект с параметрами:
top,
bottom-start и т.д.)offset: ({ placement, reference, popper }) => {
console.log(placement);
console.log(reference.width, reference.height);
console.log(popper.width, popper.height);
return [0, 8];
}
Объекты reference и popper содержат:
Это позволяет учитывать реальные размеры элементов при вычислении смещения.
offset: ({ placement }) => {
if (placement.startsWith('top')) {
return [0, 12];
}
if (placement.startsWith('bottom')) {
return [0, 6];
}
return [0, 8];
}
Такой подход полезен, когда визуальное расстояние должно отличаться в зависимости от направления.
offset: ({ popper }) => {
return [0, popper.height / 2];
}
Используется для центрирования или создания адаптивного отступа.
offset: ({ reference }) => {
return [reference.width / 4, 10];
}
Позволяет смещать popper относительно ширины якорного элемента.
offset: ({ placement, reference }) => {
const isWide = reference.width > 200;
if (isWide) {
return [10, 20];
}
return [0, 8];
}
Применяется при адаптивных интерфейсах.
Направление смещения зависит от placement:
| Placement | Основная ось | Перпендикулярная ось |
|---|---|---|
| top / bottom | X | Y |
| left / right | Y | X |
Пример:
offset: ({ placement }) => {
if (placement === 'left') {
return [10, 0]; // сдвиг по вертикали
}
return [0, 10]; // сдвиг по вертикали вниз
}
offset часто используется вместе с:
flip — для изменения стороны при нехватке местаpreventOverflow — чтобы popper не выходил за
границыarrow — для позиционирования стрелкиПорядок модификаторов влияет на итоговый результат, поэтому
offset обычно располагается после базовых вычислений, но до
визуальных корректировок.
1. Игнорирование placement
offset: () => [0, 10]
Фиксированное значение может выглядеть некорректно при смене позиции.
2. Неправильное понимание осей
Попытка смещать по X при вертикальном placement может привести к неожиданным результатам.
3. Использование тяжёлых вычислений
Функция вызывается часто, поэтому сложные операции могут повлиять на производительность.
placementoffset: ({ reference }) => {
const isMobile = window.innerWidth < 768;
return isMobile ? [0, 4] : [0, 12];
}
В сочетании с библиотеками интерфейсов (например, Bootstrap, Material
UI) функциональный offset позволяет:
offset: ({ popper }) => {
return [0, popper.height / 2 - 5];
}
Используется для точного выравнивания стрелки относительно центра.
Popper.js использует собственную систему координат, основанную на:
Функциональный offset применяется после вычисления
базовой позиции, что делает его финальным этапом корректировки.
placement)flip,
preventOverflow)offsetФункциональный offset становится ключевым инструментом
для точной настройки поведения popper-элементов, особенно в сложных и
динамических интерфейсах.