Ограничения и безопасность

Tippy.js — это современная библиотека для создания всплывающих подсказок и тултипов на веб-страницах. Несмотря на простоту использования, существует ряд ограничений и аспектов безопасности, которые необходимо учитывать при работе с этой библиотекой. Их понимание критично для создания стабильного и безопасного интерфейса.


Ограничения функциональности

1. Контент тултипов

Tippy.js позволяет задавать контент различными способами: через текст, HTML, или функции, возвращающие элементы. При использовании HTML-контента необходимо учитывать:

  • Tippy.js вставляет HTML напрямую в DOM, что может привести к конфликтам с существующими элементами.
  • Внутренние скрипты в HTML-контенте не выполняются по соображениям безопасности. Если требуется динамическое выполнение JavaScript, нужно использовать callback-функцию onShow или onMount.

Пример:

tippy('#button', {
  content: '<strong>Важная подсказка</strong>',
  allowHTML: true
});

2. Размер и сложность контента

Большие или сложные тултипы могут негативно влиять на производительность, особенно при использовании анимаций и позиционирования для большого числа элементов на странице. Рекомендуется:

  • Ограничивать количество DOM-элементов внутри тултипа.
  • Минимизировать использование сложных CSS-трансформаций внутри подсказок.
  • При большом количестве элементов рассмотреть виртуализацию или динамическую генерацию контента.

3. Ограничения позиционирования

Tippy.js использует Popper.js для позиционирования тултипов. Ограничения Popper.js влияют на Tippy.js напрямую:

  • Элементы могут быть скрытыми при переполнении контейнера (overflow: hidden) или ограниченных границах.
  • Автоматическое определение направления тултипа может быть некорректным при сложной вложенной верстке.
  • Не рекомендуется использовать одновременно несколько сложных стратегий flip и preventOverflow без тестирования на всех размерах экрана.
tippy('#example', {
  placement: 'auto',
  flip: true,
  boundary: 'viewport'
});

Безопасность

1. XSS (Cross-Site Scripting)

Использование HTML-контента открывает потенциальную угрозу XSS. Вставка данных, полученных от пользователя, напрямую в тултип может привести к выполнению вредоносного кода. Правила безопасности:

  • Всегда очищать пользовательский ввод перед использованием в content.
  • Для динамических HTML-контентов использовать библиотеки для санитизации, например DOMPurify.
  • Ограничить включение HTML только для доверенного контента.
import DOMPurify from 'dompurify';

tippy('#button', {
  content: DOMPurify.sanitize(userInput),
  allowHTML: true
});

2. Защита от UI-инъекций

Tippy.js позволяет передавать функции в content, которые возвращают элементы. Это безопаснее, чем прямое HTML, но важно:

  • Не вставлять элементы с небезопасными атрибутами.
  • Проверять атрибуты href, src и другие ссылки на потенциально вредоносные ресурсы.

3. Управление событиями

Tippy.js может использовать события мыши и фокуса для показа тултипов. Неправильная настройка событий может привести к:

  • Перекрытию важных элементов интерфейса.
  • Невидимым, но интерактивным тултипам, которые могут быть использованы для фишинга.

Рекомендуется:

  • Использовать trigger явно (mouseenter, focus) и отключать события по умолчанию, если они не нужны.
  • Проверять z-index и порядок наложения элементов.
tippy('#input', {
  trigger: 'focus',
  interactive: true
});

Ограничения совместимости

1. Браузеры и мобильные устройства

  • Tippy.js поддерживает все современные браузеры, но старые версии IE не гарантируют корректную работу.
  • На мобильных устройствах hover-события заменяются на касание, что может изменить UX тултипов.

2. CSS-ограничения

  • Некоторые CSS-свойства, такие как overflow: hidden или transform, могут повлиять на позиционирование.
  • Не все анимации будут одинаково плавными на слабых устройствах.

Практические рекомендации

  • Минимизировать вставку HTML и отдавать предпочтение тексту.
  • Санитизировать пользовательский ввод.
  • Ограничивать количество тултипов на странице.
  • Тестировать на разных разрешениях и устройствах.
  • Проверять конфликты с CSS и другими библиотеками.

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