Tippy.js предоставляет мощный инструмент для создания интерактивных всплывающих подсказок (tooltip) и поповеров с полной кастомизацией. Одной из ключевых возможностей библиотеки является работа с группами всплывающих элементов, что позволяет синхронизировать их поведение и управлять ими централизованно.
Группы в Tippy.js создаются с помощью функции
createSingleton. Она позволяет объединить несколько
экземпляров Tippy в единый объект, который управляет их поведением.
Типичная структура выглядит так:
import tippy, { createSingleton } from 'tippy.js';
const tooltips = tippy('.tooltip', {
content: 'Пример подсказки',
animation: 'scale',
delay: [100, 200],
});
const singleton = createSingleton(tooltips, {
delay: 0,
moveTransition: 'transform 0.2s ease-out',
});
Ключевые моменты:
tippy('.tooltip', {...}) создаёт массив экземпляров для
каждого элемента с классом .tooltip.createSingleton(tooltips, options) объединяет их в одну
группу.delay в createSingleton задаёт
задержку для всей группы, переопределяя индивидуальные настройки.С помощью singleton можно управлять открытием и закрытием всех тултипов одновременно:
singleton.show(); // открывает текущий активный тултип
singleton.hide(); // скрывает все тултипы группы
singleton.setProps({ animation: 'fade' }); // меняет свойства для всех тултипов в группе
Важно помнить, что singleton не дублирует события на каждый элемент, а управляет только активным экземпляром. Если требуется взаимодействие с конкретным элементом, используется стандартный объект Tippy.
Tippy.js позволяет задавать поведение группы через опции при создании singleton:
delay – массив
[showDelay, hideDelay] для всех тултипов.moveTransition – задаёт CSS-переход
при движении тултипа.placement – позволяет синхронизировать
расположение подсказок для всей группы.allowHTML – включает поддержку
HTML-контента в подсказках.Пример настройки с различными эффектами:
const singleton = createSingleton(tooltips, {
delay: [50, 300],
moveTransition: 'transform 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
placement: 'bottom',
allowHTML: true,
});
Группу можно расширять и изменять динамически. Для этого необходимо создать новые экземпляры Tippy и обновить singleton:
const newTooltip = tippy('#newElement', { content: 'Новая подсказка' });
singleton.setInstances([...singleton.getInstances(), newTooltip]);
Удаление происходит аналогично:
const instances = singleton.getInstances().filter(t => t.reference.id !== 'oldElement');
singleton.setInstances(instances);
Примечание: getInstances() возвращает
массив всех тултипов внутри singleton, что облегчает контроль над их
состоянием.
Singleton позволяет подписываться на события всех тултипов группы через стандартные Tippy-хуки:
singleton.state.currentTarget.addEventListener('mouseenter', () => {
console.log('Активный тултип наведён');
});
singleton.setProps({
onShow(instance) {
console.log(`Открыт тултип для элемента: ${instance.reference.id}`);
},
onHide(instance) {
console.log(`Скрыт тултип для элемента: ${instance.reference.id}`);
}
});
Таким образом, можно обрабатывать события централизованно, не создавая отдельные обработчики для каждого элемента.
Tippy.js интегрируется с фреймворками через официальные обёртки:
@tippyjs/react, где singleton
создаётся через useSingleton:import { useSingleton, Tooltip } from '@tippyjs/react';
const [source, target] = useSingleton({ delay: 100 });
<Tooltip content="Подсказка" singleton={source}>
<button>Кнопка 1</button>
</Tooltip>
<Tooltip content="Другая подсказка" singleton={source}>
<button>Кнопка 2</button>
</Tooltip>
v-tippy с аналогичной
логикой создания singleton через createSingleton.moveTransition —
позволяет плавно анимировать перемещения тултипов при изменении позиции
элементов.Эта функциональность делает Tippy.js гибким инструментом для массового управления всплывающими подсказками, сохраняя индивидуальные настройки каждого тултипа при централизованном контроле поведения.