Tippy.js предоставляет гибкую систему анимаций всплывающих подсказок, позволяя задавать как готовые эффекты, так и собственные кастомные переходы. Анимации влияют на восприятие интерфейса и производительность, особенно при работе с большим количеством тултипов на странице.
По умолчанию Tippy.js использует анимацию shift-away.
Она обеспечивает плавное появление подсказки с небольшим смещением от
цели. Для изменения анимации используется параметр
animation при инициализации:
tippy('.btn', {
content: 'Подсказка',
animation: 'scale',
});
Доступные встроенные анимации:
fade — постепенное появление и исчезновение;scale — увеличение размера от центра;shift-away — смещение от цели с прозрачностью;shift-toward — смещение к цели;perspective — 3D-эффект при появлении.Для динамических интерфейсов с множеством тултипов рекомендуется
выбирать более лёгкие анимации, такие как fade или
scale, чтобы снизить нагрузку на GPU.
Tippy.js позволяет задавать время появления и исчезновения с помощью
параметров duration и delay. Они могут быть
указаны как число в миллисекундах или массив
[show, hide]:
tippy('.btn', {
content: 'Подсказка',
animation: 'fade',
duration: [200, 100], // 200ms на появление, 100ms на скрытие
delay: [100, 50], // 100ms задержка перед показом, 50ms перед скрытием
});
Короткие анимации делают интерфейс более отзывчивым, но слишком резкие переходы могут выглядеть дергано. Оптимальный баланс — 150–250 мс для появления и 50–150 мс для скрытия.
Для более сложных эффектов можно использовать параметр
animation: 'custom' и подключить собственные классы:
tippy('.btn', {
content: 'Подсказка',
animation: 'custom',
onCreate(instance) {
instance.popper.classList.add('my-custom-animation');
}
});
Пример CSS:
@keyframes myFadeIn {
from { opacity: 0; transform: translateY(-5px); }
to { opacity: 1; transform: translateY(0); }
}
.my-custom-animation[data-state='visible'] {
animation: myFadeIn 200ms ease-out forwards;
}
Такой подход позволяет полностью контролировать кривую анимации, направления движения и задержки.
Tippy.js автоматически использует CSS-трансформации для аппаратного
ускорения (transform: translate3d), что снижает нагрузку на
CPU и делает анимации плавными. Для повышения производительности:
top, left,
width, height в анимациях;opacity и transform;Интерактивные тултипы (interactive: true) требуют
особого внимания. Длительные анимации могут мешать пользователю кликнуть
внутри тултипа. Для таких элементов рекомендуется:
tippy('.interactive-btn', {
content: 'Интерактивная подсказка',
interactive: true,
animation: 'fade',
duration: [150, 50],
});
Короткое появление и быстрое скрытие обеспечивают комфортное взаимодействие.
При множестве подсказок на странице Tippy.js поддерживает ленивую
инициализацию (lazy: true), что уменьшает нагрузку на DOM и
ускоряет рендер:
tippy('.btn', {
content: 'Подсказка',
animation: 'scale',
lazy: true
});
Тултип создается только при первом наведении, а не при инициализации всех элементов. Это особенно полезно на страницах с сотнями интерактивных элементов.
Tippy.js позволяет менять анимацию на лету с помощью метода
setProps:
const tip = tippy('.btn', { content: 'Подсказка' });
tip[0].setProps({
animation: 'shift-away',
duration: 300
});
Это удобно для адаптивного интерфейса, где одни элементы требуют плавного увеличения, а другие — быстрого исчезновения.
popperOptionsTippy.js построен на Popper.js, и параметры позиционирования влияют на восприятие анимации. Для оптимизации:
flip с большим количеством вариантов при
короткой анимации;gpuAcceleration: true в
popperOptions для плавного смещения;offset для мелких корректировок положения
без перерасчета размеров тултипа.tippy('.btn', {
content: 'Подсказка',
animation: 'shift-away',
popperOptions: {
modifiers: [{ name: 'offset', options: { offset: [0, 8] } }],
strategy: 'fixed'
}
});
Правильное сочетание анимаций и параметров Popper.js позволяет создавать быстрые и отзывчивые интерфейсы с большим количеством подсказок без потери плавности.