Система плагинов в Tippy.js позволяет расширять поведение тултипов без усложнения базового API. Плагины подключаются опционально и активируются только при необходимости, что снижает общий размер бандла и повышает гибкость конфигурации.
Каждый плагин представляет собой объект с определённой структурой:
name — уникальное имя плагинаdefaultValue — значение по умолчанию для
соответствующей опцииfn(instance) — функция инициализации, получающая
экземпляр TippyВнутри fn можно подписываться на жизненный цикл тултипа,
изменять поведение, добавлять обработчики событий.
Пример подключения плагинов:
import tippy, {followCursor, sticky} from 'tippy.js';
tippy('.btn', {
followCursor: true,
sticky: true,
plugins: [followCursor, sticky],
});
Без добавления плагина в массив plugins соответствующая
опция работать не будет.
Позволяет тултипу следовать за курсором мыши вместо привязки к элементу.
Ключевые особенности:
Варианты значений:
true — тултип полностью следует за курсором"horizontal" — движение только по горизонтали"vertical" — движение только по вертикали"initial" — позиция фиксируется при первом
появленииПример:
tippy('.item', {
content: 'Подсказка',
followCursor: 'horizontal',
plugins: [followCursor],
});
Внутри плагина используется отслеживание события
mousemove, что может влиять на производительность при
большом количестве элементов.
Обеспечивает «прилипание» тултипа к элементу при изменении его размеров или позиции.
Назначение:
Значения:
true — обновление позиции при любом изменении"reference" — отслеживание только
элемента-источника"popper" — отслеживание самого тултипаПример:
tippy('.dynamic', {
content: 'Динамический элемент',
sticky: true,
plugins: [sticky],
});
Плагин использует requestAnimationFrame для постоянной
проверки изменений, что делает его ресурсоёмким.
Добавляет анимацию заливки фона тултипа.
Особенности:
Пример:
import 'tippy.js/dist/backdrop.css';
import 'tippy.js/animations/shift-away.css';
tippy('.btn', {
content: 'Анимация',
animateFill: true,
plugins: [animateFill],
});
Важно подключение соответствующих стилей, иначе эффект не будет виден.
Обеспечивает корректное позиционирование тултипов для inline-элементов, которые могут переноситься на новую строку.
Проблема, которую решает: обычный тултип позиционируется относительно всей bounding box области, что может приводить к некорректному отображению при переносе текста.
Пример:
tippy('.inline-text', {
content: 'Подсказка',
inlinePositioning: true,
plugins: [inlinePositioning],
});
Плагин анализирует положение курсора и выбирает наиболее подходящий сегмент текста.
Комбинация этих плагинов часто используется для интерактивных текстов:
tippy('.text', {
content: 'Интерактив',
followCursor: true,
inlinePositioning: true,
plugins: [followCursor, inlinePositioning],
});
Позволяет добиться точного позиционирования даже в сложных текстовых блоках.
Используется для делегирования тултипов, когда элементы создаются динамически.
Преимущества:
Пример:
import {delegate} from 'tippy.js';
delegate('body', {
target: '.dynamic-item',
content: 'Делегированный тултип',
});
Тултип будет применяться ко всем элементам
.dynamic-item, включая добавленные позже.
Позволяет использовать один экземпляр тултипа для нескольких элементов.
Назначение:
Пример:
import {createSingleton} from 'tippy.js';
const instances = tippy('.items', {
content: 'Элемент',
});
createSingleton(instances, {
delay: 500,
});
Все элементы будут использовать один тултип, который перемещается между ними.
Добавляет возможность закрытия тултипа по нажатию клавиши Escape.
tippy('.esc', {
content: 'ESC для закрытия',
hideOnClick: true,
});
Хотя это поведение часто встроено, плагин может использоваться для расширенного контроля.
Некоторые плагины используют хуки жизненного цикла:
onCreateonShowonHideonDestroyПример внутри плагина:
const myPlugin = {
name: 'custom',
defaultValue: true,
fn(instance) {
return {
onShow() {
console.log('Показ');
},
};
},
};
Это позволяет внедрять дополнительную логику без изменения основного кода.
Плагины могут работать совместно, но важно учитывать:
Пример комплексной конфигурации:
tippy('.complex', {
content: 'Комплексный тултип',
followCursor: true,
sticky: true,
inlinePositioning: true,
plugins: [followCursor, sticky, inlinePositioning],
});
Каждый подключённый плагин добавляет обработчики и вычисления, что требует балансировки между функциональностью и производительностью.
sticky и followCursor на большом
количестве элементовГрамотное использование встроенных плагинов позволяет создавать сложные интерфейсы с минимальными затратами кода, сохраняя при этом высокую производительность и читаемость проекта.