Библиотека Tippy.js позволяет создавать всплывающие подсказки и панели с гибкими возможностями управления триггерами и позиционированием. Одним из распространённых сценариев является переключение между несколькими элементами, когда нужно показывать разные подсказки в зависимости от взаимодействия пользователя.
Tippy.js работает с массивами элементов и предоставляет методы для динамического управления тултипами, что делает переключение плавным и эффективным.
Для начала необходимо создать набор элементов и инициализировать для них Tippy.js. Пример:
const buttons = document.querySelectorAll('.tooltip-btn');
tippy(buttons, {
content: (reference) => reference.getAttribute('data-tooltip'),
animation: 'fade',
delay: [100, 50],
placement: 'top',
});
Ключевые моменты:
querySelectorAll возвращает коллекцию элементов, на
которые можно навесить одинаковую конфигурацию тултипов.content может быть функцией, чтобы динамически
подставлять текст из атрибута data-tooltip.animation, delay и placement
позволяют тонко настроить визуальное поведение при переключении между
элементами.По умолчанию Tippy.js автоматически скрывает предыдущий тултип при
активации нового. Для более сложного управления используется метод
show() и hide():
const tooltip1 = tippy(document.querySelector('#btn1'), { content: 'Подсказка 1' });
const tooltip2 = tippy(document.querySelector('#btn2'), { content: 'Подсказка 2' });
document.querySelector('#btn1').addEventListener('mouseenter', () => {
tooltip1.show();
tooltip2.hide();
});
document.querySelector('#btn2').addEventListener('mouseenter', () => {
tooltip2.show();
tooltip1.hide();
});
Особенности:
show() открывает тултип, hide()
закрывает.followCursor или триггера
mouseenter недостаточно.interactive: true для элементов,
содержащих внутри интерактивные компоненты.Для переключения между большим количеством элементов удобно хранить тултипы в массиве:
const tooltips = [];
document.querySelectorAll('.item').forEach((el, index) => {
const tip = tippy(el, {
content: `Элемент ${index + 1}`,
trigger: 'manual',
});
tooltips.push(tip);
});
document.querySelectorAll('.item').forEach((el, idx) => {
el.addEventListener('mouseenter', () => {
tooltips.forEach((t, i) => i !== idx && t.hide());
tooltips[idx].show();
});
});
Примечания:
manual даёт полный контроль над показом и
скрытием тултипов.Иногда требуется менять содержимое тултипа без создания нового экземпляра:
const dynamicTip = tippy(document.querySelector('#dynamic'), {
content: 'Начальное содержимое',
trigger: 'manual',
});
document.querySelectorAll('.dynamic-btn').forEach(btn => {
btn.addEventListener('mouseenter', () => {
dynamicTip.setContent(btn.getAttribute('data-tooltip'));
dynamicTip.show();
});
});
Ключевые моменты:
setContent позволяет обновлять текст на
лету.Tippy.js поддерживает переключение между элементами не только мышью, но и с клавиатуры:
tippy(document.querySelectorAll('.focusable'), {
content: (ref) => ref.dataset.tooltip,
trigger: 'focus',
interactive: true,
});
Особенности:
focus позволяет пользователям переключаться с
помощью клавиш Tab и Shift+Tab.interactive: true сохраняет тултип открытым, пока фокус
находится внутри.Иногда необходимо показывать разные тултипы в зависимости от состояния элемента:
const statusTips = {
active: 'Элемент активен',
inactive: 'Элемент неактивен',
};
document.querySelectorAll('.status-btn').forEach(btn => {
const tip = tippy(btn, { trigger: 'manual' });
btn.addEventListener('mouseenter', () => {
const status = btn.dataset.status;
tip.setContent(statusTips[status]);
tip.show();
});
});
Преимущества:
click,
mouseenter, focus).manual для
полного контроля при переключении.setContent вместо создания
новых тултипов для улучшения производительности.interactive: true и delay
для плавного UX при быстром переключении между элементами.trigger: 'focus' и
поддерживать навигацию с клавиатуры.