В Tippy.js каждая всплывающая подсказка создаётся как отдельный DOM-элемент с собственным деревом узлов. Это позволяет полностью контролировать поведение элементов внутри тултипа, включая обработку кликов, событий мыши и взаимодействие с формами. По умолчанию Tippy.js закрывает тултип при клике вне него, однако иногда требуется, чтобы клики внутри тултипа не приводили к его закрытию. Для этого используется сочетание настроек и кастомных обработчиков.
Свойство interactive определяет, будет
ли тултип реагировать на взаимодействие пользователя внутри себя:
tippy('#button', {
content: '<button id="insideButton">Нажми меня</button>',
interactive: true,
});
interactive: true позволяет оставлять тултип открытым
при наведении или кликах на его содержимое.Для полной обработки кликов внутри тултипа можно использовать событие
onClick в сочетании с interactive:
tippy('#button', {
content: '<div id="popupContent"><button>Клик внутри</button></div>',
interactive: true,
trigger: 'click',
hideOnClick: false,
});
Пояснение ключевых опций:
trigger: 'click' – тултип открывается по клику на
элемент.hideOnClick: false – тултип не скрывается автоматически
при клике внутри него.interactive: true – делает содержимое интерактивным,
позволяя реагировать на события мыши и клики внутри тултипа.Можно добавлять обработчики к конкретным элементам внутри тултипа:
const tip = tippy('#button', {
content: '<button id="actionBtn">Действие</button>',
interactive: true,
trigger: 'click',
});
tip[0].popper.addEventListener('click', (event) => {
if (event.target.id === 'actionBtn') {
console.log('Кнопка внутри тултипа нажата');
}
});
tip[0].popper – это корневой элемент тултипа в
DOM.click,
mouseover, keydown и любые другие стандартные
события.Такой подход удобен, когда тултип содержит формы, кнопки или элементы управления, которые должны оставаться интерактивными без закрытия тултипа.
Tippy.js позволяет менять содержимое тултипа на лету, не создавая новый экземпляр:
const tip = tippy('#button', {
content: 'Первый текст',
interactive: true,
trigger: 'click',
});
document.querySelector('#button').addEventListener('click', () => {
tip[0].setContent('<button id="dynamicBtn">Новая кнопка</button>');
});
setContent все события внутри нового
содержимого нужно переназначить, если они нужны.Для форм внутри тултипа важно, чтобы события ввода не закрывали тултип:
tippy('#formButton', {
content: `
<form id="popupForm">
<input type="text" placeholder="Введите текст" />
<button type="submit">Отправить</button>
</form>
`,
interactive: true,
trigger: 'click',
hideOnClick: false,
});
interactive: true предотвращает
скрытие тултипа при фокусе на input.submit событие, без риска закрытия тултипа.Если тултип содержит большое количество интерактивных элементов, удобнее использовать делегирование:
const tip = tippy('#button', {
content: `
<div id="container">
<button class="item">Элемент 1</button>
<button class="item">Элемент 2</button>
</div>
`,
interactive: true,
trigger: 'click',
hideOnClick: false,
});
tip[0].popper.addEventListener('click', (event) => {
if (event.target.classList.contains('item')) {
console.log('Нажат элемент:', event.target.textContent);
}
});
interactive: true +
hideOnClick: false – основной шаблон для
интерактивных тултипов.tip.hide() или tip[0].hide().interactive: true, чтобы пользовательский фокус не приводил
к закрытию.popper-события
напрямую, это дает полный контроль над содержимым.Эти техники позволяют создавать полностью интерактивные тултипы в Tippy.js, где клики и действия внутри содержимого обрабатываются гибко, без случайного закрытия.