Tippy.js — мощная библиотека для создания всплывающих подсказок, которая позволяет гибко управлять не только внешним видом и поведением тултипов, но и их количеством на странице. Контроль числа активных экземпляров важен при работе с динамическим контентом, большим количеством элементов и при оптимизации производительности.
Каждый вызов функции tippy() возвращает массив
экземпляров (instances), соответствующих выбранным элементам:
const buttons = document.querySelectorAll('.btn');
const tippyInstances = tippy(buttons, {
content: 'Подсказка',
placement: 'top'
});
Ключевые моменты:
tippyInstances — это массив объектов Tippy, каждый из
которых содержит методы управления тултипом (show(),
hide(), destroy(), setContent() и
другие).По умолчанию все тултипы на странице могут быть открыты одновременно.
Чтобы ограничить число активных подсказок, используют опцию
singleton или вручную управляют событиями
onShow/onHide.
const tooltips = tippy('.btn', {
content: 'Подсказка',
placement: 'bottom'
});
const singleton = tippy.createSingleton(tooltips, {
delay: 100,
moveTransition: 'transform 0.2s ease-out'
});
Особенности createSingleton:
delay и анимацию для всей группы.Для более тонкого контроля можно управлять экземплярами через события:
const instances = tippy('.btn', {
content: 'Подсказка',
trigger: 'click',
onShow(instance) {
instances.forEach(i => {
if (i !== instance) i.hide();
});
}
});
Пояснения:
onShow позволяет скрывать все тултипы кроме
текущего.click,
mouseenter, focus).Для управления памятью и производительностью необходимо уничтожать ненужные экземпляры:
instances.forEach(instance => instance.destroy());
Важно:
destroy() удаляет тултип из DOM и отключает все
слушатели событий.destroy() объект экземпляра больше не
работает.При работе с элементами, добавленными через JS, создаются новые экземпляры:
const container = document.getElementById('container');
container.addEventListener('click', () => {
const newButton = document.createElement('button');
newButton.textContent = 'Новая кнопка';
container.appendChild(newButton);
const newTippy = tippy(newButton, { content: 'Новая подсказка' });
});
Рекомендации:
destroy()
на всех экземплярах массива.Чтобы избежать создания лишних тултипов, можно использовать ленивую инициализацию:
document.querySelectorAll('.btn').forEach(button => {
let instance = null;
button.addEventListener('mouseenter', () => {
if (!instance) {
instance = tippy(button, { content: 'Подсказка' });
instance.show();
}
});
});
Плюсы ленивой инициализации:
createSingleton.singleton, либо через
onShow/onHide.Эти методы позволяют контролировать количество тултипов, минимизировать утечки памяти и поддерживать отзывчивость интерфейса на больших страницах с множеством интерактивных элементов.