Параметр content — ключевой элемент конфигурации
Tippy.js, определяющий, что именно будет отображаться внутри всплывающей
подсказки. Он поддерживает различные типы данных:
Простейший пример:
tippy(button, {
content: 'Подсказка'
});
Наиболее распространённый вариант — передача обычной строки:
tippy('.btn', {
content: 'Нажмите для продолжения'
});
Особенности:
allowHTML)Для более сложных интерфейсов используется HTML:
tippy('.btn', {
content: '<strong>Важно:</strong> подтвердите действие',
allowHTML: true
});
Ключевой параметр:
allowHTML: true — разрешает интерпретацию HTMLБез него HTML будет отображаться как текст.
Можно передавать существующие элементы:
const template = document.getElementById('tooltip-template');
tippy('.btn', {
content: template
});
Преимущества:
Важно:
content: template.cloneNode(true)
Функция позволяет генерировать содержимое на лету:
tippy('.btn', {
content(reference) {
return `ID элемента: ${reference.id}`;
}
});
Аргумент reference — элемент, на который наведен
курсор.
Использование:
Поддерживается загрузка данных с сервера:
tippy('.btn', {
content: 'Загрузка...',
onShow(instance) {
fetch('/api/data')
.then(res => res.text())
.then(data => {
instance.setContent(data);
});
}
});
Особенности:
instance.setContent()Содержимое можно менять динамически:
const tip = tippy('.btn', {
content: 'Начальный текст'
});
tip.setContent('Обновленный текст');
Для множественных элементов:
tip.forEach(instance => {
instance.setContent('Новый текст');
});
По умолчанию Tippy.js использует атрибут title:
<button title="Подсказка"></button>
Инициализация:
tippy('button');
Дополнительно можно использовать data-tippy-content:
<button data-tippy-content="Подсказка"></button>
Преимущества:
Для переноса строк:
tippy('.btn', {
content: 'Первая строка<br>Вторая строка',
allowHTML: true
});
Или через CSS:
.tippy-box {
white-space: pre-line;
}
content: 'Первая строка\nВторая строка'
Использование allowHTML: true может привести к
XSS-уязвимостям:
tippy('.btn', {
content: userInput,
allowHTML: true // потенциально опасно
});
Рекомендации:
Внутри tooltip можно использовать:
Пример:
tippy('.btn', {
content: `
<div class="tooltip-content">
<h4>Заголовок</h4>
<p>Описание</p>
<button>ОК</button>
</div>
`,
allowHTML: true
});
Для взаимодействия (клики, формы):
tippy('.btn', {
content: '<button id="inside">Нажми</button>',
allowHTML: true,
interactive: true
});
Параметр:
interactive: true — позволяет взаимодействовать с
содержимымБез него tooltip исчезнет при попытке клика.
Если content пустой:
content: ''
Tooltip не будет показан.
Это можно использовать для условного отображения:
content(reference) {
return reference.dataset.tooltip || '';
}
По умолчанию функция content вызывается при каждом
показе. Для оптимизации:
let cached;
tippy('.btn', {
content() {
if (!cached) {
cached = 'Вычисленное значение';
}
return cached;
}
});
Шаблоны позволяют централизовать разметку:
<template id="tpl">
<div class="tooltip">
<span class="text"></span>
</div>
</template>
tippy('.btn', {
content(reference) {
const tpl = document.getElementById('tpl').content.cloneNode(true);
tpl.querySelector('.text').textContent = reference.dataset.text;
return tpl;
}
});
1. Подсказка с форматированием:
tippy('.info', {
content: '<em>Дополнительная информация</em>',
allowHTML: true
});
2. Контекстная подсказка:
tippy('.item', {
content(el) {
return `Элемент: ${el.dataset.name}`;
}
});
3. Tooltip с шаблоном:
tippy('.card', {
content() {
return document.querySelector('#card-tooltip').cloneNode(true);
}
});
4. Подгрузка данных:
tippy('.user', {
content: 'Загрузка...',
onShow(instance) {
fetch(`/user/${instance.reference.dataset.id}`)
.then(r => r.text())
.then(html => instance.setContent(html));
}
});
Параметр content тесно связан с:
allowHTML — интерпретация HTMLinteractive — возможность взаимодействияmaxWidth — ограничение шириныtheme — оформлениеplacement — позиционирование (влияет на восприятие
содержимого)Локализация:
const translations = {
ru: 'Привет',
en: 'Hello'
};
tippy('.btn', {
content() {
return translations[currentLang];
}
});
Реактивное обновление:
const instance = tippy('.btn', {
content: '0'
});
setInterval(() => {
instance.setContent(Date.now());
}, 1000);
Интеграция с фреймворками:
В React/Vue часто используется рендер через виртуальный DOM, но Tippy остаётся источником контейнера для отображения.
allowHTML при использовании HTMLinteractive при наличии кнопокПараметр content превращает Tippy.js из простой
подсказки в полноценный инструмент отображения динамического интерфейса,
позволяя управлять не только текстом, но и сложной логикой
взаимодействия и визуализации.