Ленивая загрузка (lazy loading) в контексте Tippy.js — это механизм отложенного создания всплывающих подсказок до момента, когда они реально понадобятся. Такой подход позволяет оптимизировать производительность страницы, особенно если элементов с подсказками много, а пользователи взаимодействуют лишь с частью из них.
По умолчанию Tippy.js создает все тултипы при инициализации. При больших DOM-деревьях это может привести к увеличению времени загрузки страницы и повышенному потреблению памяти. Ленивая загрузка решает эту проблему за счёт отложенного создания экземпляров.
Ключевые моменты:
Основной способ реализации ленивой загрузки — использование опции
lazy: true. Она указывает библиотеке, что тултип должен
инициализироваться только при первом взаимодействии с элементом.
tippy('.lazy-button', {
content: 'Отложенный тултип',
lazy: true,
});
После первого события (обычно mouseenter или
focus) тултип создается, и все его параметры начинают
действовать как обычно.
Часто тултип содержит контент, который загружается асинхронно. Для
этого в Tippy.js применяется функция onShow, которая
вызывается перед отображением тултипа.
tippy('.async-button', {
content: 'Загрузка...',
lazy: true,
onShow(instance) {
if (!instance.props.contentFetched) {
fetch('/tooltip-content')
.then(response => response.text())
.then(data => {
instance.setContent(data);
instance.props.contentFetched = true;
});
}
}
});
Пояснения:
contentFetched используется для предотвращения
повторной загрузки.setContent динамически заменяет содержимое тултипа
после получения данных.Если на странице много элементов с похожими тултипами, лучше
использовать делегирование через опцию delegate. Это
позволяет назначить один обработчик для контейнера, а тултипы создаются
только для элементов, с которыми произошло взаимодействие.
tippy.delegate(document.body, {
target: '.tooltip-item',
content(reference) {
return reference.getAttribute('data-tooltip');
},
lazy: true,
});
Преимущества:
render для сложных тултиповДля сложных тултипов с кастомной разметкой часто используют функцию
render. В сочетании с ленивой загрузкой это позволяет
полностью отложить создание DOM-элементов до момента показа.
tippy('.custom-tooltip', {
lazy: true,
render(reference) {
const box = document.createElement('div');
box.className = 'tippy-box custom';
box.innerHTML = `<strong>${reference.dataset.title}</strong>`;
return {
popper: box,
onUpdate() {},
onDestroy() {},
};
},
});
Особенности подхода:
Для ленивых тултипов важно корректно настроить события активации:
mouseenter — стандартное наведение мыши.focus — для клавиатурной навигации.click — для элементов, активируемых кликом.trigger: 'mouseenter focus'.tippy('.lazy-mixed', {
lazy: true,
trigger: 'mouseenter focus click',
content: 'Тултип с несколькими триггерами',
});
Это обеспечивает корректное срабатывание в разных сценариях пользовательского взаимодействия.
lazy с render для тяжелых
тултипов с кастомным DOM.Ленивая загрузка в Tippy.js позволяет сохранять высокую производительность страницы даже при наличии сотен элементов с подсказками, уменьшает нагрузку на память и ускоряет интерактивность интерфейса.