В библиотеке Intro.js модальные окна являются основным визуальным инструментом для управления вниманием пользователя. Они представляют собой overlay-слой, блокирующий взаимодействие с остальной частью страницы и направляющий пользователя через последовательность шагов.
Каждый шаг тура сопровождается всплывающим блоком с пояснением, который позиционируется относительно целевого элемента. При этом создаётся затемнение (overlay), а сам элемент подсвечивается.
Ключевые компоненты:
Поведение модального окна регулируется через конфигурацию Intro.js:
introJs().setOptions({
showStepNumbers: true,
exitOnOverlayClick: false,
exitOnEsc: true,
overlayOpacity: 0.5,
disableInteraction: true
}).start();
Ключевые свойства:
exitOnOverlayClick — разрешает или запрещает закрытие
при клике на фонexitOnEsc — закрытие по клавише EscoverlayOpacity — прозрачность затемненияdisableInteraction — блокировка взаимодействия с
элементамиIntro.js предоставляет набор событий, позволяющих контролировать поведение модальных окон на каждом этапе.
introJs()
.onbeforechange(function(targetElement) {
// перед показом шага
})
.onchange(function(targetElement) {
// после показа шага
})
.onafterchange(function(targetElement) {
// после завершения анимации
})
.onexit(function() {
// при закрытии модального окна
})
.start();
Практическое применение:
Intro.js использует стандартные CSS-классы, которые можно переопределять:
.introjs-tooltip {
background-color: #1e1e2f;
color: #ffffff;
border-radius: 8px;
font-size: 14px;
}
.introjs-overlay {
background-color: rgba(0, 0, 0, 0.7);
}
.introjs-button {
background-color: #4CAF50;
color: white;
border: none;
}
.introjs-nextbutton {
background-color: #2196F3;
}
Intro.js позволяет отключить стандартный интерфейс и использовать собственную разметку.
introJs().setOptions({
showButtons: false,
showBullets: false
});
introJs().setOptions({
steps: [
{
element: '#step1',
intro: '<div class="custom-modal">Собственный контент</div>'
}
]
});
Модальные окна часто используются в приложениях с динамически обновляемым интерфейсом.
Если элемент появляется позже (например, после AJAX-запроса), Intro.js не сможет корректно привязать шаг.
Использование отложенного запуска:
setTimeout(() => {
introJs().start();
}, 500);
Или ручное обновление:
introJs().refresh();
Intro.js автоматически определяет положение модального окна относительно элемента, но это можно настроить.
steps: [
{
element: '#button',
intro: 'Описание кнопки',
position: 'right'
}
]
Доступные позиции:
toprightbottomleftautointroJs().setOptions({
disableInteraction: true
});
Это делает модальное окно полностью контролируемым сценарием.
introJs().setOptions({
disableInteraction: false
});
Используется в интерактивных турах.
При работе с формами важно учитывать, что overlay может блокировать поля ввода.
Разрешение взаимодействия:
disableInteraction: false
Или выборочное отключение overlay:
.introjs-overlay {
pointer-events: none;
}
introJs().goToStep(2).start();
introJs().exit();
introJs().start();
Модальные окна могут зависеть от данных с сервера.
introJs().onbeforechange(function(targetElement) {
return new Promise(resolve => {
fetch('/data')
.then(response => response.json())
.then(data => {
targetElement.innerHTML = data.text;
resolve();
});
});
});
При большом количестве шагов и сложных DOM-структурах возможны задержки.
refresh() только при необходимостиПричина:
display: none)Решение:
scrollToElement: trueРешение:
.introjs-helperLayer {
z-index: 9999;
}
introJs().setOptions({
scrollToElement: true
});
Используется через refs и lifecycle:
useEffect(() => {
introJs().start();
}, []);
mounted() {
introJs().start();
}
Позволяют:
steps: [
condition && {
element: '#feature',
intro: 'Новая функция'
}
].filter(Boolean)
Для сохранения прогресса:
localStorage.setItem('intro_seen', true);
Проверка:
if (!localStorage.getItem('intro_seen')) {
introJs().start();
}
Intro.js предоставляет доступ к внутренним объектам:
const intro = introJs();
intro._introItems; // массив шагов
Позволяет:
Анимации можно отключить:
introJs().setOptions({
animate: false
});
Или кастомизировать через CSS:
.introjs-tooltip {
transition: all 0.3s ease;
}
Intro.js по умолчанию поддерживает один активный тур, но можно управлять несколькими сценариями:
const intro1 = introJs();
const intro2 = introJs();
Контроль через условия:
if (user.isNew) {
intro1.start();
} else {
intro2.start();
}
Overlay — важный элемент UX:
Настройка прозрачности:
overlayOpacity: 0.7
Полное отключение:
showOverlay: false
При сложной DOM-структуре:
position: relativeoverflow: hidden у родительских
контейнеровПолезные методы:
introJs().onchange(el => console.log(el));
И визуальная проверка:
Практика показывает, что эффективные модальные окна:
Настройка Intro.js в этом контексте — это не только техническая задача, но и часть проектирования пользовательского опыта.