Middleware в Floating UI представляет собой функции, которые выполняются между вычислением позиции плавающего элемента и его фактическим рендерингом в DOM. Они позволяют модифицировать поведение позиционирования, корректировать координаты, управлять перекрытиями и обеспечивать адаптивность интерфейса. Middleware формирует цепочку обработки, через которую проходят все вычисленные значения позиции, прежде чем элемент будет отрисован на странице.
Основная идея заключается в том, что позиция не всегда может быть
определена одним вызовом computePosition. Различные
обстоятельства, такие как ограничение видимой области, наличие смещения,
размеры триггера и всплывающего элемента, требуют промежуточной
обработки. Именно здесь middleware проявляет себя как мощный инструмент
для тонкой настройки поведения.
Каждая функция middleware получает объект с текущей позицией и набором данных:
{
x: number, // текущая координата по горизонтали
y: number, // текущая координата по вертикали
placement: string, // выбранное начальное положение ('top', 'bottom', 'left', 'right')
strategy: string, // стратегия позиционирования ('absolute' или 'fixed')
elements: { reference: HTMLElement, floating: HTMLElement }, // DOM-элементы
rects: { reference: DOMRect, floating: DOMRect } // размеры элементов
}
Middleware может:
x и yplacementdata,
которые могут использовать другие middlewareКаждая функция middleware возвращает объект вида:
{
x?: number,
y?: number,
data?: any,
reset?: { placement?: string } | true
}
1. offset Позволяет задать смещение плавающего элемента относительно reference-элемента.
import { offset } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [offset(10)]
});
2. flip Обеспечивает автоматическую смену стороны, если элемент выходит за пределы видимой области.
import { flip } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [flip()]
});
3. shift Корректирует положение элемента, чтобы он не выходил за границы контейнера или окна.
import { shift } from '@floating-ui/dom';
computePosition(reference, floating, {
middleware: [shift({ padding: 5 })]
});
padding задаёт отступ от краёв.4. arrow Используется для позиционирования стрелки на всплывающем элементе, направленной на reference.
import { arrow } from '@floating-ui/dom';
const arrowElement = document.querySelector('.arrow');
computePosition(reference, floating, {
middleware: [arrow({ element: arrowElement })]
});
data для последующего
позиционирования DOM-элемента.Любая функция может стать middleware при соблюдении контракта:
function myMiddleware(options) {
return ({ x, y, rects, elements }) => {
const newX = x + 10; // смещаем элемент на 10px вправо
return { x: newX };
};
}
Особенности пользовательских middleware:
dataplacement или другие параметрыMiddleware выполняются строго по порядку, указанному в массиве
middleware. Каждый последующий получает уже обработанные
координаты и данные.
Пример цепочки:
middleware: [
offset(5),
flip(),
shift({ padding: 10 }),
arrow({ element: arrowEl })
]
Такой подход обеспечивает гибкость и предсказуемость.
Middleware делает Floating UI универсальным инструментом для создания динамических и интерактивных интерфейсов с точным управлением положением элементов.