Floating UI предоставляет гибкий способ позиционирования всплывающих элементов относительно целевых узлов на странице. Одним из ключевых аспектов управления расположением является ориентация экрана — способность корректно адаптировать позицию всплывающего элемента в зависимости от видимой области (viewport) и ориентации устройства.
Ориентация экрана влияет на то, как элемент отображается на различных устройствах:
Floating UI позволяет динамически учитывать эти параметры через
встроенные механизмы middleware, которые адаптируют позицию
при изменении размеров окна или повороте устройства.
Основные middleware, влияющие на ориентацию и позиционирование:
flip
placement (top,
bottom, left, right) и
автоматически подстраивается под текущую ориентацию.import { computePosition, flip } from '@floating-ui/dom';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
computePosition(button, tooltip, {
placement: 'bottom',
middleware: [flip()],
}).then(({ x, y }) => {
Object.assign(tooltip.style, {
left: `${x}px`,
top: `${y}px`,
});
});
В портретной ориентации элемент может автоматически переместиться вверх, если снизу нет места.
shift
mainAxis и
crossAxis.import { shift } from '@floating-ui/dom';
computePosition(button, tooltip, {
placement: 'top',
middleware: [shift({ padding: 8 })],
});autoPlacement
flip и shift, автоматически
выбирая оптимальное место для элемента.import { autoPlacement } from '@floating-ui/dom';
computePosition(button, tooltip, {
middleware: [autoPlacement()],
});Для динамического реагирования на поворот экрана необходимо
использовать события resize или
orientationchange. После изменения ориентации следует
пересчитывать позицию элемента:
window.addEventListener('resize', () => {
computePosition(button, tooltip, {
placement: 'bottom',
middleware: [flip(), shift({ padding: 5 })],
}).then(({ x, y }) => {
Object.assign(tooltip.style, {
left: `${x}px`,
top: `${y}px`,
});
});
});
Floating UI поддерживает boundary — элемент или область, за пределы которой всплывающий элемент не должен выходить. Это особенно важно для мобильных устройств с ограниченной шириной:
import { offset, flip, shift } from '@floating-ui/dom';
computePosition(button, tooltip, {
placement: 'top',
middleware: [
offset(10),
flip({ boundary: document.body }),
shift({ boundary: document.body, padding: 5 })
],
});
resize или
orientationchange, чтобы корректно пересчитывать
координаты.Для разных типов устройств и ориентаций можно использовать разные комбинации middleware:
shift({ padding: 8 }), flip().autoPlacement({ allowedPlacements: ['top', 'bottom'] }).placement без shift, если место достаточно.Floating UI позволяет гибко управлять положением элементов, обеспечивая их корректное отображение при любых изменениях ориентации и размера экрана. Это делает библиотеку идеальной для адаптивных интерфейсов, где важно сохранить видимость и удобство взаимодействия вне зависимости от устройства.