Tippy.js — это гибкая библиотека для создания тултипов, которая опирается на Popper.js для позиционирования. При работе с другими плагинами и библиотеками важно понимать, что Tippy.js проектирован с модульной архитектурой: его поведение можно расширять и модифицировать через плагины, а также через сторонние библиотеки, изменяющие DOM или события.
Ключевые моменты:
mouseenter,
focus, click и mouseleave для
управления видимостью тултипов.instance.setProps() и
instance.destroy() вместо прямого манипулирования DOM.Многие UI-библиотеки (например, Select2, Choices.js, Flatpickr) создают динамические элементы, добавляют обертки и изменяют DOM. Для корректного взаимодействия Tippy.js применяет стратегию динамического привязывания элементов:
const instance = tippy(document.querySelectorAll('.tooltip-target'), {
content: 'Пример тултипа',
allowHTML: true,
appendTo: document.body
});
tippy('.tooltip-target', {
content: 'Тултип с наблюдением за DOM',
observeChanges: true
});
Использование observeChanges критично при интеграции с
плагинами, которые динамически обновляют контент (например,
интерактивные списки или динамически создаваемые кнопки).
Tippy.js предоставляет встроенные анимации, но часто необходимо сочетать их с библиотеками вроде GSAP или Anime.js. В таких случаях важно разделять позиционирование и визуальные эффекты:
offset), это необходимо учитывать при запуске
кастомной анимации.onShow, onHide, onMount и
onHidden, которые идеально подходят для интеграции с
анимациями.Пример интеграции с GSAP:
tippy('.tooltip-target', {
content: 'Анимированный тултип',
onShow(instance) {
gsap.fromTo(instance.popper, { opacity: 0, y: -10 }, { opacity: 1, y: 0, duration: 0.3 });
},
onHide(instance) {
gsap.to(instance.popper, { opacity: 0, y: -10, duration: 0.2 });
}
});
Эта структура позволяет тултипу корректно позиционироваться, одновременно используя мощные анимации.
Для динамически создаваемых элементов, которые добавляются в DOM после инициализации страницы, Tippy.js поддерживает делегирование:
tippy.delegate(document.body, {
target: '.dynamic-tooltip',
content(reference) {
return reference.getAttribute('data-tooltip');
},
allowHTML: true
});
delegate создает один глобальный обработчик, который
автоматически применяет тултипы к новым элементам.Плагины, изменяющие размеры или структуру DOM, могут нарушить корректное позиционирование тултипов. Для компенсации необходимо:
instance.popperInstance.update() после
изменений размера элемента.popperOptions для дополнительного
контроля:tippy('.tooltip-target', {
content: 'Тултип с кастомным Popper.js',
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
padding: 8
}
}
]
}
});
position: fixed или
transform в родителях, так как это влияет на
Popper.js.Tippy.js позволяет создавать несколько тултипов для одного элемента. При этом необходимо учитывать:
instance для каждого тултипа.trigger и
interactive.Пример:
const firstTip = tippy('.btn', { content: 'Первый' });
const secondTip = tippy('.btn', { content: 'Второй', trigger: 'click' });
firstTip срабатывает на hover, secondTip
на click.appendTo: document.body,
чтобы тултипы не зависели от структуры стороннего DOM.instance.destroy() при
удалении элемента через сторонние плагины.Эти подходы обеспечивают корректную работу Tippy.js вместе с другими плагинами, позволяя сохранять стабильное позиционирование, анимацию и реакцию на события независимо от изменений в DOM.