Intro.js — это библиотека для создания интерактивных пошаговых руководств по веб-интерфейсу. Одним из ключевых аспектов удобства использования является автоматическое определение позиции подсказки относительно целевого элемента. Этот механизм позволяет подсказкам появляться в оптимальном месте, не перекрывая важные части интерфейса.
Intro.js поддерживает несколько предопределённых позиций:
top, right, bottom,
left. Если позиция явно не задана, библиотека использует
алгоритм автоматического выбора:
viewport) и координаты целевого
элемента.Таким образом, подсказка автоматически размещается там, где она наименее мешает содержимому страницы и остаётся полностью видимой пользователю.
position и автоматический режимПри создании шага можно указать position:
introJs().setOptions({
steps: [
{
element: '#myButton',
intro: 'Нажмите эту кнопку, чтобы продолжить',
position: 'auto'
}
]
}).start();
Значение auto активирует автоматический выбор
позиции, основанный на описанном выше алгоритме. Если указаны
конкретные позиции (top, right и т.д.),
Intro.js будет использовать их как приоритетные, но если выбран
auto, библиотека динамически подбирает оптимальное
расположение.
Intro.js учитывает:
window.addEventListener('resize', function() {
introJs().refresh();
});
Метод refresh() пересчитывает позиции всех активных
шагов, что особенно важно для мобильных интерфейсов и динамических
элементов.
Можно расширить стандартное поведение через параметры:
tooltipClass — добавление собственных CSS-классов для
изменения визуальной позиции или анимации.positionPrecedence — массив приоритетов, позволяющий
задать порядок, в котором Intro.js проверяет возможные позиции:introJs().setOptions({
steps: [{
element: '#menu',
intro: 'Главное меню',
position: 'auto',
positionPrecedence: ['bottom', 'right', 'top', 'left']
}]
}).start();
В этом примере библиотека сначала попробует разместить подсказку снизу, затем справа и так далее, обеспечивая более гибкий контроль над отображением.
overflow: hidden:
автоматическое позиционирование может обрезать подсказку. Решение —
использовать scrollToElement: true и увеличить
padding вокруг контейнера.Для сложных интерфейсов можно использовать событие
onbeforechange, чтобы динамически изменять подсказку или
принудительно пересчитывать позицию:
introJs().onbeforechange(function(targetElement) {
if (targetElement.id === 'dynamicSection') {
introJs().refresh();
}
});
Это позволяет корректно обрабатывать элементы, появляющиеся после AJAX-загрузки или анимаций.
refresh() и события onbeforechange
позволяют поддерживать корректное позиционирование при динамических
изменениях страницы.positionPrecedence и CSS-классы даёт
полный контроль над визуальным поведением подсказок.Автоматическое позиционирование — один из самых сильных инструментов Intro.js, позволяющий создавать интуитивные и адаптивные интерактивные руководства без необходимости вручную управлять расположением каждой подсказки.