Floating UI — библиотека для управления позиционированием всплывающих элементов в JavaScript. Одной из ключевых задач при её использовании является обеспечение обратной совместимости при обновлении версий и работе с различными браузерами. Floating UI строится модульно: ядро и плагины разделены, что позволяет выбирать только необходимые части и снижать риск конфликтов при обновлениях.
Основные принципы обратной совместимости:
Сохранение API Floating UI придерживается
стабильного API для основных функций позиционирования
(computePosition, flip, shift,
offset). Обновления библиотеки стараются не нарушать
сигнатуры функций, чтобы существующий код не требовал изменений. При
добавлении новых параметров рекомендуется использовать
опциональные свойства конфигурации, которые не влияют
на старое поведение.
Модульность и замена плагинов Каждый плагин
Floating UI (например, flip, shift,
arrow) можно подключать отдельно. Если плагин изменяется,
стараются сохранить старые сигнатуры функций и поведение, обеспечивая
работу старых проектов без модификации кода.
Обработка устаревших свойств В библиотеке
предусмотрена поддержка устаревших свойств через deprecated
warnings в консоли. Например, при использовании старого
варианта опции placement: 'auto' библиотека может
предложить обновленный формат, но при этом старый код продолжит
работать.
Старый способ установки позиции:
import { computePosition, autoPlacement } from '@floating-ui/dom';
computePosition(referenceElement, floatingElement, {
middleware: [autoPlacement()]
}).then(({ x, y }) => {
Object.assign(floatingElement.style, {
left: `${x}px`,
top: `${y}px`
});
});
Новый способ с сохранением старого API:
import { computePosition, autoPlacement } from '@floating-ui/dom';
computePosition(referenceElement, floatingElement, {
middleware: [autoPlacement({ alignment: 'start' })]
}).then(({ x, y }) => {
Object.assign(floatingElement.style, { left: `${x}px`, top: `${y}px` });
});
В этом примере новое свойство alignment добавлено, но
существующий код без alignment продолжает работать
корректно.
Floating UI учитывает особенности работы CSS и DOM в старых браузерах:
strategy: 'fixed', автоматически применяется fallback на
absolute.touch events и размеры viewport, сохраняя
старое API для вычисления позиции и смещения.transform, contain и will-change
библиотека проверяет поддержку и использует полифиллы при
необходимости.Floating UI предоставляет механизм оберток для устаревших функций:
import { computePosition as oldComputePosition } from '@floating-ui/dom';
oldComputePosition(reference, floating, { middleware: [] })
.then(({ x, y }) => {
floating.style.transform = `translate(${x}px, ${y}px)`;
});
Такая обертка сохраняет старый метод transform, даже
если внутренние алгоритмы вычисления позиции изменились. Это позволяет
постепенно мигрировать код к новым подходам без полной переработки
существующих компонентов.
Версионирование Floating UI придерживается семантического версионирования. Патч-версии исправляют баги, минорные версии добавляют новые middleware, а мажорные версии могут включать изменения API. Старые версии middleware продолжают работать в новых релизах через адаптеры.
Middleware adapters Для обеспечения
совместимости с новыми версиями используются адаптеры, позволяющие
подключать старые middleware без изменения их кода. Например, адаптер
для flip обеспечивает работу старых конфигураций с новыми
вычислениями позиции.
Fallback-стратегии Для браузеров с ограниченной
поддержкой новых CSS-свойств используется fallback на простые вычисления
top/left без transform. Это обеспечивает стабильное
отображение всплывающих элементов на старых устройствах.
flip + shift +
offset продолжают работать после обновления
библиотеки.Обеспечение обратной совместимости в Floating UI сочетает строгую модульность, использование адаптеров и стратегий fallback, что позволяет проектам оставаться стабильными при обновлениях библиотеки и работе с разными браузерами.