Модификатор shift в библиотеке Floating
UI отвечает за корректировку позиции всплывающих элементов (tooltip,
dropdown, popover) в пределах заданного контейнера
ограничения (boundary). Его основная задача —
сместить элемент, если он выходит за границы видимой области, чтобы
пользователь видел весь контент без обрезки.
Padding — это дополнительное пространство между границей контейнера и самим всплывающим элементом. Использование padding обеспечивает визуальный отступ, предотвращает прижатие элемента к краю окна или контейнера.
import { offset, shift, autoUpdate, computePosition } from '@floating-ui/dom';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
computePosition(button, tooltip, {
middleware: [
offset(8),
shift({ padding: 10 }) // добавляем padding
],
}).then(({ x, y }) => {
Object.assign(tooltip.style, {
left: `${x}px`,
top: `${y}px`,
});
});
В этом примере padding: 10 гарантирует,
что всплывающее окно никогда не окажется ближе чем на 10 пикселей к
границам контейнера, определённого библиотекой как
viewport по умолчанию.
padding в shift может быть задан
несколькими способами:
shift({ padding: 12 })
Добавляет 12 пикселей ко всем границам контейнера.
shift({
padding: { top: 5, right: 10, bottom: 15, left: 20 }
})
top — верхний отступright — правыйbottom — нижнийleft — левыйТакой подход удобен, если требуется сместить элемент ближе к одной границе, но оставить отступ у другой.
Padding напрямую влияет на расчёт позиции всплывающего элемента:
Floating UI использует геометрические вычисления,
где padding добавляется к ограничениям контейнера, корректируя
координаты x и y.
Padding в shift часто комбинируется с другими middleware
для более точного позиционирования:
offset — добавляет расстояние между
целевым элементом и всплывающим элементом:middleware: [offset(5), shift({ padding: 10 })]
Сначала применяется смещение (offset), затем проверяется
граница с учётом padding.
flip — позволяет перевернуть позицию,
если элемент не помещается в текущей ориентации:middleware: [shift({ padding: 8 }), flip()]
Padding гарантирует, что при перевороте элемент не упрётся в край окна слишком близко.
autoPlacement — автоматически выбирает
лучшую позицию:middleware: [shift({ padding: { top: 10, left: 5 } }), autoPlacement()]
Объектные значения padding помогают Fine-tune расположение, особенно при сложных layout с разными ограничениями по сторонам.
flip и offset для
надёжного позиционирования в сложных интерфейсах.offset или другие middleware.computePosition(reference, floating, {
middleware: [
offset(12),
shift({ padding: { top: 8, bottom: 20, left: 10, right: 10 } }),
flip({ fallbackPlacements: ['top', 'right', 'bottom', 'left'] })
],
}).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`,
});
});
Здесь всплывающее окно сначала смещается на 12px
(offset), затем проверяется, не выходит ли за границы с
учётом padding, и при необходимости меняет сторону (flip).
Такой подход обеспечивает точное и предсказуемое позиционирование
элементов интерфейса.
Padding в shift — ключевой инструмент для аккуратного и
безопасного позиционирования элементов в интерфейсе, особенно когда
важно соблюсти визуальные границы и не допустить наложений на края
окна.