Floating UI предоставляет мощный набор инструментов для позиционирования всплывающих элементов, таких как тултипы, модальные окна, dropdown’ы и popover’ы. Одним из ключевых преимуществ библиотеки является система middleware, которая позволяет изменять поведение позиционирования и управлять различными аспектами отображения элементов без переписывания логики с нуля.
Middleware в Floating UI — это функции, которые принимают объект состояния позиции и возвращают модифицированный результат. Каждый middleware может корректировать координаты, проверять коллизии с границами, изменять смещения или применять пользовательские ограничения.
Каждый middleware имеет стандартный интерфейс:
function middlewareFunction({ x, y, placement, rects, middlewareData }) {
// Логика изменения координат или данных
return {
x: newX,
y: newY,
data: { custom: value }
};
}
Ключевые параметры:
reference и
floating элементов.Возвращаемое значение может содержать новые координаты и дополнительные данные, которые будут переданы следующим middleware.
const shiftMiddleware = ({ x, y, rects }) => {
const overflowX = rects.reference.right - rects.floating.right;
return { x: x + overflowX, y };
};
Возврат стандартного формата Чтобы middleware
можно было комбинировать, каждая функция должна возвращать объект с
полями x, y и data. Это
обеспечивает совместимость с другими middleware и корректное накопление
изменений.
Использование параметров конфигурации Создание фабрики middleware позволяет настраивать поведение через параметры, сохраняя возможность переиспользования.
function createOffsetMiddleware(offset) {
return ({ x, y, placement }) => {
if (placement.startsWith('top')) return { x, y: y - offset };
if (placement.startsWith('bottom')) return { x, y: y + offset };
return { x: x + offset, y };
};
}
const offset10 = createOffsetMiddleware(10);
import { computePosition, offset, flip, shift } from '@floating-ui/dom';
computePosition(referenceElement, floatingElement, {
middleware: [offset10, flip(), shift({ padding: 5 })],
});
middlewareData позволяет middleware взаимодействовать друг
с другом без жёсткой связи. Например, один middleware может вычислять
смещение и передавать его следующему для дополнительной
корректировки.const logMiddleware = ({ x, y, middlewareData }) => {
console.log('Current coords:', x, y);
return { x, y, data: { logged: true } };
};
Переиспользуемое смещение – часто требуется одинаковый отступ от границ reference элемента. Создание middleware с параметром offset позволяет использовать его в любых компонентах.
Умное изменение направления – middleware flip проверяет доступное пространство и изменяет направление позиции. Его можно комбинировать с кастомными middleware для более сложной логики.
Анимация и задержка – middleware может добавлять вычисляемые значения для анимации, например, передавать координаты предыдущего кадра для плавного смещения.
/middleware
offset.js
flip.js
shift.js
/components
Tooltip.js
Dropdown.js
Каждый компонент импортирует только необходимые middleware,
комбинирует их и передает в computePosition. Это снижает
дублирование кода и делает систему позиционирования модульной и
масштабируемой.
Переиспользование middleware позволяет создавать гибкие, расширяемые и предсказуемые системы позиционирования, где каждая функция решает одну конкретную задачу и может применяться в любых контекстах без изменений.