Shepherd.js построен вокруг принципа композиции: сложные сценарии пользовательских туров формируются из небольших, независимых сущностей — туров, шагов и конфигураций. Такой подход позволяет гибко управлять поведением интерфейса, повторно использовать логику и масштабировать решения без усложнения кода.
Композиция API означает, что каждый элемент можно собирать как «конструктор»: объединять шаги, переиспользовать настройки, расширять поведение через функции и хуки.
Тур — центральный объект, управляющий последовательностью шагов.
Ключевые свойства:
steps — массив шаговdefaultStepOptions — базовые настройки для всех
шаговuseModalOverlay — затемнение фонаexitOnEsc — завершение по EscПример создания:
const tour = new Shepherd.Tour({
defaultStepOptions: {
classes: 'shepherd-theme-default',
scrollTo: true
},
useModalOverlay: true
});
Шаг — отдельный элемент тура, описывающий конкретное действие или подсказку.
Основные параметры:
id — уникальный идентификаторtext — содержимоеattachTo — привязка к DOM-элементуbuttons — элементы управленияwhen — события жизненного циклаПример:
tour.addStep({
id: 'example-step',
text: 'Описание элемента',
attachTo: {
element: '.example',
on: 'bottom'
},
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
Общие параметры можно вынести в отдельный объект и комбинировать:
const baseStep = {
classes: 'custom-step',
scrollTo: true
};
tour.addStep({
...baseStep,
text: 'Первый шаг',
attachTo: { element: '.one', on: 'bottom' }
});
tour.addStep({
...baseStep,
text: 'Второй шаг',
attachTo: { element: '.two', on: 'top' }
});
Shepherd позволяет задавать значения как функции, что делает шаги динамическими.
tour.addStep({
text: () => {
return document.querySelector('.dynamic').innerText;
}
});
Это позволяет:
Каждый шаг поддерживает хуки жизненного цикла.
showhidecancelcompleteПример:
tour.addStep({
id: 'step-with-events',
text: 'Шаг с событиями',
when: {
show() {
console.log('Шаг показан');
},
hide() {
console.log('Шаг скрыт');
}
}
});
Композиция через события позволяет:
Шаги автоматически образуют цепочку, но поведение можно кастомизировать:
buttons: [
{
text: 'Назад',
action: tour.back
},
{
text: 'Вперёд',
action: () => {
if (condition) {
tour.next();
}
}
}
]
Композиция позволяет внедрять условия:
action: () => {
if (user.isAdmin) {
tour.show('admin-step');
} else {
tour.next();
}
}
Глобальные настройки позволяют избежать дублирования:
const tour = new Shepherd.Tour({
defaultStepOptions: {
cancelIcon: {
enabled: true
},
classes: 'global-class',
scrollTo: { beh * avior: 'smooth', block: 'center' }
}
});
Каждый шаг может переопределить эти параметры.
Shepherd легко комбинируется с внешними функциями:
function createStep(selector, text) {
return {
text,
attachTo: {
element: selector,
on: 'bottom'
}
};
}
tour.addStep(createStep('.btn', 'Кнопка действия'));
Это позволяет:
Шаги могут зависеть от асинхронных операций:
tour.addStep({
id: 'async-step',
beforeShowPromise: () => {
return fetch('/data')
.then(res => res.json())
.then(data => {
document.querySelector('.target').innerText = data.value;
});
},
text: 'Данные загружены'
});
Это важно для:
attachTo может быть динамическим:
attachTo: {
element: () => document.querySelector('.dynamic-element'),
on: 'right'
}
Если элемент отсутствует — шаг может быть пропущен или отложен.
Кнопки — независимые объекты, которые можно переиспользовать:
const nextButton = {
text: 'Далее',
action: tour.next
};
const backButton = {
text: 'Назад',
action: tour.back
};
tour.addStep({
text: 'Шаг',
buttons: [backButton, nextButton]
});
Можно описывать весь тур как структуру данных:
const steps = [
{
text: 'Шаг 1',
selector: '.one'
},
{
text: 'Шаг 2',
selector: '.two'
}
];
steps.forEach(step => {
tour.addStep({
text: step.text,
attachTo: {
element: step.selector,
on: 'bottom'
}
});
});
Shepherd можно интегрировать с состоянием (например, Redux, Vuex):
when: {
show() {
store.dispatch({ type: 'TOUR_STEP_SHOWN' });
}
}
Хорошая практика — разбивать туры на модули:
export function createUserTour() {
const tour = new Shepherd.Tour();
tour.addStep({ text: 'Профиль' });
tour.addStep({ text: 'Настройки' });
return tour;
}
Это позволяет:
Основные методы:
tour.start() — запускtour.next() — следующий шагtour.back() — предыдущийtour.cancel() — отменаtour.complete() — завершениеКомпозиция позволяет вызывать их в любом месте приложения.
Можно создавать несколько независимых туров:
const onboardingT our = new Shepherd.Tour();
const featureTour = new Shepherd.Tour();
И управлять ими отдельно:
Создание шагов через функции
Хранение структуры в JSON
Интеграция с внешним кодом
Создание шагов на основе данных
function buildTour(stepsConfig) {
const tour = new Shepherd.Tour({
defaultStepOptions: {
scrollTo: true
}
});
stepsConfig.forEach(config => {
tour.addStep({
text: config.text,
attachTo: {
element: config.selector,
on: config.position || 'bottom'
}
});
});
return tour;
}
const tour = buildTour([
{ text: 'Приветствие', selector: '.start' },
{ text: 'Меню', selector: '.menu' }
]);
tour.start();
Композиция API в Shepherd.js делает библиотеку мощным инструментом для построения сложных сценариев обучения пользователей, позволяя комбинировать поведение, данные и интерфейс в гибкую и расширяемую систему.