Плагин inlinePositioning в библиотеке Tippy.js
предназначен для корректного позиционирования тултипов, привязанных к
встроенным (inline) элементам. В отличие от блочных элементов,
встроенные элементы могут занимать несколько строк, разрываться
переносами и иметь сложную геометрию. Стандартные алгоритмы
позиционирования не всегда учитывают эти особенности, что приводит к
неточному размещению тултипа.
inlinePositioning решает эту проблему, позволяя
вычислять позицию относительно конкретного фрагмента текста или части
inline-элемента, а не всей его bounding-box области.
Встроенные элементы (<span>,
<a>, <strong> и др.) могут:
При использовании стандартного позиционирования:
Пример:
<p>
Длинный текст с <span id="target">интерактивным элементом</span>, который может переноситься.
</p>
Без inlinePositioning тултип будет позиционироваться
относительно всей области span, даже если пользователь
взаимодействует только с частью текста.
Плагин использует API браузера getClientRects(), которое
возвращает список прямоугольников, занимаемых inline-элементом. В
зависимости от позиции курсора или выбранной стратегии, выбирается
наиболее подходящий прямоугольник.
Ключевые особенности:
import tippy, { inlinePositioning } from 'tippy.js';
tippy('#target', {
content: 'Tooltip',
plugins: [inlinePositioning],
inlinePositioning: true,
});
Важно:
pluginsinlinePositioning должно быть явно
включеноПри наведении на inline-элемент:
getClientRects)Это особенно важно для:
<style>
.box {
width: 150px;
}
</style>
<div class="box">
<span id="multi">
Это длинный текст, который точно перенесётся на несколько строк
</span>
</div>
tippy('#multi', {
content: 'Многострочный tooltip',
plugins: [inlinePositioning],
inlinePositioning: true,
});
Результат:
inlinePositioning работает совместно с параметром
placement, но уточняет точку привязки.
Пример:
tippy('#target', {
content: 'Tooltip',
placement: 'top',
plugins: [inlinePositioning],
inlinePositioning: true,
});
Даже при placement: 'top':
Плагин особенно эффективен при использовании
followCursor:
import tippy, { inlinePositioning, followCursor } from 'tippy.js';
tippy('#target', {
content: 'Tooltip',
followCursor: true,
plugins: [inlinePositioning, followCursor],
inlinePositioning: true,
});
Комбинация даёт:
getClientRects (поддерживается во
всех современных браузерах)Использование getClientRects():
getBoundingClientRect()Однако:
1. Подсказки в тексте
<p>
Нажмите на <span class="hint">это слово</span> для подсказки.
</p>
tippy('.hint', {
content: 'Дополнительная информация',
plugins: [inlinePositioning],
inlinePositioning: true,
});
2. Работа с длинными ссылками
<a href="#" id="link">
Очень длинная ссылка, которая может переноситься на несколько строк
</a>
Без плагина:
С плагином:
3. Интерактивные редакторы
В редакторах текста:
inlinePositioning обеспечивает:
| Поведение | Без inlinePositioning | С inlinePositioning |
|---|---|---|
| Многострочный элемент | центр всей области | конкретная строка |
| Точность | низкая | высокая |
| Работа с курсором | ограниченная | точная |
| UX | хуже | лучше |
inlinePositioning корректно работает с:
followCursorstickyoffsetflipshiftВажно учитывать порядок подключения:
plugins: [inlinePositioning, followCursor]
Применение оправдано в случаях:
Не требуется:
import tippy, { inlinePositioning } from 'tippy.js';
tippy('.inline-element', {
content: 'Точный tooltip',
placement: 'top',
plugins: [inlinePositioning],
inlinePositioning: true,
});
Такой подход обеспечивает корректную работу тултипов в сложных текстовых интерфейсах, где стандартные методы позиционирования оказываются недостаточно точными.