Tippy.js — это мощная библиотека для создания всплывающих подсказок и тултипов на веб-странице. Одной из её сильных сторон является гибкая работа со стилями через динамическую генерацию CSS, что позволяет создавать уникальные и адаптивные визуальные эффекты без необходимости ручного написания большого объёма стилей.
theme для динамических стилейКаждый тултип в Tippy.js может иметь собственную тему, определяемую
через опцию theme. Тема может быть как строкой с заранее
заданным классом, так и динамически формируемым значением.
tippy('.button', {
content: 'Динамический стиль',
theme: 'custom-theme',
});
Для динамической генерации темы часто используется шаблонное название:
const userTheme = 'user-' + Math.floor(Math.random() * 100);
tippy('.button', {
content: 'Пользовательская тема',
theme: userTheme
});
В CSS создаются соответствующие классы:
.tippy-box[data-theme~='user-42'] {
background-color: #f0ad4e;
color: white;
border-radius: 8px;
}
Такой подход позволяет создавать тысячи уникальных комбинаций стилей без изменения исходного кода библиотеки.
onShow и onMountTippy.js поддерживает колбэки жизненного цикла тултипа. Для
динамического изменения стилей можно использовать onShow и
onMount:
tippy('.button', {
content: 'Стили при показе',
onShow(instance) {
const randomColor = '#' + Math.floor(Math.random() * 16777215).toString(16);
instance.popper.style.backgroundColor = randomColor;
}
});
Здесь instance.popper позволяет напрямую изменять
DOM-элемент тултипа, включая цвета, размеры, тени и анимации. Такой
способ особенно полезен при создании интерактивных или
контекстно-зависимых подсказок.
Для более масштабируемого подхода рекомендуется использовать CSS-переменные. Это позволяет задавать динамические значения стилей через JavaScript, оставляя большую часть визуальной логики в CSS.
.tippy-box[data-theme~='dynamic'] {
background-color: var(--tooltip-bg, #333);
color: var(--tooltip-color, #fff);
border-radius: var(--tooltip-radius, 4px);
}
tippy('.button', {
content: 'CSS-переменные',
theme: 'dynamic',
onMount(instance) {
const color = '#' + Math.floor(Math.random() * 16777215).toString(16);
instance.popper.style.setProperty('--tooltip-bg', color);
}
});
Такой подход упрощает поддержку и расширение стилей, особенно когда требуется единая визуальная система для множества тултипов.
Tippy.js поддерживает встроенные анимации (fade,
scale, shift-away) и позволяет создавать
собственные через CSS. Для динамической генерации анимаций удобно
комбинировать классы и CSS-переменные:
.tippy-box[data-theme~='animated'] {
transition: transform var(--tooltip-duration, 300ms) ease-out,
opacity var(--tooltip-duration, 300ms) ease-out;
}
tippy('.button', {
content: 'Динамическая анимация',
theme: 'animated',
onShow(instance) {
const duration = Math.floor(Math.random() * 500) + 200 + 'ms';
instance.popper.style.setProperty('--tooltip-duration', duration);
}
});
Это позволяет каждой подсказке иметь уникальную скорость анимации, создавая более живой и адаптивный интерфейс.
popperProps для управления позиционированиемДинамические стили часто включают изменения не только визуальной
части, но и позиционирования. Через popperProps можно
изменять отступы, смещения и поведение тултипа:
tippy('.button', {
content: 'Смещение тултипа',
popperProps: {
modifiers: [
{
name: 'offset',
options: {
offset: [0, Math.floor(Math.random() * 50)]
}
}
]
}
});
Комбинируя позицию и стили, можно создавать подсказки, которые подстраиваются под динамическое содержимое страницы и пользовательские настройки.
Для сложных интерфейсов удобно создавать цветовые схемы динамически:
tippy('.button', {
content: 'Градиентный тултип',
onShow(instance) {
const startColor = '#' + Math.floor(Math.random() * 16777215).toString(16);
const endColor = '#' + Math.floor(Math.random() * 16777215).toString(16);
instance.popper.style.background = `linear-gradient(45deg, ${startColor}, ${endColor})`;
}
});
Градиенты можно комбинировать с CSS-переменными для изменения направления, угла и прозрачности, обеспечивая полную свободу дизайна без необходимости создавать десятки статических классов.
Помимо визуальных стилей, Tippy.js поддерживает функцию
content для генерации содержимого, которое может влиять на
размеры и оформление тултипа:
tippy('.button', {
content(reference) {
const width = reference.offsetWidth * 1.5;
return `<div style="width:${width}px; text-align:center;">Динамический контент</div>`;
},
allowHTML: true
});
Это позволяет создавать адаптивные подсказки, ширина и оформление которых зависят от целевого элемента.
Использование динамической генерации стилей в Tippy.js обеспечивает полный контроль над визуальной частью подсказок, позволяя создавать интерактивные, уникальные и адаптивные интерфейсы без излишней зависимости от статического CSS. Комбинация тем, CSS-переменных, колбэков жизненного цикла и Popper.js модификаторов делает библиотеку гибкой и мощной в работе с современными веб-приложениями.