Плагин sticky в библиотеке Tippy.js предназначен для
динамического обновления позиции tooltip’а в случаях, когда его опорный
элемент (reference) или сам tooltip изменяют своё положение на странице
после инициализации. Это особенно важно при работе с анимациями,
прокруткой, изменениями layout’а или при использовании нестатических
контейнеров.
По умолчанию Tippy вычисляет позицию один раз при показе подсказки.
Если после этого координаты элемента изменяются, tooltip остаётся на
старом месте. Плагин sticky устраняет это ограничение,
обеспечивая «прилипание» подсказки к целевому элементу.
Плагин необходимо явно импортировать и зарегистрировать:
import tippy, { sticky } from 'tippy.js';
tippy('.btn', {
content: 'Подсказка',
sticky: true,
plugins: [sticky],
});
Ключевые моменты:
sticky добавляется в массив pluginssticky активирует поведениеПлагин использует механизм непрерывного обновления позиции через
requestAnimationFrame. Это позволяет:
transform,
translate, scale)Обновление происходит до тех пор, пока tooltip активен.
stickyОпция sticky принимает несколько значений:
truesticky: true
"reference"sticky: 'reference'
Используется, когда:
"popper"sticky: 'popper'
tippy('.animated', {
content: 'Двигаюсь вместе с элементом',
sticky: true,
plugins: [sticky],
});
.animated {
animation: move 2s infinite alternate;
}
@keyframes move {
from {
transform: translateX(0);
}
to {
transform: translateX(200px);
}
}
Без sticky tooltip остаётся на исходной позиции. С
плагином он следует за элементом.
Tippy.js использует Popper.js для позиционирования. Плагин
sticky фактически принудительно вызывает обновление Popper
через:
instance.popperInstance.update();
Это происходит внутри цикла requestAnimationFrame, что
делает поведение плавным и синхронным с рендерингом браузера.
Постоянные обновления могут повлиять на производительность, особенно:
Рекомендации:
sticky только там, где это действительно
необходимоreference или
popper)followCursortippy('.cursor', {
followCursor: true,
sticky: true,
plugins: [sticky],
});
followCursor управляет положением относительно
курсораsticky дополнительно отслеживает изменения DOMappendTotippy('.item', {
appendTo: document.body,
sticky: true,
plugins: [sticky],
});
animationПлагин хорошо работает с CSS-анимациями:
tippy('.box', {
animation: 'scale',
sticky: true,
plugins: [sticky],
});
Вложенные скролл-контейнеры часто вызывают проблемы с
позиционированием. sticky решает их автоматически:
tippy('.inside-scroll', {
sticky: true,
plugins: [sticky],
});
Tooltip остаётся привязанным даже при прокрутке родительского блока, а не только окна.
z-indexoverflow: hiddenПри некорректной работе:
pluginssticky установлен в true
или нужное значениеtransform) у
родительских элементовoverflow: hiddenПри активации tooltip:
requestAnimationFrame)update()Это гарантирует, что обновления происходят только при необходимости.
stickyВместо использования плагина можно вручную вызывать:
instance.popperInstance.update();
Однако:
Плагин sticky инкапсулирует эту логику и делает её
декларативной.
| Режим | Отслеживание reference | Отслеживание tooltip |
|---|---|---|
true |
да | да |
"reference" |
да | нет |
"popper" |
нет | да |
requestAnimationFrameimport tippy, { sticky } from 'tippy.js';
tippy('.card', {
content: 'Информация',
placement: 'top',
animation: 'shift-away',
sticky: 'reference',
plugins: [sticky],
});
Такой вариант: