Позиционирование всплывающих подсказок в Tippy.js строится на основе библиотеки Popper (в современных версиях — Floating UI). Основная задача — вычислить оптимальное положение tooltip относительно целевого элемента (reference element), учитывая границы окна, прокрутку и доступное пространство.
Каждый tooltip привязывается к конкретному DOM-элементу и отображается в одной из сторон:
topbottomleftrightДополнительно поддерживаются вариации выравнивания:
start — выравнивание по началуend — выравнивание по концуПример:
tippy(button, {
placement: 'top-start'
});
В этом случае tooltip появится сверху и будет выровнен по левому краю элемента.
Ключевой параметр управления позицией — placement.
Поддерживаемые значения:
top, top-start, top-end
bottom, bottom-start, bottom-end
left, left-start, left-end
right, right-start, right-end
Пример:
tippy('.btn', {
placement: 'right-end'
});
Особенности:
start, end) определяет
выравнивание по осиЕсли заданная позиция не помещается в видимой области, Tippy автоматически пытается изменить сторону отображения.
Это поведение контролируется модификатором flip.
Пример:
tippy('.btn', {
placement: 'top',
popperOptions: {
modifiers: [
{
name: 'flip',
options: {
fallbackPlacements: ['bottom', 'right']
}
}
]
}
});
Механизм работы:
topbottomrightТаким образом обеспечивается адаптивность интерфейса.
Часто требуется немного отодвинуть tooltip от элемента. Для этого
используется параметр offset.
Формат:
[offsetX, offsetY]
Пример:
tippy('.btn', {
offset: [0, 10]
});
Значения:
offsetX — смещение по горизонталиoffsetY — смещение по вертикалиПоложительное значение увеличивает расстояние между tooltip и элементом.
В некоторых сценариях tooltip должен следовать за курсором, а не фиксироваться относительно элемента.
tippy('.btn', {
followCursor: true
});
Режимы:
true — следование по обеим осям'horizontal''vertical''initial' — фиксируется в позиции первого
появленияОсобенности:
Tippy позволяет создавать tooltip без реального DOM-элемента, используя виртуальные координаты.
Пример:
tippy(document.body, {
getReferenceClientRect: () => ({
width: 0,
height: 0,
top: 100,
bottom: 100,
left: 200,
right: 200
})
});
Применение:
Tooltip не должен выходить за пределы контейнера или окна. Это
контролируется через boundary.
tippy('.btn', {
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport'
}
}
]
}
});
Варианты:
viewport — границы окнаwindowTippy поддерживает две стратегии позиционирования:
absolutefixedtippy('.btn', {
popperOptions: {
strategy: 'fixed'
}
});
Различия:
absolute
fixed
Используется при работе с фиксированными элементами интерфейса.
Позиция tooltip автоматически обновляется при:
Если tooltip находится внутри контейнера с
overflow: hidden, возможны обрезания. Решение —
использование appendTo.
tippy('.btn', {
appendTo: document.body
});
Это выносит tooltip за пределы ограничивающего контейнера.
Для тонкой настройки позиционирования используется
popperOptions.
Пример:
tippy('.btn', {
popperOptions: {
modifiers: [
{
name: 'offset',
options: {
offset: [5, 15]
}
},
{
name: 'preventOverflow',
options: {
padding: 10
}
}
]
}
});
Основные модификаторы:
offset — смещениеflip — смена стороныpreventOverflow — предотвращение выхода за границыarrow — позиционирование стрелкиСтрелка автоматически выравнивается относительно tooltip и reference-элемента.
tippy('.btn', {
arrow: true
});
Точная настройка:
tippy('.btn', {
popperOptions: {
modifiers: [
{
name: 'arrow',
options: {
padding: 8
}
}
]
}
});
padding задаёт минимальное расстояние стрелки от краёв
tooltip.
Позицию можно менять во время выполнения:
instance.setProps({
placement: 'bottom'
});
Применение:
Для элементов, занимающих несколько строк (например,
<span>), используется
inlinePositioning.
tippy('.text', {
inlinePositioning: true
});
Поведение:
При анимациях важно учитывать, что позиция может изменяться:
Tippy автоматически обновляет позицию при анимациях, если они влияют на layout.
Позиционирование — ресурсоёмкая операция. Для оптимизации:
followCursor, если не требуетсяПример делегирования:
tippy(document.body, {
target: '.btn'
});
В случаях с:
необходимо учитывать:
z-index)Часто используется комбинация:
tippy('.btn', {
appendTo: document.body,
popperOptions: {
strategy: 'fixed'
}
});
Иногда требуется вручную пересчитать позицию:
instance.popperInstance.update();
Используется при:
Если ни одна из позиций не подходит:
Контроль через:
flip: true,
fallbackPlacements: [...]
placement)offset, flip,
preventOverflow)Такой подход обеспечивает: