Каждый шаг в Shepherd.js представляет собой конфигурационный объект, описывающий поведение, внешний вид и взаимодействие с пользователем. Директивы — это свойства этого объекта, которые управляют логикой шага: от привязки к DOM-элементу до обработки событий и переходов.
Базовый пример шага:
tour.addStep({
id: 'example-step',
text: 'Описание шага',
attachTo: {
element: '.button',
on: 'bottom'
}
});
Далее рассматриваются ключевые директивы, используемые при создании шагов.
idУникальный идентификатор шага в рамках тура.
Назначение:
show, hide,
cancel)id: 'welcome-step'
textОпределяет содержимое шага. Может быть строкой, HTML или функцией.
text: 'Нажмите сюда, чтобы продолжить'
Функциональный вариант:
text: () => {
return 'Динамический текст';
}
Позволяет формировать контент на основе состояния приложения.
attachToСвязывает шаг с элементом DOM.
attachTo: {
element: '.nav-item',
on: 'right'
}
Параметры:
element: CSS-селектор или DOM-элементon: позиция тултипа относительно элементаДопустимые значения on:
topbottomleftrightautoЕсли element не найден, шаг может не отображаться или
вести себя некорректно.
buttonsОпределяет кнопки внутри шага.
buttons: [
{
text: 'Назад',
action: function() {
return this.back();
}
},
{
text: 'Далее',
action: function() {
return this.next();
}
}
]
Свойства кнопки:
text: текст кнопкиaction: функция при нажатииclasses: дополнительные CSS-классыsecondary: логическое значение для второстепенных
кнопокadvanceOnПозволяет автоматически переходить к следующему шагу при наступлении события.
advanceOn: {
selector: '.submit-btn',
event: 'click'
}
Особенности:
whenОпределяет обработчики событий жизненного цикла шага.
when: {
show: () => console.log('Шаг показан'),
hide: () => console.log('Шаг скрыт')
}
Поддерживаемые события:
showhidecancelcompleteИспользуется для интеграции с бизнес-логикой приложения.
beforeShowPromiseПозволяет выполнить асинхронную операцию перед показом шага.
beforeShowPromise: function() {
return new Promise(resolve => {
setTimeout(resolve, 500);
});
}
Шаг будет показан только после выполнения промиса.
scrollToУправляет прокруткой к элементу перед показом шага.
scrollTo: true
Или более гибко:
scrollTo: {
beh * avior: 'smooth',
block: 'center'
}
cancelIconДобавляет иконку закрытия шага.
cancelIcon: {
enabled: true
}
Можно расширить:
cancelIcon: {
enabled: true,
label: 'Закрыть'
}
classesПозволяет добавлять кастомные CSS-классы.
classes: 'custom-tooltip dark-theme'
Используется для стилизации шагов.
highlightClassДобавляет CSS-класс к целевому элементу.
highlightClass: 'highlighted-element'
Полезно для визуального выделения.
canClickTargetОпределяет, можно ли взаимодействовать с элементом под шагом.
canClickTarget: false
Если false, элемент блокируется overlay-слоем.
modalOverlayOpeningPaddingНастраивает отступ вокруг выделяемого элемента.
modalOverlayOpeningPadding: 10
modalOverlayOpeningRadiusЗадает радиус скругления области выделения.
modalOverlayOpeningRadius: 8
arrowУправляет отображением стрелки тултипа.
arrow: true
Можно отключить:
arrow: false
floatingUIOptionsПозволяет тонко настраивать позиционирование (через Floating UI).
floatingUIOptions: {
middleware: [
{
name: 'offset',
options: {
mainAxis: 10
}
}
]
}
Используется для продвинутой настройки положения шага.
showOnПозволяет условно отображать шаг.
showOn: function() {
return window.innerWidth > 768;
}
Если функция возвращает false, шаг пропускается.
id и
управление шагамиСвязка id с методами тура:
tour.show('example-step');
Позволяет переходить к конкретному шагу напрямую.
tour.addStep({
id: 'complex-step',
text: () => 'Динамическое содержимое',
attachTo: {
element: '.profile-button',
on: 'left'
},
classes: 'custom-step',
highlightClass: 'highlight',
scrollTo: {
beh * avior: 'smooth',
block: 'center'
},
cancelIcon: {
enabled: true
},
buttons: [
{
text: 'Назад',
action() {
return this.back();
},
secondary: true
},
{
text: 'Далее',
action() {
return this.next();
}
}
],
advanceOn: {
selector: '.profile-button',
event: 'click'
},
when: {
show() {
console.log('Показ шага');
}
},
beforeShowPromise() {
return new Promise(resolve => setTimeout(resolve, 300));
},
canClickTarget: true
});
beforeShowPromise) критичны при
работе с динамическим DOMadvanceOn и buttons не следует смешивать
без необходимости — это приводит к дублирующему управлениюshowOn полезен для адаптивных интерфейсовfloatingUIOptions требует понимания
механизма позиционированияНекоторые директивы влияют друг на друга:
attachTo + scrollTo — гарантируют
видимость элементаhighlightClass +
modalOverlayOpeningPadding — формируют визуальный
фокусadvanceOn может полностью заменить кнопкиbeforeShowPromise может задержать
when.showПравильная комбинация директив позволяет создавать гибкие и адаптивные обучающие сценарии без усложнения кода.