Tippy.js предоставляет мощный инструмент для создания всплывающих подсказок и тултипов, однако для соответствия корпоративной или пользовательской дизайн-системе требуется тонкая настройка. Основная цель — обеспечить согласованность стилей, анимаций и поведения с уже существующими компонентами интерфейса.
Tippy.js использует концепцию тем, которые можно определять через CSS-классы. Для интеграции с дизайн-системой рекомендуется:
.tippy-custom {
background-color: var(--ds-tooltip-bg);
color: var(--ds-tooltip-color);
font-family: var(--ds-font-family);
font-size: var(--ds-font-size-sm);
border-radius: var(--ds-border-radius);
padding: var(--ds-spacing-2);
box-shadow: var(--ds-shadow-sm);
}
theme:tippy('.btn', {
content: 'Подсказка',
theme: 'custom'
});
Использование CSS-переменных позволяет динамически адаптировать подсказки к смене темы интерфейса.
Tippy.js поддерживает Popper.js под капотом, что даёт гибкость для точной подгонки позиции тултипа. В дизайн-системах важно соблюдение единых отступов и направления появления подсказок.
placement и
offset:tippy('.btn', {
content: 'Подсказка',
placement: 'top-start',
offset: [0, 8]
});
tippy('.btn', {
content: 'Подсказка',
placement: 'auto',
flip: true
});
Дизайн-системы часто регламентируют стиль анимации.
Tippy.js позволяет настроить анимацию через опцию animation
и CSS-классы:
tippy('.btn', {
content: 'Подсказка',
animation: 'shift-away',
duration: [200, 150]
});
.tippy-fade-custom {
transition: opacity 0.3s ease-in-out, transform 0.3s ease-in-out;
}
.tippy-fade-custom[data-state='hidden'] {
opacity: 0;
transform: translateY(-4px);
}
.tippy-fade-custom[data-state='visible'] {
opacity: 1;
transform: translateY(0);
}
tippy('.btn', {
content: 'Подсказка',
animation: 'fade-custom'
});
Для дизайн-систем важно, чтобы подсказки были одинаковыми по структуре:
tippy('.btn', {
content: `
<div class="tooltip-content">
<strong>Заголовок</strong>
<p>Описание действия кнопки</p>
</div>
`,
allowHTML: true
});
Tippy.js позволяет делать подсказки интерактивными, что важно для всплывающих окон с элементами управления:
interactive:tippy('.btn', {
content: '<button class="tooltip-btn">Действие</button>',
allowHTML: true,
interactive: true
});
tippy('.btn', {
content: 'Подсказка',
interactive: true,
hideOnClick: true
});
tippy('.btn', {
content: 'Подсказка',
trigger: 'mouseenter focus'
});
Для крупных интерфейсов дизайн-систем важна согласованная логика поведения подсказок:
const tooltips = tippy('.btn', { content: 'Подсказка' });
const instanceGroup = tooltips.map(t => t);
instanceGroup.forEach(t => t.show());
show(), hide(),
setContent():const tip = tippy('.btn', { content: 'Подсказка' })[0];
tip.show();
tip.setContent('Новый контент');
tip.hide();
Подсказки должны корректно отображаться на мобильных устройствах:
tippy('.btn', {
content: 'Подсказка',
placement: window.innerWidth < 768 ? 'bottom' : 'top'
});
.tooltip-content {
padding: var(--ds-spacing-3);
}
tippy('.btn', {
trigger: 'click'
});
Эти подходы обеспечивают плавную и бесшовную интеграцию Tippy.js в любую современную дизайн-систему, сохраняя консистентность интерфейса.