Tippy.js — это библиотека для создания всплывающих подсказок и тултипов в JavaScript. Она строится поверх Popper.js, что обеспечивает точное позиционирование относительно целевого элемента. Основные возможности Tippy.js включают динамическое создание подсказок, управление триггерами, настройку анимаций и кастомизацию содержимого через HTML или React-компоненты.
Базовое использование выглядит так:
tippy('#myButton', {
content: 'Привет, это подсказка!',
placement: 'top',
});
content — текст или HTML, отображаемый во всплывающем
окне.placement — позиция относительно целевого элемента
(top, bottom, left,
right).Tippy.js поддерживает несколько способов инициализации:
tippy('.btn', { content: 'Нажмите меня' });
Все элементы с классом .btn получат тултипы.
const button = document.querySelector('#myButton');
tippy(button, { content: 'Подсказка для кнопки' });
tippy('#dynamic', {
content: () => `Время: ${new Date().toLocaleTimeString()}`,
});
Это позволяет обновлять подсказку в реальном времени.
Tippy.js позволяет гибко управлять событиями появления тултипа через
опцию trigger:
mouseenter focus — появляется при наведении мыши или
фокусе.click — появляется по клику.manual — управление через методы API
(show(), hide(), toggle()).Пример использования ручного управления:
const tip = tippy('#manualButton', {
content: 'Ручное управление',
trigger: 'manual',
});
document.querySelector('#showBtn').addEventListener('click', () => tip.show());
document.querySelector('#hideBtn').addEventListener('click', () => tip.hide());
Методы API позволяют программно контролировать отображение подсказок, что полезно для сложных интерфейсов.
Tippy.js предоставляет встроенные анимации и возможность создавать собственные темы:
tippy('#animated', {
content: 'С анимацией',
animation: 'scale', // fade, shift-away, shift-toward, perspective, scale
theme: 'custom-theme',
});
Создание кастомной темы через CSS:
.tippy-box[data-theme~='custom-theme'] {
background-color: #333;
color: #fff;
border-radius: 8px;
font-size: 14px;
}
Поддержка нескольких тем позволяет визуально разграничивать подсказки в интерфейсе.
Tippy.js позволяет использовать HTML-содержимое с полной поддержкой DOM-структур:
tippy('#htmlTip', {
content: `
<div>
<strong>Заголовок</strong>
<p>Описание с <em>HTML</em></p>
</div>
`,
allowHTML: true,
});
Опция allowHTML: true необходима для корректного
рендеринга HTML. Также можно передавать готовые DOM-элементы:
const element = document.createElement('div');
element.textContent = 'Текст через DOM';
tippy('#domTip', { content: element });
Для сложных подсказок, которые должны быть интерактивными (например,
формы или кнопки внутри тултипа), используется опция
interactive:
tippy('#interactiveTip', {
content: '<button id="innerBtn">Нажми меня</button>',
allowHTML: true,
interactive: true,
});
Это предотвращает автоматическое скрытие подсказки при клике по её содержимому.
Tippy.js поддерживает динамическое создание тултипов, что экономит ресурсы при работе с большим количеством элементов:
document.addEventListener('mouseover', (e) => {
if (e.target.matches('.lazy')) {
tippy(e.target, { content: 'Динамически созданная подсказка' });
}
});
Такой подход полезен для таблиц, списков или интерфейсов с множеством элементов, где создавать тултипы заранее неэффективно.
Tippy.js предоставляет доступ к Popper.js через опцию
popperOptions, что позволяет настраивать поведение
позиционирования:
tippy('#popperTip', {
content: 'Тултип с кастомным смещением',
popperOptions: {
modifiers: [
{
name: 'offset',
options: { offset: [0, 20] },
},
],
},
});
Можно изменять смещение, поведение при переполнении, адаптивные стратегии позиционирования и многое другое.
Tippy.js имеет расширенные события, которые позволяют реагировать на появление, скрытие и обновление тултипов:
tippy('#callbackTip', {
content: 'Подсказка с коллбэками',
onShow(instance) {
console.log('Тултип показан', instance);
},
onHide(instance) {
console.log('Тултип скрыт', instance);
},
onMount(instance) {
console.log('Тултип смонтирован в DOM', instance);
},
});
Это критично для сложных интерфейсов, где состояние тултипов влияет на другие элементы страницы.
Tippy.js позволяет инициализировать тултипы для группы элементов и использовать делегирование событий:
tippy.delegate(document.body, {
target: '.delegated',
content(reference) {
return `Подсказка для ${reference.textContent}`;
},
});
Делегирование экономит ресурсы, особенно если элементы добавляются динамически.
Tippy.js легко интегрируется с React, Vue и Angular. Для React
используется отдельный пакет @tippyjs/react, который
позволяет создавать компонентные тултипы с управляемым состоянием и
JSX-контентом. В Vue и Angular можно оборачивать компоненты и передавать
их через content или v-html.
delegate для больших списков
элементов.trigger: 'manual' + создание
при необходимости).Эти практики помогают избежать замедлений интерфейса при работе с сотнями и тысячами тултипов на странице.