При работе с библиотекой Tippy.js важно понимать,
как тултипы позиционируются относительно своих триггеров и как
контейнеры с CSS-свойством overflow: hidden или
overflow: auto могут влиять на отображение подсказок.
Неправильная настройка приводит к тому, что тултипы обрезаются или
располагаются некорректно.
Tippy.js использует Popper.js под капотом для
управления позиционированием. Это означает, что тултип создается как
отдельный DOM-элемент, который по умолчанию вставляется в конец
<body>, а не внутрь родительского контейнера
триггера. Такой подход позволяет тултипу оставаться видимым даже
при обрезании родительских блоков с overflow, поскольку он не
наследует ограничения родителя.
tippy('#myButton', {
content: 'Подсказка',
});
Здесь #myButton может находиться внутри любого
контейнера, но тултип будет позиционироваться относительно окна, а не
родителя.
appendToЕсли указать опцию appendTo и вставить тултип внутрь
контейнера с overflow: hidden, появляется обрезание:
tippy('#myButton', {
content: 'Подсказка',
appendTo: document.querySelector('#scrollContainer')
});
#scrollContainer с
overflow: hidden обрежет тултип.Вывод: использование appendTo должно
учитывать overflow-стили родителя.
Для контейнеров с overflow: auto или scroll
тултипы, вставленные внутрь родителя, не будут автоматически
следовать за прокруткой. Встроенные механизмы Popper.js
позволяют управлять этим через опцию popperOptions:
tippy('#myButton', {
content: 'Подсказка',
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport' // можно заменить на '#scrollContainer'
}
}
]
}
});
boundary: 'viewport' – тултип остаётся в пределах окна
браузера.boundary: '#scrollContainer' – тултип не выйдет за
границы скролл-контейнера.Использование модификатора preventOverflow важно, чтобы
тултип не обрезался при прокрутке.
Если родитель контейнера использует CSS-трансформации
(transform: scale(), translate()) или
perspective, это создаёт новый контекст
наложения. В этом случае тултипы, которые вставляются внутрь
<body>, могут неправильно выровняться по
координатам:
appendTo: document.body и полагаться на
Popper.js для вычисления позиции относительно окна.placement – определяет сторону
появления тултипа (top, bottom,
left, right, с вариантами -start,
-end).flip – позволяет автоматически менять
сторону при нехватке места.offset – задаёт смещение тултипа
относительно триггера.boundary – определяет, где Popper.js
будет предотвращать выход тултипа за пределы видимой области.appendTo – выбор контейнера для
вставки тултипа.Пример:
tippy('#myButton', {
content: 'Подсказка',
placement: 'top-start',
offset: [0, 8],
flip: true,
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport'
}
}
]
},
appendTo: document.body
});
<body> и избегает обрезки
контейнеров с overflow.<body> и
используется boundary с модальным контейнером.appendTo: document.body и рассчитывать смещение через
Popper.js.appendTo.Такой подход гарантирует, что тултипы будут видимы, корректно позиционированы и не будут обрезаны независимо от структуры контейнеров на странице.