Tippy.js — это современная библиотека для создания всплывающих подсказок и тултипов в JavaScript. Одним из ключевых механизмов, позволяющих эффективно управлять большим количеством элементов на странице, является делегирование. Этот подход сокращает количество отдельных инициализаций и облегчает поддержку динамически добавляемых элементов.
Делегирование заключается в том, что одна точка инициализации отвечает за создание тултипов для множества элементов, соответствующих определенному селектору. Вместо того чтобы навешивать Tippy на каждый элемент отдельно, библиотека отслеживает события на родительском контейнере и создает тултипы только при взаимодействии с нужными элементами.
Ключевое преимущество делегирования:
Для включения делегирования используется опция delegate.
Простейший пример:
tippy(document.body, {
content: 'Тултип',
delegate: '.tooltip-target',
placement: 'top',
});
В этом примере:
document.body — контейнер, внутри которого
отслеживаются события..tooltip-target — селектор элементов, для которых будут
показываться тултипы.content — текст тултипа по умолчанию.placement — позиция относительно целевого
элемента.Важно понимать, что контейнер делегирования может быть любым
элементом, а не только body. Например, можно
ограничить область работы тултипов определенной секцией страницы.
Tippy.js позволяет задавать content через функцию, что
особенно полезно для делегирования:
tippy(document.body, {
delegate: '.tooltip-target',
content(reference) {
return reference.getAttribute('data-tooltip');
},
});
Здесь текст тултипа берется из атрибута data-tooltip
целевого элемента. Это делает систему полностью динамической и
гибкой.
В делегировании можно использовать стандартные опции Tippy.js:
trigger — указывает события, вызывающие тултип
(mouseenter, click, focus).placement — позиционирование (top,
bottom, left, right).delay — задержка показа и скрытия тултипа.Пример с кастомными событиями:
tippy('#container', {
delegate: '.has-tooltip',
trigger: 'click',
placement: 'right',
delay: [200, 100],
});
Для тултипов, которые содержат кнопки, ссылки или другие
интерактивные элементы, необходимо включить опцию
interactive:
tippy('#container', {
delegate: '.interactive-tooltip',
interactive: true,
content(reference) {
return `<button oncl ick="alert('Clicked!')">Нажми меня</button>`;
},
});
Без этой опции тултип закроется при попытке взаимодействия с его содержимым.
Делегирование идеально подходит для элементов, создаваемых после загрузки страницы. Так как Tippy отслеживает события на контейнере, новые элементы с нужным селектором автоматически получают тултипы, без повторной инициализации.
const container = document.querySelector('#dynamic-container');
tippy(container, {
delegate: '.new-tooltip',
content(reference) {
return reference.dataset.info;
},
});
// Добавление элемента после инициализации
const newElement = document.createElement('div');
newElement.className = 'new-tooltip';
newElement.dataset.info = 'Динамический тултип';
container.appendChild(newElement);
Tippy.js предоставляет методы destroy() и
disable() для удаления или временного отключения тултипов,
созданных через делегирование. Важно помнить, что делегированные тултипы
привязаны к контейнеру, поэтому нужно управлять именно контейнером:
const tipInstance = tippy(document.body, { delegate: '.tooltip-target' });
// Отключение всех тултипов
tipInstance.disable();
// Полное уничтожение
tipInstance.destroy();
Делегирование уменьшает количество создаваемых экземпляров Tippy.js. Вместо сотен отдельных инициализаций создается одна точка наблюдения, что снижает нагрузку на DOM и события. Это особенно важно для сложных страниц с большим количеством интерактивных элементов.
delegate, когда количество элементов
больше 10–20 или они динамически добавляются.content() для динамического получения
информации.interactive: true только для тултипов с
интерактивным контентом, чтобы избежать лишней нагрузки.Делегирование в Tippy.js сочетает удобство и производительность, обеспечивая простую интеграцию с динамическими интерфейсами и минимизацию кода.