Tippy.js — это современная библиотека для создания всплывающих
подсказок (tooltips) и легких поповеров в веб-приложениях на JavaScript.
Она полностью основана на Popper.js и обеспечивает гибкое
позиционирование, кастомизацию анимаций и поддержку динамического
контента. Для инициализации Tippy.js используется функция
tippy(), которая принимает два основных аргумента: селектор
или DOM-элемент и объект с опциями.
tippy('.tooltip', {
content: 'Пример подсказки',
placement: 'top',
animation: 'fade',
});
Ключевые моменты:
content — текст или HTML-контент подсказки.placement — позиция относительно элемента
(top, bottom, left,
right, а также вариации с -start и
-end).animation — анимация появления и скрытия подсказки
(fade, scale, shift-away,
perspective).При переходе на Tippy.js в крупном проекте важно внедрять библиотеку поэтапно, чтобы не нарушить работу существующего интерфейса.
Первым шагом является идентификация всех элементов с текущими подсказками. В крупных проектах это могут быть:
Для каждой категории необходимо составить список элементов и определить приоритет внедрения Tippy.js. В приоритете должны быть элементы с высокой частотой взаимодействия.
Стратегия: замена старой системы поэтапно, начиная с отдельных страниц или блоков, не влияя на остальные. Например:
// Замена tooltip только для кнопок управления
tippy('.control-button', {
content: (reference) => reference.getAttribute('data-tooltip'),
delay: [100, 50],
placement: 'bottom',
});
Преимущества инкрементальной замены:
Tippy.js поддерживает инициализацию на основе data-атрибутов, что упрощает миграцию:
tippy('[data-tippy-content]', {
animation: 'scale',
delay: [200, 0],
interactive: true,
});
Это позволяет подключать Tippy.js к уже существующим DOM-элементам без необходимости переписывать каждый скрипт вручную.
Особенности:
data-tippy-content автоматически становится
содержимым подсказки.data-tippy-placement).Для элементов, создаваемых динамически (через JS-фреймворки или AJAX), необходимо использовать делегирование событий:
tippy.delegate(document.body, {
target: '.dynamic-tooltip',
content(reference) {
return reference.getAttribute('data-tooltip');
},
placement: 'right',
});
delegate() позволяет назначить обработчик на
родительский элемент, который будет автоматически применять Tippy.js к
новым элементам, соответствующим селектору target.Для постепенной миграции рекомендуется разделять конфигурацию на уровни:
Пример настройки интерактивной подсказки:
tippy('.interactive', {
content: '',
allowHTML: true,
interactive: true,
trigger: 'click',
placement: 'bottom',
});
Важно вести журнал внедрения:
После завершения поэтапной миграции можно полностью отключить старую библиотеку tooltip-ов:
// Отключение старого решения
OldTooltipLibrary.destroyAll();
При этом Tippy.js уже полностью покрывает все элементы, обеспечивая единообразие, гибкость и расширяемость подсказок по всему проекту.