Tippy.js — это современная библиотека для создания всплывающих подсказок (tooltips) на элементах веб-страницы. Она основана на Popper.js и позволяет гибко управлять позиционированием, поведением и стилем подсказок. Библиотека поддерживает создание простых и сложных подсказок, включая динамический контент и кастомные компоненты.
import tippy from 'tippy.js';
import 'tippy.js/dist/tippy.css';
tippy('#myButton', {
content: 'Это простая подсказка',
placement: 'right',
});
Ключевые моменты:
content — текст или HTML-контент подсказки.placement — положение относительно целевого элемента
(top, bottom, left,
right, и их вариации с -start и
-end).Tippy.js поддерживает интерактивные подсказки, позволяя пользователю взаимодействовать с содержимым (кнопки, ссылки, формы) без закрытия подсказки при наведении:
tippy('#interactiveButton', {
content: '<button>Нажми меня</button>',
allowHTML: true,
interactive: true,
placement: 'bottom',
});
Особенности:
allowHTML: true — разрешает использование HTML в
content.interactive: true — предотвращает закрытие подсказки
при наведении на её содержимое.onShow, onHide,
onMount.Tippy.js позволяет изолировать контекст выполнения подсказки, что особенно важно при работе с динамическими данными или множеством элементов на странице. Каждый экземпляр подсказки создаётся как отдельный объект с собственным контекстом:
const tooltip = tippy('#dynamicButton', {
content: 'Значение: 0',
onShow(instance) {
instance.setContent(`Значение: ${Math.floor(Math.random() * 100)}`);
},
});
Пояснение работы изоляции:
tippy хранит своё состояние и методы
независимо от других.instance.setContent(),
instance.show(), instance.hide() управляют
только конкретным экземпляром.Эта изоляция предотвращает коллизии между подсказками и позволяет безопасно использовать динамические данные, вычисляемые на момент открытия подсказки.
Tippy.js позволяет управлять контейнером, в котором создаются подсказки, что важно для контроля стилей и контекста DOM:
tippy('#button', {
content: 'Привязка к кастомному контейнеру',
appendTo: document.body, // Можно указать любой элемент DOM
});
Принципы:
appendTo определяет, где будет находиться элемент
подсказки.document.body предотвращает проблемы с
overflow и z-index внутри родительских элементов.Создание большого числа подсказок требует правильной изоляции контекста, чтобы каждое событие и состояние оставались независимыми:
const buttons = document.querySelectorAll('.multi-button');
buttons.forEach(btn => {
tippy(btn, {
content: `Подсказка для ${btn.textContent}`,
placement: 'top',
interactive: true,
});
});
Особенности:
Tippy.js поддерживает подключение плагинов для расширения функционала:
tippy.animateFill — анимация заполнения подсказки.tippy.followCursor — подсказка следует за
курсором.tippy.hideOnClick — скрытие при клике вне
элемента.import { followCursor } from 'tippy.js/plugins';
tippy('#hoverButton', {
content: 'Я слежу за курсором!',
plugins: [followCursor],
followCursor: true,
});
Изоляция контекста позволяет каждому плагину работать только с конкретным экземпляром подсказки, не влияя на остальные.
Tippy.js предоставляет полный контроль над жизненным циклом:
onCreate — вызывается после создания экземпляра.onMount — после вставки DOM-подсказки.onShow / onShown — при открытии
подсказки.onHide / onHidden — при закрытии
подсказки.onDestroy — при удалении экземпляра.const tooltip = tippy('#lifeCycleButton', {
content: 'Пример жизненного цикла',
onShow(instance) {
console.log('Подсказка открыта', instance);
},
onHide(instance) {
console.log('Подсказка скрыта', instance);
}
});
Каждое событие работает в рамках изолированного экземпляра, что предотвращает нежелательные побочные эффекты при работе с динамическими данными и сложными интерфейсами.
Tippy.js поддерживает вставку сложных React, Vue или чисто JS-компонентов, полностью сохраняя изоляцию контекста:
tippy('#componentButton', {
content: document.querySelector('#tooltipComponent'),
allowHTML: true,
interactive: true,
});
Если нужно, могу продолжить с разбором динамического обновления, оптимизации производительности при множестве подсказок и особенностей memory management в Tippy.js, что глубже раскрывает изоляцию контекста.
Хотите, чтобы я включил эти продвинутые темы в следующей части статьи?