Переход с версии 5.x на 6.x в Tippy.js сопровождается существенной переработкой внутренней архитектуры. Ключевое изменение — более тесная интеграция с библиотекой Popper второго поколения (Popper 2), что влияет на позиционирование, модификаторы и производительность.
В версии 5 использовался Popper.js v1, который имел ограничения по кастомизации и расширяемости. В 6.x:
Это означает, что многие параметры, связанные с позиционированием, изменили поведение или были переименованы.
Некоторые параметры конфигурации были удалены или заменены:
flipBehavior → заменён на
fallbackPlacementsboundary → теперь задаётся через
popperOptionsdistance → заменён на offsetПример миграции:
5.x
tippy(element, {
distance: 10,
flipBehavior: ['top', 'bottom']
});
6.x
tippy(element, {
offset: [0, 10],
popperOptions: {
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'bottom']
}
}
]
}
});
offsetВ версии 5 distance задавал только отступ по основной
оси. В 6.x offset принимает массив:
offset: [skidding, distance]
skidding — смещение по поперечной осиdistance — смещение по основной осиЭто даёт более гибкий контроль над положением тултипа.
popperOptionsВ версии 6 добавлена возможность напрямую управлять Popper через
popperOptions.
Пример:
tippy(element, {
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
padding: 8
}
}
]
}
});
Это заменяет множество старых опций и даёт доступ к низкоуровневой настройке позиционирования.
В версии 5 темы подключались через CSS-классы, но структура классов была менее стандартизирована.
В 6.x:
Пример:
tippy(element, {
theme: 'light'
});
CSS:
.tippy-box[data-theme~='light'] {
background-color: #fff;
color: #333;
}
В версии 6 появилась полноценная система плагинов.
import tippy, { followCursor } from 'tippy.js';
tippy(element, {
plugins: [followCursor],
followCursor: true
});
В 5.x подобная функциональность часто была встроенной или реализовывалась через хаки. В 6.x:
Некоторые хуки были переработаны:
onShowonHideonMountonDestroyТеперь они работают более последовательно и синхронизированы с Popper 2.
Пример:
tippy(element, {
onShow(instance) {
console.log('Показ', instance);
}
});
В версии 6:
data-stateПример кастомной анимации:
.tippy-box[data-state='visible'] {
opacity: 1;
transform: scale(1);
}
.tippy-box {
opacity: 0;
transform: scale(0.95);
transition: all 0.2s ease;
}
Поведение allowHTML осталось, но стало более
безопасным:
tippy(element, {
content: '<strong>Текст</strong>',
allowHTML: true
});
Рекомендуется использовать проверенные источники HTML, так как библиотека не выполняет санитизацию.
trigger и взаимодействияхВ 6.x улучшена обработка событий:
mouseenter / focusПример:
tippy(element, {
trigger: 'mouseenter focus click'
});
Ключевые оптимизации:
Это особенно заметно при большом количестве тултипов на странице.
Методы остались схожими, но поведение стало более предсказуемым:
const instance = tippy(element);
instance.show();
instance.hide();
instance.destroy();
В 6.x:
Некоторые устаревшие функции были полностью удалены:
Это позволило упростить кодовую базу и уменьшить размер библиотеки.
В 6.x улучшена поддержка модульных сборщиков:
import tippy from 'tippy.js';
import 'tippy.js/dist/tippy.css';
Также:
npm install tippy.js@6
Необходимо:
distance,
flipBehavior)popperOptions.tippy-box)Если использовались дополнительные возможности:
Особое внимание:
Причина: изменения в Popper 2 Решение: использовать
popperOptions и модификаторы
Причина: переход с distance на offset
Решение: корректно задать массив [x, y]
Причина: отсутствие плагинов Решение: явно подключить нужные плагины
Причина: изменена структура DOM Решение: обновить CSS-селекторы
(.tippy-box, data-theme)
Возможности, появившиеся благодаря обновлению:
Пример кастомного модификатора:
tippy(element, {
popperOptions: {
modifiers: [
{
name: 'offset',
options: {
offset: [10, 20]
}
}
]
}
});
В 6.x структура тултипа стала более строгой:
<div class="tippy-box" data-theme="light">
<div class="tippy-content">
Контент
</div>
</div>
Это важно учитывать при кастомизации и работе с CSS.
Ключевые направления изменений:
Эти изменения делают библиотеку более гибкой, но требуют внимательной адаптации существующего кода.