В библиотеке Floating UI Tree-структуры применяются для управления вложенными элементами интерфейса, такими как многоуровневые меню, всплывающие панели или тултипы, которые могут иметь зависимые позиции друг от друга. Tree-структура позволяет эффективно вычислять положения элементов относительно их родителей и учитывать ограничения по видимости, смещению и коллизиям.
Ключевые компоненты Tree:
Создание дерева начинается с инициализации корневого узла. Для этого
используется функция createFloatingTree():
import { createFloatingTree, createFloating } from '@floating-ui/dom';
const tree = createFloatingTree();
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
const { x, y, update } = createFloating({
reference,
floating,
strategy: 'absolute',
middleware: [],
whileElementsMounted: tree.addNode
});
Пояснение:
tree.addNode регистрирует текущий floating-узел в
дереве.whileElementsMounted следит за жизненным циклом
DOM-элементов и обновляет позиции автоматически при изменениях.Дочерние узлы получают позицию относительно своего родителя. Это особенно важно для многоуровневых меню:
const parentNode = createFloating({ reference: parentButton });
const childNode = createFloating({ reference: childButton });
tree.addNode(parentNode);
tree.addNode(childNode, parentNode);
Особенности:
childNode) наследует ограничения по
смещению и коллизии от parentNode.Floating UI использует middleware для управления поведением узлов в дереве. Ключевые middleware, которые работают с Tree:
offset() – добавляет смещение между узлом и
родителем.flip() – меняет положение узла при пересечении границ
видимой области.shift() – корректирует позицию, чтобы элемент оставался
в пределах видимости.size() – автоматически подбирает размеры дочерних
узлов, учитывая ограничения родителя.Пример применения:
import { offset, flip, shift } from '@floating-ui/dom';
createFloating({
reference: childButton,
floating: childTooltip,
middleware: [
offset(8),
flip(),
shift({ padding: 5 })
],
whileElementsMounted: tree.addNode
});
Tree-структура обеспечивает автоматическое удаление узлов при удалении DOM-элементов:
const { destroy } = createFloating({
reference,
floating,
whileElementsMounted: tree.addNode
});
// При необходимости удаления узла
destroy();
Преимущества:
Tree-структуры позволяют синхронизировать анимации всплывающих
элементов. Использование whileElementsMounted
позволяет:
Пример с использованием CSS-переходов:
const node = createFloating({
reference,
floating,
whileElementsMounted: tree.addNode
});
node.update(); // вычисление позиции перед запуском анимации
floating.style.transition = 'opacity 0.2s ease';
floating.style.opacity = '1';
whileElementsMounted для автоматического
контроля узлов и предотвращения утечек памяти.autoUpdate() для пересчёта позиций.Tree-структуры в Floating UI позволяют строить:
Эффективное использование Tree обеспечивает согласованное и плавное позиционирование всех элементов, сокращает количество ручных вычислений и упрощает поддержку сложных интерфейсов.