Для начала необходимо установить Tippy.js. Существует два основных способа подключения: через npm/yarn или с помощью CDN.
Через npm:
npm install tippy.js
После установки подключение в проекте выглядит так:
import tippy from 'tippy.js';
import 'tippy.js/dist/tippy.css'; // базовые стили
Через 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>
Важно подключать Popper.js перед Tippy.js, так как Tippy
использует его для позиционирования подсказок.
Для создания простой подсказки используется функция
tippy(), в которую передается элемент (или селектор) и
объект с опциями:
tippy('#myButton', {
content: 'Нажмите для действий'
});
Ключевые моменты:
content — текст или HTML-содержимое подсказки.tippy('.tooltip', {
content: 'Подсказка для всех элементов с классом tooltip'
});
Tippy.js поддерживает множество опций для управления положением и анимацией подсказок.
Позиция (placement):
tippy('#myButton', {
content: 'Сверху',
placement: 'top'
});
Доступные значения: top, bottom,
left, right и их комбинации
(top-start, bottom-end и т.д.).
Анимация (animation):
tippy('#myButton', {
content: 'С анимацией',
animation: 'scale'
});
Поддерживаемые типы анимации: shift-away,
shift-toward, scale, fade,
perspective.
Смещение (offset):
tippy('#myButton', {
content: 'Смещение вниз на 10px',
offset: [0, 10] // [сдвиг по горизонтали, сдвиг по вертикали]
});
Tippy.js позволяет создавать интерактивные всплывающие окна с кнопками, ссылками или формами.
tippy('#myButton', {
content: `<button id="btnClick">Кликни меня</button>`,
allowHTML: true,
interactive: true
});
Ключевые параметры:
allowHTML: true — разрешает использование HTML внутри
подсказки.interactive: true — позволяет взаимодействовать с
элементами подсказки без закрытия при наведении.Обработка событий внутри подсказки:
document.addEventListener('click', (e) => {
if (e.target.id === 'btnClick') {
alert('Кнопка внутри подсказки нажата');
}
});
Tippy.js предоставляет API для управления подсказками через методы экземпляра.
Создание и сохранение экземпляра:
const instance = tippy('#myButton', {
content: 'Управление программно'
})[0];
Основные методы:
instance.show() — показать подсказку.instance.hide() — скрыть подсказку.instance.toggle() — переключить состояние.instance.setContent('Новый текст') — изменить
содержимое подсказки.instance.destroy() — удалить подсказку и освободить
ресурсы.Tippy.js поддерживает динамическое создание подсказок только при наведении:
tippy.delegate(document.body, {
target: '.dynamic-tooltip',
content: (reference) => `Данные для: ${reference.textContent}`
});
Преимущества делегирования:
Tippy.js позволяет изменять события, которые вызывают подсказку.
tippy('#myButton', {
content: 'Открытие по клику',
trigger: 'click' // по умолчанию 'mouseenter focus'
});
Поддерживаются комбинированные триггеры:
tippy('#myButton', {
content: 'Клик или наведение',
trigger: 'mouseenter click'
});
Дополнительно:
hideOnClick — управление скрытием при клике.delay — задержка появления или скрытия в
миллисекундах:tippy('#myButton', {
content: 'Задержка появления',
delay: [500, 200] // [появление, скрытие]
});
Tippy.js использует CSS-классы, которые позволяют полностью кастомизировать внешний вид.
tippy('#myButton', {
content: 'Синий стиль',
theme: 'blue'
});
Для кастомной темы:
.tippy-box[data-theme~='blue'] {
background-color: #3498db;
color: #fff;
font-weight: bold;
}
.tippy-box[data-theme~='blue'] .tippy-arrow {
color: #3498db;
}
theme — имя темы, которое используется в CSS
селекторе.Для больших проектов возможно создание массива подсказок с одинаковыми параметрами:
tippy('.tooltip', {
content: 'Общий текст для всех',
placement: 'bottom',
animation: 'scale'
});
Для подсказок с уникальным содержимым используют функцию:
tippy('.tooltip', {
content: (reference) => `Данные: ${reference.dataset.info}`
});
Такой подход упрощает поддержку и масштабирование подсказок на страницах с динамическим контентом.
Tippy.js легко интегрируется с React, Vue и Svelte, используя их нативные подходы к рендерингу и жизненному циклу компонентов.
Пример в React:
import Tippy from '@tippyjs/react';
import 'tippy.js/dist/tippy.css';
<Tippy content="Подсказка в React">
<button>Кнопка</button>
</Tippy>
Пример в Vue:
<template>
<button v-tippy="'Подсказка в Vue'">Кнопка</button>
</template>
<script>
import { directive as tippy } from 'tippy.js';
export default {
directives: { tippy }
}
</script>
v-tippy обеспечивает легкую интеграцию без
ручного управления экземплярами.interactive: false), ускоряет работу.destroy() при удалении элементов из DOM
предотвращает утечки памяти.Tippy.js предоставляет несколько событий жизненного цикла:
onShow(instance) — перед показом подсказки.onShown(instance) — после появления.onHide(instance) — перед скрытием.onHidden(instance) — после скрытия.onMount(instance) — при монтировании DOM.onTrigger(instance, event) — при срабатывании
триггера.Пример использования:
tippy('#myButton', {
content: 'Подсказка с событиями',
onShow(instance) {
console.log('Подсказка показывается', instance);
}
});
Эти события позволяют интегрировать подсказки в сложную логику приложения и отслеживать пользовательское взаимодействие.