Tippy.js — это библиотека для создания тултипов и всплывающих подсказок на JavaScript. Она обеспечивает гибкое управление позиционированием, анимациями и интерактивностью. При работе с большим числом элементов на странице или сложными интерфейсами важно учитывать производительность, чтобы минимизировать reflow и repaint в браузере.
Reflow (пересчет расположения элементов) и repaint (перерисовка визуального представления) — это дорогие операции для браузера, особенно при динамических изменениях DOM. Tippy.js использует Popper.js для позиционирования тултипов, и неправильная настройка может вызвать множественные перерасчеты, что снижает плавность интерфейса.
appendTo для оптимизацииПо умолчанию тултипы Tippy.js вставляются в body, что позволяет им свободно позиционироваться, не влияя на окружающий контент. Это минимизирует лишние reflow при открытии или закрытии тултипа:
tippy('.tooltip', {
content: 'Информация',
appendTo: document.body
});
Если тултип вставлять внутрь контейнера с позиционированием
relative или absolute, любое изменение его
размеров может вызвать перерасчет для родительского блока и его соседей.
Вынос в body снижает этот риск.
render для минимизации DOM-операцийСоздание тултипов при каждом наведении может вызывать множественные
перерасчеты. Опция render позволяет создать элемент один
раз и повторно использовать его:
const tooltipInstance = tippy('.tooltip', {
render(reference) {
const tooltip = document.createElement('div');
tooltip.className = 'custom-tooltip';
tooltip.textContent = reference.getAttribute('data-tooltip');
return {
popper: tooltip,
destroy() { tooltip.remove(); }
};
}
});
Это сокращает количество вставок в DOM и уменьшает нагрузку на браузер.
Если тултип содержит динамический контент, лучше заранее подготовить DOM-элементы или строки текста, чем создавать их заново при каждом событии. Это уменьшает количество reflow:
const tooltipsData = {
item1: 'Описание элемента 1',
item2: 'Описание элемента 2'
};
tippy('.tooltip', {
content(reference) {
return tooltipsData[reference.dataset.id];
}
});
Tippy.js поддерживает CSS-анимации. Анимации, затрагивающие top/left/width/height, вызывают reflow. Для оптимизации следует использовать transform и opacity, которые обрабатываются GPU и не вызывают пересчет макета:
tippy('.tooltip', {
animation: 'shift-away',
duration: 200,
onShow(instance) {
instance.popper.style.willChange = 'transform, opacity';
}
});
will-change заранее сообщает браузеру о предстоящих
изменениях, позволяя подготовить оптимизированный рендер.
Для большого количества элементов вместо индивидуальных тултипов
лучше использовать делегирование. Tippy.js позволяет
создать один тултип и управлять его содержимым через событие
mouseenter:
tippy.delegate(document.body, {
target: '.tooltip',
content(reference) {
return reference.dataset.tooltip;
}
});
Это снижает количество созданных экземпляров и уменьшает нагрузку на рендер.
lazy и interactive для контроля
отображенияОпция lazy: true создает тултип только при первом
наведении, что сокращает начальный рендер страницы. Опция
interactive позволяет пользователю взаимодействовать с
тултипом без пересчета положения при каждом движении мыши:
tippy('.tooltip', {
lazy: true,
interactive: true
});
Эти подходы совместно позволяют сократить лишние reflow и repaint, поддерживая высокую производительность интерфейса при использовании Tippy.js.