Библиотека Tippy.js позволяет конфигурировать всплывающие подсказки
(tooltips) не только через JavaScript, но и напрямую в HTML с помощью
data-* атрибутов. Такой подход упрощает интеграцию,
особенно в проектах с большим количеством однотипных элементов, а также
в ситуациях, где логика и разметка должны быть максимально связаны.
Механизм основан на автоматическом считывании атрибутов, начинающихся
с data-tippy-*, и преобразовании их в соответствующие опции
конфигурации.
<button data-tippy-content="Подсказка">Наведи курсор</button>
<script>
tippy('[data-tippy-content]');
</script>
data-tippy-content задаёт текст подсказки[data-tippy-content] автоматически находит все
элементы с этим атрибутомКаждая опция Tippy может быть задана через HTML-атрибут. Формат следующий:
data-tippy-<имя-опции>
Примеры:
| Опция JS | data-атрибут |
|---|---|
| content | data-tippy-content |
| placement | data-tippy-placement |
| animation | data-tippy-animation |
| theme | data-tippy-theme |
| delay | data-tippy-delay |
| arrow | data-tippy-arrow |
| interactive | data-tippy-interactive |
<button
data-tippy-content="Снизу"
data-tippy-placement="bottom">
Кнопка
</button>
<button
data-tippy-content="Анимация scale"
data-tippy-animation="scale">
Кнопка
</button>
<button
data-tippy-content="Тёмная тема"
data-tippy-theme="dark">
Кнопка
</button>
Булевы значения передаются строками:
<button
data-tippy-content="Интерактивный tooltip"
data-tippy-interactive="true">
Наведи курсор
</button>
Особенности:
"true" → true"false" → falseНекоторые опции принимают числа или массивы чисел:
<button
data-tippy-content="Задержка"
data-tippy-delay="[100, 200]">
Кнопка
</button>
В данном случае:
Строка автоматически парсится в массив.
<button
data-tippy-content="<strong>Жирный текст</strong>"
data-tippy-allowHTML="true">
Наведи
</button>
Ключевые моменты:
allowHTML="true" обязателен для рендеринга HTMLМожно инициализировать все подсказки сразу:
tippy('[data-tippy-content]');
Либо комбинировать с дополнительными настройками:
tippy('[data-tippy-content]', {
animation: 'fade',
theme: 'light'
});
При этом:
data-* имеют приоритет над глобальными
настройкамиЕсли элемент уже содержит data-*, их можно
переопределить:
<button
id="btn"
data-tippy-content="HTML значение">
Кнопка
</button>
tippy('#btn', {
content: 'JS значение'
});
Результат:
JS значение, а не HTML-атрибутВозможна интеграция с собственными атрибутами:
<button data-tooltip="Своя подсказка">Кнопка</button>
tippy('[data-tooltip]', {
content(reference) {
return reference.getAttribute('data-tooltip');
}
});
Преимущества:
<ul>
<li data-tippy-content="Элемент 1">1</li>
<li data-tippy-content="Элемент 2">2</li>
<li data-tippy-content="Элемент 3">3</li>
</ul>
tippy('li');
Подход позволяет:
const btn = document.querySelector('button');
btn.setAttribute('data-tippy-content', 'Новое значение');
Однако:
Для обновления:
const instance = tippy(btn);
instance.setContent('Новое значение');
1. Типизация данных
Все значения приходят как строки, и Tippy выполняет попытку преобразования:
"true" → boolean"123" → number"[1,2]" → arrayОшибки в формате приводят к некорректной работе.
2. Сложные объекты
Нельзя передавать функции через HTML:
<!-- НЕ РАБОТАЕТ -->
data-tippy-onShow="function() { ... }"
Для таких случаев используется только JavaScript.
3. Производительность
При большом количестве элементов:
Часто используется сочетание:
data-*<button
class="tooltip"
data-tippy-content="Текст"
data-tippy-theme="light">
Кнопка
</button>
tippy('.tooltip', {
onShow(instance) {
console.log('Показ:', instance.reference);
}
});
Использование data-атрибутов оправдано, если:
Использование JavaScript предпочтительно, если:
Для читаемости рекомендуется:
<button
data-tippy-content="Информация"
data-tippy-placement="right"
data-tippy-theme="dark"
data-tippy-delay="[100, 0]"
>
Кнопка
</button>
В рамках React, Vue или Angular:
data-* удобно использовать в шаблонахПример (условный):
useEffect(() => {
tippy('[data-tippy-content]');
}, []);
При проблемах:
tippy()Полезно выводить:
console.log(element.dataset);
Можно комбинировать с CSS:
[data-tippy-theme='custom'] {
color: red;
}
И HTML:
<button
data-tippy-content="Кастом"
data-tippy-theme="custom">
Кнопка
</button>
tippy(document.body, {
target: '[data-tippy-content]'
});
Преимущества:
data-*Такой подход делает код: