Для использования Tippy.js необходимо подключить саму библиотеку и её зависимости. Базовые варианты подключения:
Через CDN:
<link rel="stylesheet" href="https://unpkg.com/tippy.js@6/dist/tippy.css">
<script src="https://unpkg.com/@popperjs/core@2"></script>
<script src="https://unpkg.com/tippy.js@6"></script>
Через npm:
npm install tippy.js @popperjs/core
В коде Jav * aScript:
import tippy from 'tippy.js';
import 'tippy.js/dist/tippy.css';
Tippy.js использует Popper.js для позиционирования всплывающих подсказок, что обеспечивает корректное расположение относительно целевого элемента.
Для создания всплывающей подсказки достаточно указать селектор элемента и передать строку с текстом:
tippy('#myButton', {
content: 'Нажмите здесь для действия'
});
Ключевые параметры:
content — содержимое тултипа, может быть текстом или
HTML-элементом.placement — позиция относительно целевого элемента
(top, bottom, left,
right и их комбинации).trigger — событие, которое вызывает тултип
(mouseenter, click, focus).arrow — добавление стрелки
(true/false).animation — стандартная анимация
(shift-away, fade, scale).Tippy.js позволяет использовать HTML-контент и делать тултип интерактивным:
tippy('#myButton', {
content: document.querySelector('#tooltipContent'),
allowHTML: true,
interactive: true,
});
allowHTML: true — позволяет вставлять HTML внутри
тултипа.interactive: true — позволяет взаимодействовать с
контентом тултипа (кнопки, ссылки, формы).Можно тонко настраивать положение через placement и
offset:
tippy('#myButton', {
content: 'Подсказка с отступом',
placement: 'right-start',
offset: [10, 20], // [skidding, distance]
});
Tippy.js поддерживает кастомные анимации через функцию
animateFill или напрямую через onShow и
onHide. Подключение anime.js открывает возможности сложной
анимации.
import anime from 'animejs/lib/anime.es.js';
tippy('#myButton', {
content: 'Анимированная подсказка',
onShow(instance) {
anime({
targets: instance.popper,
opacity: [0, 1],
translateY: [-10, 0],
duration: 500,
easing: 'easeOutQuad'
});
},
onHide(instance) {
anime({
targets: instance.popper,
opacity: [1, 0],
translateY: [0, -10],
duration: 300,
easing: 'easeInQuad'
});
}
});
onShow и onHide позволяют полностью
контролировать анимацию появления и скрытия тултипа.translateX,
scale, rotate) могут применяться к
тултипу.Tippy.js поддерживает инициализацию сразу на нескольких элементах и делегирование событий:
tippy('.buttons', {
content: 'Кнопка',
placement: 'top'
});
Делегирование удобно для динамически добавленных элементов:
tippy.delegate(document.body, {
target: '.dynamic-btn',
content: 'Динамический тултип',
});
delegate экономит ресурсы, создавая один тултип для
всех соответствующих элементов.Tippy.js предоставляет методы для управления тултипами программно:
const tip = tippy('#myButton', {
content: 'Программный контроль'
})[0];
tip.show(); // Показать
tip.hide(); // Скрыть
tip.toggle(); // Переключить
tip.setContent('Новый текст'); // Обновить контент
tip.destroy(); // Удалить тултип
Tippy.js позволяет использовать CSS-классы и темы:
tippy('#myButton', {
content: 'Тема Dark',
theme: 'dark',
});
Создание собственной темы:
.tippy-box[data-theme~='custom'] {
background-color: #222;
color: #fff;
font-size: 14px;
border-radius: 6px;
padding: 8px 12px;
}
tippy('#myButton', {
content: 'Кастомная тема',
theme: 'custom',
});
Tippy.js легко интегрируется с библиотеками типа React, Vue, jQuery и анимационными библиотеками вроде anime.js:
@tippyjs/react.v-tippy.Пример комбинирования с анимацией при событии клика:
tippy('#animatedBtn', {
content: 'Анимация при клике',
trigger: 'click',
onShow(instance) {
anime({
targets: instance.popper,
scale: [0.8, 1],
rotate: [10, 0],
duration: 400,
easing: 'easeOutElastic(1, .5)'
});
}
});
Tippy.js позволяет загружать содержимое асинхронно, что удобно для подсказок с API:
tippy('#userBtn', {
content: 'Загрузка...',
onShow(instance) {
fetch('/api/user/123')
.then(res => res.text())
.then(data => {
instance.setContent(data);
});
}
});
Tippy.js сочетает в себе:
Эта библиотека подходит как для небольших подсказок, так и для сложных, анимированных интерактивных элементов интерфейса.