Shepherd.js — это библиотека для создания интерактивных пошаговых туров по веб-приложению. Она позволяет выделять элементы интерфейса, управлять последовательностью действий пользователя и обеспечивать контекстное обучение прямо на странице. Основные сущности библиотеки:
const tour = new Shepherd.Tour({
defaultStepOptions: {
scrollTo: true,
cancelIcon: {
enabled: true
}
}
});
Здесь defaultStepOptions задаёт параметры по умолчанию
для всех шагов: автоматическая прокрутка к элементу и наличие кнопки
закрытия.
Каждый шаг создаётся с помощью метода addStep. Основные
параметры:
tour.addStep({
id: 'step1',
text: 'Это основной элемент меню.',
attachTo: {
element: '#main-menu',
on: 'bottom'
},
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
attachTo поддерживает позиции: top,
bottom, left, right, а также
комбинации, например, top-start.
Shepherd.js предоставляет методы для управления туром на любом этапе:
tour.start() — запускает тур с первого шага.tour.next() — переходит к следующему шагу.tour.back() — возвращается к предыдущему шагу.tour.cancel() — прекращает тур.tour.complete() — завершает тур и выполняет действия
после него.Пример использования:
tour.start();
tour.on('complete', () => {
console.log('Тур завершён');
});
События позволяют привязывать пользовательскую логику к жизненному циклу тура.
Shepherd.js поддерживает обширную кастомизацию:
text,
action, classes, secondary.classes можно подключить
кастомные CSS-классы.popperOptions
можно управлять позиционированием.tour.addStep({
id: 'custom-step',
text: 'Шаг с индивидуальными стилями',
attachTo: { element: '#custom', on: 'right' },
classes: 'shepherd-theme-arrows custom-step-style',
buttons: [
{
text: 'Назад',
action: tour.back,
classes: 'btn-back'
},
{
text: 'Вперёд',
action: tour.next,
classes: 'btn-next'
}
]
});
Если элементы создаются динамически, важно инициализировать шаг только после появления элемента. Для этого можно использовать коллбэки или MutationObserver.
const observer = new MutationObserver(() => {
if (document.querySelector('#dynamic-element')) {
tour.addStep({
id: 'dynamic-step',
text: 'Динамический элемент готов',
attachTo: { element: '#dynamic-element', on: 'top' },
buttons: [{ text: 'Далее', action: tour.next }]
});
observer.disconnect();
}
});
observer.observe(document.body, { childList: true, subtree: true });
Shepherd.js позволяет задавать условные переходы между шагами,
использовать when для проверки состояния интерфейса перед
показом шага:
tour.addStep({
id: 'conditional-step',
text: 'Этот шаг показывается только если выполнено условие',
attachTo: { element: '#conditional', on: 'left' },
when: {
show: () => {
return document.querySelectorAll('.active').length > 0;
}
},
buttons: [{ text: 'Далее', action: tour.next }]
});
Для поддержки многоязычного интерфейса текст шагов и кнопок можно формировать динамически:
const translations = {
en: { next: 'Next', prev: 'Back', finish: 'Finish' },
ru: { next: 'Далее', prev: 'Назад', finish: 'Завершить' }
};
const lang = 'ru';
tour.addStep({
id: 'step-lang',
text: 'Многоязычный шаг',
buttons: [
{ text: translations[lang].prev, action: tour.back },
{ text: translations[lang].next, action: tour.next }
]
});
Shepherd.js генерирует события для каждого шага:
show — шаг отображён.hide — шаг скрыт.complete — тур завершён.cancel — тур отменён.Привязка событий через on:
tour.on('show', (event) => {
console.log(`Шаг ${event.step.id} показан`);
});
tour.on('cancel', () => console.log('Тур отменён пользователем'));
С помощью CSS и кастомных классов можно добавлять анимации появления подсказок:
.shepherd-theme-arrows.custom-step-style {
transition: opacity 0.3s ease, transform 0.3s ease;
}
Использование beforeShowPromise позволяет выполнять
анимации или подготовку данных перед отображением шага:
tour.addStep({
id: 'animated-step',
text: 'Анимация перед показом',
attachTo: { element: '#animate', on: 'bottom' },
beforeShowPromise: () => new Promise(resolve => setTimeout(resolve, 500))
});
Shepherd.js допускает расширение:
popperOptions.Эти возможности делают библиотеку гибким инструментом для построения интерактивного и адаптивного обучения пользователей прямо в браузере.