Библиотека Tippy.js предоставляет гибкую систему тем (themes), позволяющую полностью контролировать внешний вид всплывающих подсказок. Темы реализуются через CSS-классы и тесно связаны с архитектурой Popper-элемента, который Tippy использует для позиционирования.
Тема задаётся через параметр theme и автоматически
добавляет CSS-класс вида:
.tippy-box[data-theme~='имя-темы']
Это означает, что одна подсказка может использовать несколько тем одновременно.
По умолчанию Tippy использует светлую тему, которая визуально соответствует классическим tooltip-компонентам:
tippy('.btn', {
content: 'Подсказка',
theme: 'light'
});
Ключевые особенности светлой темы:
#fff)Пример базовой стилизации:
.tippy-box[data-theme~='light'] {
background-color: #ffffff;
color: #333;
box-shadow: 0 4px 14px rgba(0, 0, 0, 0.1);
}
Стрелка (arrow) также требует стилизации:
.tippy-box[data-theme~='light'][data-placement^='top'] > .tippy-arrow::before {
border-top-color: #ffffff;
}
Темная тема используется в интерфейсах с низкой освещённостью или в приложениях с dark mode:
tippy('.btn', {
content: 'Темная подсказка',
theme: 'dark'
});
Пример оформления:
.tippy-box[data-theme~='dark'] {
background-color: #1f2937;
color: #f9fafb;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5);
}
Стрелка:
.tippy-box[data-theme~='dark'][data-placement^='top'] > .tippy-arrow::before {
border-top-color: #1f2937;
}
Особенности:
На практике тема часто зависит от состояния интерфейса (например, системной темы пользователя или переключателя в приложении).
const instance = tippy('.btn', {
content: 'Подсказка',
theme: 'light'
});
// смена темы
instance.setProps({
theme: 'dark'
});
<body>const isDark = document.body.classList.contains('dark');
tippy('.btn', {
content: 'Подсказка',
theme: isDark ? 'dark' : 'light'
});
Tippy позволяет комбинировать темы:
tippy('.btn', {
content: 'Комбинированная тема',
theme: 'dark rounded'
});
CSS:
.tippy-box[data-theme~='rounded'] {
border-radius: 12px;
}
Комбинации позволяют:
Создание собственной темы — основной механизм кастомизации.
tippy('.btn', {
content: 'Своя тема',
theme: 'custom'
});
.tippy-box[data-theme~='custom'] {
background: linear-gradient(135deg, #6366f1, #8b5cf6);
color: white;
font-weight: 500;
}
Стрелка — отдельный элемент, требующий синхронизации с темой.
Структура:
<div class="tippy-box" data-theme="dark">
<div class="tippy-content"></div>
<div class="tippy-arrow"></div>
</div>
Стилизация зависит от направления:
/* сверху */
[data-placement^='top'] .tippy-arrow::before {
border-top-color: #1f2937;
}
/* снизу */
[data-placement^='bottom'] .tippy-arrow::before {
border-bottom-color: #1f2937;
}
Важно учитывать:
Современные интерфейсы часто используют media query:
@media (prefers-color-scheme: dark) {
.tippy-box[data-theme~='auto'] {
background-color: #111827;
color: #f3f4f6;
}
}
JS:
tippy('.btn', {
content: 'Авто тема',
theme: 'auto'
});
Для масштабируемых проектов удобнее использовать переменные:
:root {
--tooltip-bg: #ffffff;
--tooltip-color: #222;
}
.dark {
--tooltip-bg: #1f2937;
--tooltip-color: #f9fafb;
}
.tippy-box {
background-color: var(--tooltip-bg);
color: var(--tooltip-color);
}
Преимущества:
Темы могут влиять не только на цвета, но и на поведение:
.tippy-box[data-theme~='dark'] {
transition: transform 0.2s ease, opacity 0.2s ease;
}
Комбинация с параметром:
tippy('.btn', {
animation: 'scale',
theme: 'dark'
});
<Tippy content="Подсказка" theme={isDark ? 'dark' : 'light'}>
<button>Наведи</button>
</Tippy>
<tippy :content="'Подсказка'" :theme="isDark ? 'dark' : 'light'">
<button>Наведи</button>
</tippy>
Несоответствие стрелки и фона
::beforeКонфликт тем
Отсутствие контраста
Жёстко заданные цвета
/* светлая */
.tippy-box[data-theme~='light'] {
background: #fff;
color: #222;
}
/* тёмная */
.tippy-box[data-theme~='dark'] {
background: #111;
color: #eee;
}
/* скруглённая */
.tippy-box[data-theme~='rounded'] {
border-radius: 10px;
}
Комбинирование:
theme: 'dark rounded'
Tippy активно использует data-*:
.tippy-box[data-theme~='dark'][data-placement^='right'] {
margin-left: 8px;
}
Это позволяет:
Темы не влияют напрямую на производительность JS, но:
Оптимизация:
Рекомендуемая структура:
/styles
/tippy
base.css
light.css
dark.css
themes/
success.css
warning.css
Подключение:
theme: 'dark success'
Такой подход: