Для начала работы с библиотекой Intro.js необходимо подключить её к проекту. Библиотека предоставляет как CSS для стилизации, так и JS для функциональности. Существует несколько способов подключения:
Через CDN:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/intro.js/minified/introjs.min.css">
<script src="https://cdn.jsdelivr.net/npm/intro.js/minified/intro.min.js"></script>
Локально:
introjs.min.css и
intro.min.js в проекте.<link rel="stylesheet" href="css/introjs.min.css">
<script src="js/intro.min.js"></script>
После подключения библиотека готова к использованию, и можно создавать интерактивные подсказки на странице.
Создание простого тура:
introJs().start();
При этом библиотека будет искать элементы с атрибутами
data-intro на странице и автоматически покажет подсказки
для них.
Пример HTML-разметки:
<button data-intro="Это кнопка для запуска действия" data-step="1">Нажми меня</button>
<div data-intro="Это поле ввода" data-step="2">
<input type="text" placeholder="Введите текст">
</div>
Ключевые атрибуты:
data-intro – текст подсказки.data-step – порядок показа шагов.data-position – позиция подсказки относительно элемента
(top, right, bottom,
left).Для более сложных сценариев удобно хранить данные о шагах в локальном JSON-файле. Это позволяет динамически загружать контент и отделять данные от кода страницы.
Пример структуры файла tour.json:
[
{
"element": "#btnStart",
"intro": "Кнопка запуска процесса",
"position": "bottom"
},
{
"element": "#inputName",
"intro": "Поле для ввода имени",
"position": "right"
},
{
"element": "#submitForm",
"intro": "Отправка формы на сервер",
"position": "top"
}
]
Используется стандартный метод fetch для получения
данных из локального файла. После загрузки массива шагов его можно
передать в Intro.js через метод setOptions.
fetch('tour.json')
.then(response => response.json())
.then(steps => {
introJs().setOptions({
steps: steps
}).start();
})
.catch(error => console.error('Ошибка загрузки тура:', error));
Особенности при локальном использовании:
fetch заблокирован по соображениям безопасности.
Рекомендуется использовать локальный сервер (Live Server в
VS Code или http-server через Node.js).element должны быть валидными
селекторами CSS.Можно создавать массив шагов на лету, анализируя DOM или состояние приложения:
const steps = [];
document.querySelectorAll('[data-tour]').forEach((el, index) => {
steps.push({
element: `#${el.id}`,
intro: el.getAttribute('data-tour'),
position: 'bottom',
step: index + 1
});
});
introJs().setOptions({ steps }).start();
Чтобы тур охватывал несколько страниц, локальный JSON может содержать разделение по страницам:
{
"home": [
{"element": "#btnHome", "intro": "Главная кнопка"}
],
"profile": [
{"element": "#inputEmail", "intro": "Поле для email"}
]
}
При загрузке необходимо определить текущую страницу и выбрать соответствующий массив шагов.
fetch('tour.json')
.then(res => res.json())
.then(data => {
const pageSteps = data[window.location.pathname.replace('/', '')] || [];
introJs().setOptions({ steps: pageSteps }).start();
});
Intro.js поддерживает множество параметров:
showStepNumbers: true|false – отображение номеров
шагов.exitOnOverlayClick: true|false – возможность закрытия
тура кликом по затемнённой области.tooltipClass: "custom-class" – добавление
пользовательского CSS.doneLabel, nextLabel,
prevLabel – текст кнопок навигации.Пример с кастомными настройками:
introJs().setOptions({
steps: steps,
showStepNumbers: false,
exitOnOverlayClick: false,
tooltipClass: 'my-tooltip',
nextLabel: 'Далее',
prevLabel: 'Назад',
doneLabel: 'Готово'
}).start();
Intro.js предоставляет события для тонкого контроля:
onbeforechange(element) – вызывается перед показом
нового шага.onchange(element) – при смене шага.onafterchange(element) – после смены шага.oncomplete() – после завершения тура.onexit() – при преждевременном выходе.Пример использования:
introJs().onchange(function(element){
console.log('Смена шага, элемент:', element);
}).oncomplete(function(){
console.log('Тур завершен');
}).start();
События особенно полезны для динамических страниц и многостраничных туров, когда нужно подгружать элементы перед показом подсказки.
localStorage для повторного использования без загрузки с
сервера.MutationObserver для отслеживания появления элементов перед
показом шага.const observer = new MutationObserver(() => {
if(document.querySelector('#inputName')) {
observer.disconnect();
introJs().setOptions({ steps: steps }).start();
}
});
observer.observe(document.body, { childList: true, subtree: true });
Для локальных туров можно хранить текст подсказок в JSON с ключами для разных языков:
[
{
"element": "#btnStart",
"intro": {"en": "Start button", "ru": "Кнопка запуска"},
"position": "bottom"
}
]
Перед запуском тура выбирать нужный язык:
const lang = 'ru';
steps.forEach(step => step.intro = step.intro[lang]);
introJs().setOptions({ steps }).start();
Это позволяет использовать единый JSON для нескольких локализаций без дублирования структуры тура.