autoUpdate — это утилита библиотеки Floating UI,
предназначенная для автоматического обновления позиции всплывающих
элементов (флоатов) в ответ на изменения в DOM, размеры окна или скролл.
Она является ключевым инструментом при создании динамических
интерфейсов, где положение элементов должно корректироваться без ручного
вмешательства.
autoUpdate управляет динамическим пересчётом
позиции элемента. Она принимает следующие параметры:
autoUpdate(reference, floating, update, options?)
Возвращает функцию stop, которую можно вызвать для прекращения автоматического обновления.
Базовый пример автоматического обновления позиции:
import { autoUpdate, computePosition } from '@floating-ui/dom';
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
const cleanup = autoUpdate(reference, floating, () => {
computePosition(reference, floating, {
placement: 'top'
}).then(({ x, y }) => {
Object.assign(floating.style, {
left: `${x}px`,
top: `${y}px`
});
});
});
// В случае необходимости остановки:
cleanup();
В этом примере autoUpdate следит за изменениями размера
окна, скролла и DOM, и при каждом событии вызывает функцию
update, где пересчитывается позиция с помощью
computePosition.
autoUpdateУтилита поддерживает объект options с настройками:
true) —
отслеживает изменение размеров родительских элементов.true) —
отслеживает изменение размеров самого floating-элемента.true) —
реагирует на сдвиги макета (например, добавление контента выше).true) —
обновление на каждом кадре анимации для плавных трансформаций.Пример:
autoUpdate(reference, floating, update, {
ancestorResize: true,
elementResize: false,
layoutShift: true,
animationFrame: false
});
autoUpdate создаёт подписки на множество событий:
resize, scroll, MutationObserver. При большом
количестве floating-элементов это может влиять на производительность.
Для оптимизации:
Выключать ненужные опции:
elementResize: false.layoutShift: false.Использовать animationFrame
выборочно:
Останавливать обновления при скрытии элемента:
const cleanup = autoUpdate(reference, floating, update);
// Скрытие элемента
floating.style.display = 'none';
cleanup(); // освобождение ресурсовautoUpdate идеально подходит для:
Комбинация с computePosition позволяет точно управлять
placement, offset,
shift, flip и другими middleware
Floating UI:
autoUpdate(reference, floating, () => {
computePosition(reference, floating, {
placement: 'bottom',
middleware: [
offset(10),
flip(),
shift({ padding: 5 })
]
}).then(({ x, y }) => {
Object.assign(floating.style, { left: `${x}px`, top: `${y}px` });
});
});
autoUpdate не сохраняет предыдущие
позиции — каждый вызов update полностью
пересчитывает координаты.autoUpdate является ядром динамического позиционирования
в Floating UI, обеспечивая надёжное и эффективное обновление
координат для любых интерактивных элементов. Правильное
использование опций позволяет балансировать между точностью
позиционирования и производительностью, особенно в сложных интерфейсах с
множеством всплывающих элементов.