Floating UI — это библиотека для управления позиционированием всплывающих элементов в веб-приложениях, таких как тултипы, дропдауны и модальные окна. Один из ключевых инструментов для настройки поведения и внешнего вида элементов — CSS переменные, которые позволяют динамически управлять стилями, не перезаписывая весь CSS и сохраняя гибкость для различных состояний интерфейса.
CSS переменные (custom properties) объявляются с префиксом
-- и доступны через объект style любого
HTML-элемента или через глобальные селекторы, например:
:root {
--tooltip-offset-x: 0px;
--tooltip-offset-y: 8px;
--tooltip-background: #333;
--tooltip-color: #fff;
}
Использование таких переменных позволяет легко изменять положение, цвет и другие свойства всплывающих элементов динамически через JavaScript, что идеально сочетается с Floating UI, где расчёт координат производится в реальном времени.
Floating UI предоставляет низкоуровневый API для расчёта позиции элемента относительно якоря. Пример базовой интеграции:
import { computePosition, offset, flip, shift } from '@floating-ui/dom';
const reference = document.querySelector('#button');
const floating = document.querySelector('#tooltip');
computePosition(reference, floating, {
middleware: [offset(8), flip(), shift({ padding: 5 })],
}).then(({ x, y }) => {
floating.style.setProperty('--tooltip-offset-x', `${x}px`);
floating.style.setProperty('--tooltip-offset-y', `${y}px`);
});
В этом примере координаты x и y
записываются в CSS переменные, которые затем могут использоваться в
стилях:
#tooltip {
position: absolute;
transform: translate(var(--tooltip-offset-x), var(--tooltip-offset-y));
background: var(--tooltip-background);
color: var(--tooltip-color);
padding: 6px 12px;
border-radius: 4px;
white-space: nowrap;
}
Преимущество такого подхода — отделение логики вычислений от стилей, что упрощает поддержку и изменение интерфейса.
CSS переменные легко менять в зависимости от состояния приложения или события пользователя. Например, изменение цвета фона при наведении:
floating.addEventListener('mouseenter', () => {
floating.style.setProperty('--tooltip-background', '#555');
});
floating.addEventListener('mouseleave', () => {
floating.style.setProperty('--tooltip-background', '#333');
});
Такая интеграция с Floating UI позволяет сохранять точность позиционирования и одновременно менять визуальные характеристики без пересчета позиции вручную, что особенно важно для сложных интерфейсов с анимацией.
CSS переменные отлично работают с анимациями и переходами. Например, плавное смещение тултипа:
#tooltip {
transition: transform 0.2s ease, opacity 0.2s ease;
opacity: 0;
}
#tooltip.show {
opacity: 1;
transform: translate(var(--tooltip-offset-x), var(--tooltip-offset-y));
}
В JavaScript можно управлять состоянием show и
координатами через Floating UI:
reference.addEventListener('mouseenter', async () => {
const { x, y } = await computePosition(reference, floating, {
middleware: [offset(10), flip(), shift({ padding: 5 })],
});
floating.style.setProperty('--tooltip-offset-x', `${x}px`);
floating.style.setProperty('--tooltip-offset-y', `${y}px`);
floating.classList.add('show');
});
reference.addEventListener('mouseleave', () => {
floating.classList.remove('show');
});
Такой подход обеспечивает плавность анимаций и точность позиционирования, сохраняя код чистым и удобным для расширения.
Floating UI поддерживает адаптивное позиционирование, когда тултип или меню автоматически подстраиваются под границы окна. Использование CSS переменных позволяет передавать эти значения напрямую в стили:
const updatePosition = async () => {
const { x, y, placement } = await computePosition(reference, floating, {
middleware: [offset(10), flip(), shift({ padding: 8 })],
});
floating.style.setProperty('--tooltip-offset-x', `${x}px`);
floating.style.setProperty('--tooltip-offset-y', `${y}px`);
floating.setAttribute('data-placement', placement);
};
И в CSS можно менять оформление в зависимости от позиции:
#tooltip[data-placement^='top'] {
border-bottom: 5px solid var(--tooltip-background);
}
#tooltip[data-placement^='bottom'] {
border-top: 5px solid var(--tooltip-background);
}
CSS переменные облегчают интеграцию Floating UI с системой тем. Например, можно менять цвета тултипов для светлой и тёмной темы без изменения логики позиционирования:
:root[data-theme='light'] {
--tooltip-background: #eee;
--tooltip-color: #222;
}
:root[data-theme='dark'] {
--tooltip-background: #333;
--tooltip-color: #fff;
}
JavaScript код для расчета позиции остаётся идентичным, а визуальная часть адаптируется автоматически через CSS переменные.
Использование CSS переменных с Floating UI позволяет:
Такой подход делает комбинацию Floating UI и CSS переменных мощным инструментом для современных интерфейсов с динамическими всплывающими элементами.