Взаимодействие между плагинами

Tippy.js — это гибкая библиотека для создания тултипов, которая опирается на Popper.js для позиционирования. При работе с другими плагинами и библиотеками важно понимать, что Tippy.js проектирован с модульной архитектурой: его поведение можно расширять и модифицировать через плагины, а также через сторонние библиотеки, изменяющие DOM или события.

Ключевые моменты:

  • Tippy.js использует события mouseenter, focus, click и mouseleave для управления видимостью тултипов.
  • Любой плагин, который изменяет эти события на элементах, может вмешиваться в работу тултипов.
  • Для сохранения совместимости рекомендуется использовать делегирование событий и методы instance.setProps() и instance.destroy() вместо прямого манипулирования DOM.

Интеграция с библиотеками управления формами и UI

Многие UI-библиотеки (например, Select2, Choices.js, Flatpickr) создают динамические элементы, добавляют обертки и изменяют DOM. Для корректного взаимодействия Tippy.js применяет стратегию динамического привязывания элементов:

const instance = tippy(document.querySelectorAll('.tooltip-target'), {
  content: 'Пример тултипа',
  allowHTML: true,
  appendTo: document.body
});
  • appendTo гарантирует, что тултип будет добавлен в DOM вне зависимости от структуры, создаваемой сторонним плагином.
  • observeChanges позволяет Tippy.js автоматически реагировать на изменения содержимого элемента.
tippy('.tooltip-target', {
  content: 'Тултип с наблюдением за DOM',
  observeChanges: true
});

Использование observeChanges критично при интеграции с плагинами, которые динамически обновляют контент (например, интерактивные списки или динамически создаваемые кнопки).


Совместная работа с анимационными библиотеками

Tippy.js предоставляет встроенные анимации, но часто необходимо сочетать их с библиотеками вроде GSAP или Anime.js. В таких случаях важно разделять позиционирование и визуальные эффекты:

  • Поправка позиции: Popper.js управляет смещением тултипа (offset), это необходимо учитывать при запуске кастомной анимации.
  • События lifecycle: Tippy.js предоставляет хуки onShow, onHide, onMount и onHidden, которые идеально подходят для интеграции с анимациями.

Пример интеграции с GSAP:

tippy('.tooltip-target', {
  content: 'Анимированный тултип',
  onShow(instance) {
    gsap.fromTo(instance.popper, { opacity: 0, y: -10 }, { opacity: 1, y: 0, duration: 0.3 });
  },
  onHide(instance) {
    gsap.to(instance.popper, { opacity: 0, y: -10, duration: 0.2 });
  }
});

Эта структура позволяет тултипу корректно позиционироваться, одновременно используя мощные анимации.


Делегирование и работа с динамическим контентом

Для динамически создаваемых элементов, которые добавляются в DOM после инициализации страницы, Tippy.js поддерживает делегирование:

tippy.delegate(document.body, {
  target: '.dynamic-tooltip',
  content(reference) {
    return reference.getAttribute('data-tooltip');
  },
  allowHTML: true
});
  • delegate создает один глобальный обработчик, который автоматически применяет тултипы к новым элементам.
  • Это особенно полезно при работе с плагинами, которые генерируют элементы на лету (например, виртуальные списки, таблицы с подгрузкой данных).

Влияние других плагинов на позиционирование

Плагины, изменяющие размеры или структуру DOM, могут нарушить корректное позиционирование тултипов. Для компенсации необходимо:

  • Использовать instance.popperInstance.update() после изменений размера элемента.
  • Настраивать popperOptions для дополнительного контроля:
tippy('.tooltip-target', {
  content: 'Тултип с кастомным Popper.js',
  popperOptions: {
    modifiers: [
      {
        name: 'preventOverflow',
        options: {
          padding: 8
        }
      }
    ]
  }
});
  • Следить за элементами с position: fixed или transform в родителях, так как это влияет на Popper.js.

Использование нескольких тултипов на одном элементе

Tippy.js позволяет создавать несколько тултипов для одного элемента. При этом необходимо учитывать:

  • Уникальные instance для каждого тултипа.
  • Управление событиями через trigger и interactive.

Пример:

const firstTip = tippy('.btn', { content: 'Первый' });
const secondTip = tippy('.btn', { content: 'Второй', trigger: 'click' });
  • firstTip срабатывает на hover, secondTip на click.
  • Можно комбинировать с другими плагинами, не блокируя работу основного тултипа.

Практика предотвращения конфликтов

  • Использовать appendTo: document.body, чтобы тултипы не зависели от структуры стороннего DOM.
  • Вызывать instance.destroy() при удалении элемента через сторонние плагины.
  • Не изменять события напрямую на элементах с тултипами — лучше использовать Tippy.js API.
  • Делегирование для динамических элементов сокращает конфликты и предотвращает утечки памяти.

Эти подходы обеспечивают корректную работу Tippy.js вместе с другими плагинами, позволяя сохранять стабильное позиционирование, анимацию и реакцию на события независимо от изменений в DOM.