Tippy.js предоставляет мощные возможности для создания интерактивных подсказок (tooltip), которые автоматически подстраиваются под контент и положение на странице. Одним из ключевых аспектов является поддержка адаптивных стилей, позволяющих динамически изменять внешний вид всплывающих элементов в зависимости от контекста.
Для изменения визуального оформления подсказки используется параметр
theme или className. При этом Tippy.js
позволяет назначать несколько классов одновременно и
использовать CSS-переменные для динамического стиля.
tippy('#button', {
content: 'Подсказка с кастомным стилем',
theme: 'custom-theme',
onShow(instance) {
instance.popper.classList.add('dynamic-style');
}
});
theme — задаёт базовый стиль подсказки. Можно
определить несколько тем в CSS и переключать их динамически.onShow и onHidden позволяют добавлять или
убирать дополнительные классы в зависимости от состояния.Tippy.js автоматически рассчитывает размеры подсказки, но иногда необходимо задать динамическую ширину или максимальную высоту, чтобы подсказка не выходила за границы экрана.
tippy('#input', {
content: 'Подсказка с адаптивной шириной',
maxWidth: '300px',
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
padding: 10
}
}
]
}
});
maxWidth ограничивает ширину подсказки. Можно
использовать проценты (50%) или фиксированные пиксели.preventOverflow гарантирует, что подсказка не выйдет за
пределы окна браузера.Tippy.js использует Popper.js для позиционирования, что позволяет адаптировать стили в зависимости от стороны появления подсказки.
tippy('#icon', {
content: 'Tooltip с динамическим стилем',
onMount(instance) {
const placement = instance.props.placement;
if (placement.startsWith('top')) {
instance.popper.style.backgroundColor = '#f0f8ff';
} else if (placement.startsWith('bottom')) {
instance.popper.style.backgroundColor = '#ffe4e1';
}
}
});
instance.props.placement возвращает текущую позицию
подсказки (top, bottom, left,
right).Для сложных адаптивных интерфейсов удобно применять CSS-переменные. Tippy.js позволяет использовать их прямо в кастомной теме:
.tippy-box[data-theme~='dynamic'] {
background-color: var(--tooltip-bg, #333);
color: var(--tooltip-color, #fff);
font-size: var(--tooltip-font-size, 14px);
padding: var(--tooltip-padding, 8px 12px);
}
tippy('#link', {
content: 'Подсказка с переменными CSS',
theme: 'dynamic',
onShow(instance) {
instance.popper.style.setProperty('--tooltip-bg', '#4caf50');
instance.popper.style.setProperty('--tooltip-font-size', '16px');
}
});
Подсказка может динамически менять содержимое, и Tippy.js корректно подстраивает размеры и положение:
const tooltip = tippy('#dynamic', {
content: 'Начальный текст',
allowHTML: true
});
// Обновление текста через секунду
setTimeout(() => {
tooltip.setContent('Новый текст, более длинный и с <b>HTML</b>');
}, 1000);
setContent обновляет содержимое подсказки на лету.Для улучшения визуального восприятия адаптивных подсказок можно использовать анимации с динамическими параметрами:
tippy('#avatar', {
content: 'Tooltip с анимацией',
animation: 'shift-away',
onShow(instance) {
const width = instance.popper.offsetWidth;
instance.popper.style.transform = `scale(${Math.min(1, width/200)})`;
}
});
fade, shift-away,
scale) делают появление подсказки плавным.Для обеспечения корректного отображения на мобильных устройствах можно использовать медиазапросы в CSS вместе с кастомной темой:
@media (max-width: 600px) {
.tippy-box[data-theme~='responsive'] {
font-size: 12px;
padding: 6px 10px;
}
}
tippy('#button', {
content: 'Подсказка для мобильных',
theme: 'responsive'
});
maxWidth и preventOverflow
создаёт полностью адаптивное поведение подсказок.Использование этих подходов позволяет создавать подсказки, которые динамически подстраиваются под контент, положение и размер экрана, сохраняя удобочитаемость и визуальное соответствие дизайну страницы.