Неправильный селектор элементов Одной из самых
частых ошибок является использование некорректного CSS-селектора при
вызове tippy(). Например:
tippy('.tooltip-item', {
content: 'Пример подсказки'
});
Если элементов с классом .tooltip-item нет на странице в
момент вызова, тултипы не создаются, и консоль ошибок не выдаст. Решение
— убедиться, что селектор существует, или использовать отложенную
инициализацию после загрузки DOM:
document.addEventListener('DOMContentLoaded', () => {
tippy('.tooltip-item', { content: 'Пример' });
});
Инициализация на динамически добавленных элементах
Tippy.js по умолчанию не отслеживает элементы, добавленные после
первоначальной инициализации. Частая ошибка — ожидание появления
тултипов на элементах, добавленных через JavaScript после
tippy(). Решение — повторный вызов tippy() или
использование делегирования:
tippy(document.body, {
content: 'Делегированный тултип',
allowHTML: true,
target: '.dynamic-tooltip',
placement: 'top',
trigger: 'mouseenter'
});
Неожиданное смещение тултипа Tippy.js использует
Popper.js для позиционирования. Если контейнер имеет
overflow: hidden или нестандартные CSS-трансформации
(transform: scale(), translate()), тултип
может смещаться. Решение — проверять родительские элементы на наличие
CSS-свойств, влияющих на позицию, и при необходимости использовать опцию
appendTo:
tippy('.tooltip-item', {
content: 'Тултип вне контейнера',
appendTo: () => document.body
});
Неверная установка placement Иногда
placement не работает ожидаемо из-за отсутствия места. Для
корректной работы лучше использовать комбинацию placement и
flip:
tippy('.tooltip-item', {
content: 'Позиция с флипом',
placement: 'top',
flip: true
});
Передача функции вместо строки Некорректная передача функции контента может приводить к неожиданным результатам:
// Некорректно
tippy('.tooltip-item', {
content: () => 'Динамический контент'
});
Правильный способ — использование опции allowHTML и
возврат DOM-элемента или строки:
tippy('.tooltip-item', {
content: document.createElement('div'), // или строка
allowHTML: true
});
Использование HTML без allowHTML При
вставке HTML в content без allowHTML: true код
будет отображаться как текст. Решение:
tippy('.tooltip-item', {
content: '<strong>Жирный текст</strong>',
allowHTML: true
});
Неправильная комбинация триггеров Tippy.js
поддерживает click, mouseenter,
focus и их комбинации. Если назначить click и
одновременно mouseenter, тултип может вести себя
непредсказуемо. Оптимально выбирать один основной триггер или
использовать делегирование.
Не закрывается при клике вне Ошибка возникает при
использовании interactive: true без правильной настройки
hideOnClick. Для корректного закрытия:
tippy('.tooltip-item', {
content: 'Интерактивный тултип',
interactive: true,
hideOnClick: true
});
Попытка изменить контент после инициализации без ссылки на
экземпляр Tippy.js возвращает массив или объект экземпляров.
Ошибка — попытка вызвать setContent на селекторе
напрямую:
// Некорректно
tippy('.tooltip-item').setContent('Новый текст');
Правильный способ:
const tip = tippy('.tooltip-item')[0]; // первый экземпляр
tip.setContent('Новый текст');
Ошибка с destroy и unmount Попытка уничтожить тултип на неинициализированном элементе вызовет ошибку. Всегда проверять существование экземпляра:
const tip = tippy('.tooltip-item')[0];
if (tip) tip.destroy();
Создание слишком большого количества тултипов Инициализация Tippy.js на сотнях элементов без делегирования приводит к задержкам и падению FPS. Решение — использовать делегирование или ленивую инициализацию через события:
tippy(document.body, {
content: 'Делегированный тултип',
target: '.tooltip-item',
delay: 100
});
Чрезмерное использование анимаций Сложные анимации
для каждого тултипа могут нагрузить браузер. Рекомендуется использовать
стандартные эффекты fade или scale и
минимизировать кастомные CSS-анимации для больших списков элементов.
Неверная установка defaultProps
Tippy.js позволяет задавать глобальные опции через
tippy.setDefaultProps. Ошибка — попытка установить свойства
после инициализации тултипов, что не повлияет на уже созданные
экземпляры. Решение — задавать глобальные настройки до первой
инициализации:
tippy.setDefaultProps({
placement: 'bottom',
animation: 'fade'
});
Конфликт локальных и глобальных опций Если локальные опции противоречат глобальным, Tippy.js использует приоритет локальных. Ошибкой считается ожидание, что глобальные настройки изменят поведение уже созданного тултипа. Решение — корректно комбинировать опции и проверять приоритеты.
Эта подборка охватывает самые распространённые ошибки при работе с Tippy.js и способы их устранения, позволяя создавать стабильные, предсказуемые и производительные тултипы.