Tippy.js позволяет создавать всплывающие подсказки, тултипы и
интерактивные элементы интерфейса с минимальным количеством кода.
Инициализация базируется на вызове функции
tippy(targets, options), где targets —
CSS-селектор, элемент DOM или коллекция элементов, а
options — объект с настройками поведения подсказки.
Простейший пример:
tippy('.button', {
content: 'Нажмите для действия',
placement: 'top',
});
Здесь создается подсказка для всех элементов с классом
.button, размещаемая сверху (top).
Для оптимизации работы с большим количеством элементов предпочтительно использовать делегирование событий, вместо инициализации отдельного экземпляра для каждого элемента.
tippy.delegate(document.body, {
target: '.tooltip',
content(reference) {
return reference.getAttribute('data-tooltip');
},
placement: 'right',
});
Использование delegate сокращает количество созданных
экземпляров и снижает нагрузку на DOM. Каждый новый элемент с классом
.tooltip автоматически получает подсказку без повторной
инициализации.
Для элементов, которые появляются динамически или находятся за
пределами текущей области видимости, применяется ленивая
инициализация через функцию tippy.lazy. Это
позволяет создавать подсказку только при необходимости, экономя
ресурсы:
tippy.lazy('.dynamic', {
content: 'Динамическая подсказка',
placement: 'bottom',
});
Такой подход особенно полезен на страницах с большим количеством элементов, где большинство тултипов редко используется.
Tippy.js поддерживает наследование опций. Это позволяет задать глобальные настройки и переопределять их на уровне отдельных элементов:
const globalSettings = {
arrow: true,
delay: [100, 50],
theme: 'light',
};
tippy('.button', globalSettings);
tippy('#specialButton', {
...globalSettings,
theme: 'dark',
placement: 'left',
});
Использование глобальных настроек упрощает поддержку кода и уменьшает количество дублирующихся свойств.
Каждый экземпляр Tippy.js возвращает объект с методами управления:
show() — отображение подсказкиhide() — скрытие подсказкиdestroy() — полное удаление экземпляраsetProps(newProps) — динамическое изменение
конфигурацииПример динамического изменения контента:
const tip = tippy('#updateButton', {
content: 'Первоначальный текст',
});
tip[0].setProps({
content: 'Обновленный текст',
});
Это позволяет оптимизировать память, создавая меньше объектов и управляя ими по необходимости.
При работе с большим количеством однотипных элементов стоит использовать пакетную инициализацию с селекторами или NodeList.
document.querySelectorAll('.item').forEach(element => {
tippy(element, { placement: 'top', delay: [50, 50] });
});
Этот способ подходит, когда делегирование нецелесообразно, а элементы статичны. В сочетании с глобальными настройками он дает удобный контроль над всеми тултипами на странице.
destroy() для элементов, которые удаляются из DOM.При использовании React, Vue или Angular предпочтительно создавать Tippy-инстансы внутри компонентов, с управлением через эффекты или хуки, чтобы избежать утечек памяти и лишних рендеров. Например, в React:
import { useEffect, useRef } from 'react';
import tippy from 'tippy.js';
function TooltipButton({ label, tooltip }) {
const ref = useRef(null);
useEffect(() => {
const instance = tippy(ref.current, { content: tooltip });
return () => instance.destroy();
}, [tooltip]);
return <button ref={ref}>{label}</button>;
}
Такой подход обеспечивает корректное уничтожение экземпляров при размонтировании компонентов.
Главная задача оптимизации инициализации Tippy.js — уменьшение количества одновременно активных экземпляров и управление их жизненным циклом. Делегирование, ленивое создание, глобальные настройки и пакетная инициализация позволяют создавать быстрые, отзывчивые интерфейсы без лишней нагрузки на браузер.