Библиотека Intro.js предназначена для создания интерактивных пошаговых подсказок и туров по интерфейсу. Один из ключевых сценариев её использования — организация навигации по разделам сайта, особенно в сложных интерфейсах с большим количеством элементов и функциональности.
Навигация реализуется через последовательность шагов, каждый из которых привязан к определённому DOM-элементу. Пользователь последовательно проходит по разделам, получая пояснения и визуальные акценты.
Для начала необходимо подключить библиотеку:
<link rel="stylesheet" href="introjs.css">
<script src="intro.js"></script>
Базовая инициализация:
introJs().start();
Для управления навигацией по разделам используется более детальная конфигурация.
Каждый шаг описывает конкретный раздел сайта. Это можно сделать через атрибуты в HTML:
<div data-intro="Главная страница" data-step="1">...</div>
<div data-intro="Каталог товаров" data-step="2">...</div>
<div data-intro="Корзина" data-step="3">...</div>
Либо программно:
introJs().setOptions({
steps: [
{
element: document.querySelector('#home'),
intro: 'Главная страница'
},
{
element: document.querySelector('#catalog'),
intro: 'Каталог товаров'
},
{
element: document.querySelector('#cart'),
intro: 'Корзина'
}
]
}).start();
Программный способ предпочтителен при динамической структуре сайта.
Intro.js автоматически управляет переходами между шагами, однако поведение можно настраивать:
introJs().onchange(function(targetElement) {
console.log('Переход к элементу:', targetElement);
});
Это позволяет:
При использовании SPA (например, с роутерами) важно синхронизировать Intro.js с маршрутизацией:
introJs().onbeforechange(function(targetElement) {
if (targetElement.id === 'catalog') {
window.location.hash = '#catalog';
}
});
В более сложных приложениях:
introJs().onbeforechange(function(targetElement) {
switch (targetElement.id) {
case 'home':
router.navigate('/');
break;
case 'catalog':
router.navigate('/catalog');
break;
}
});
Для удобной навигации важно предусмотреть:
Настройки:
introJs().setOptions({
showStepNumbers: true,
showBullets: true,
exitOnOverlayClick: false,
keyboardNavigation: true
});
Кнопки управления:
Каждый раздел может иметь уникальный стиль:
introJs().setOptions({
steps: [
{
element: '#home',
intro: 'Главная',
tooltipClass: 'customTooltip'
}
]
});
CSS:
.customTooltip {
background-color: #222;
color: #fff;
}
Если разделы загружаются асинхронно:
introJs().onbeforechange(function(targetElement) {
if (!targetElement) return;
if (targetElement.id === 'lazy-section') {
loadSectionData();
}
});
Важно убедиться, что элемент существует перед показом:
if (document.querySelector('#lazy-section')) {
introJs().start();
}
Иногда необходимо показывать разные шаги в зависимости от условий:
const steps = [];
if (user.isAdmin) {
steps.push({
element: '#admin-panel',
intro: 'Панель администратора'
});
}
steps.push({
element: '#profile',
intro: 'Профиль пользователя'
});
introJs().setOptions({ steps }).start();
При переходе между разделами часто требуется:
Пример:
introJs().onbeforechange(function(targetElement) {
if (targetElement.id === 'menu-item') {
document.querySelector('#menu').classList.add('open');
}
});
Прокрутка:
introJs().onchange(function(targetElement) {
targetElement.scrollIntoView({
beh * avior: 'smooth',
block: 'center'
});
});
Иногда требуется запретить переход дальше:
introJs().onbeforechange(function(targetElement) {
if (!formIsValid()) {
return false;
}
});
Это предотвращает переход к следующему разделу до выполнения условий.
Для повторного запуска тура:
introJs().start();
Для сохранения прогресса:
introJs().oncomplete(function() {
localStorage.setItem('introCompleted', true);
});
Проверка:
if (!localStorage.getItem('introCompleted')) {
introJs().start();
}
Навигация может запускаться не только автоматически:
document.querySelector('#help-btn').addEventListener('click', function() {
introJs().start();
});
Или переход к конкретному разделу:
introJs().goToStep(2).start();
При большом количестве шагов:
Пример оптимизации:
const intro = introJs();
intro.setOptions({
steps: generateStepsDynamically()
});
Элемент отсутствует в DOM
element: document.querySelector('#missing')
Решение — проверка перед добавлением шага.
Скрытые элементы Intro.js не может корректно позиционировать подсказки.
Решение — показывать элемент заранее.
Конфликт с CSS Некоторые стили (overflow, z-index) могут ломать отображение.
Разделение тура на несколько этапов:
function startMainTour() {
introJs().setOptions({ steps: mainSteps }).start();
}
function startAdvancedTour() {
introJs().setOptions({ steps: advancedSteps }).start();
}
function getStepsByRole(role) {
switch(role) {
case 'admin':
return adminSteps;
case 'user':
return userSteps;
}
}
Грамотно реализованная навигация с Intro.js включает:
Такая реализация превращает интерактивный тур в полноценный инструмент ориентирования по разделам сайта и значительно упрощает освоение интерфейса.