Shepherd.js — это библиотека на JavaScript, предназначенная для создания пошаговых интерактивных руководств по интерфейсу (tours). Она позволяет плавно управлять пользовательским опытом, выделяя элементы страницы и предоставляя подсказки на каждом шаге. Shepherd.js построен поверх Popper.js, что обеспечивает гибкое позиционирование всплывающих подсказок относительно элементов DOM.
Базовый объект Tour создается с помощью конструктора
new Shepherd.Tour(options). В параметрах конфигурации можно
указать:
defaultStepOptions — общие настройки для всех
шагов;useModalOverlay — затемнение фона для акцентирования
внимания;steps — массив шагов, каждый шаг описывается объектом с
параметрами.Пример создания простого тура:
const tour = new Shepherd.Tour({
defaultStepOptions: {
cancelIcon: {
enabled: true
},
scrollTo: { beh * avior: 'smooth', block: 'center' }
},
useModalOverlay: true
});
tour.addStep({
id: 'intro',
text: 'Добро пожаловать в наше приложение!',
attachTo: {
element: '.header',
on: 'bottom'
},
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
tour.start();
Каждый шаг тура в Shepherd.js может содержать следующие ключевые свойства:
id — уникальный идентификатор шага;text — текст подсказки, который может быть строкой или
функцией;title — заголовок подсказки;attachTo — объект с параметрами element и
on, задающий элемент и сторону, где будет позиционироваться
подсказка;buttons — массив кнопок с действиями
(next, back, cancel,
complete);classes — CSS-классы для стилизации шага;when — объект событийных колбеков для управления
поведением шага (show, hide,
destroy).Shepherd.js позволяет настраивать динамический контент и реакцию на действия пользователя:
tour.addStep({
id: 'dynamic',
text: () => `Вы выбрали ${getSelectedItem()}`,
attachTo: { element: '#item', on: 'right' },
buttons: [
{
text: 'Назад',
action: tour.back
},
{
text: 'Далее',
action: tour.next
}
],
when: {
show: () => console.log('Шаг показан'),
hide: () => console.log('Шаг скрыт')
}
});
Функции в text и события в when позволяют
создавать интерактивные сценарии, где подсказки
реагируют на состояние страницы.
useModalOverlay: true создает затемненный фон,
ограничивая внимание пользователя текущим шагом. Дополнительно можно
управлять фокусом с помощью:
focus: true — автоматически фокусировать элемент при
показе шага;scrollTo: { beh * avior: 'smooth' } — плавная прокрутка к
элементу.Это особенно важно для E2E тестирования, когда необходимо проверить, что интерактивный тур корректно выделяет элементы интерфейса при разных разрешениях и состояниях страницы.
Shepherd.js позволяет строить кастомную навигацию, включая динамическое управление кнопками:
buttons: [
{
text: 'Пропустить',
action: tour.cancel,
classes: 'btn-secondary'
},
{
text: 'Следующий',
action: tour.next,
classes: 'btn-primary'
}
]
Каждая кнопка может быть связана с функцией, что делает тур полностью контролируемым скриптами для автоматизированного тестирования.
Для E2E тестирования туры Shepherd.js могут быть использованы в сочетании с Cypress, Playwright или Selenium. Основные подходы:
tour.next() и tour.back() для тестирования
навигации.await step.isOpen() или использование
MutationObserver для проверки, что DOM обновился.Пример Cypress:
cy.visit('/app');
cy.window().then(win => {
const tour = win.tour;
cy.get('#step1').should('be.visible');
tour.next();
cy.get('#step2').should('contain.text', 'Следующий шаг');
});
Shepherd.js поддерживает глобальные события тура:
start — запуск тура;complete — успешное завершение;cancel — отмена тура;show и hide — отображение/скрытие
шага.Эти события позволяют создавать интеграцию с аналитикой и логикой интерфейса, а также синхронизировать тур с автоматизированными тестами.
tour.on('complete', () => {
console.log('Тур завершен успешно');
});
tour.on('cancel', () => {
console.log('Тур был отменен');
});
Shepherd.js предоставляет широкие возможности для кастомной стилизации:
classes для CSS-классов на уровне шага;defaultStepOptions.classes;Благодаря этому туры можно полностью интегрировать в дизайн приложения, сохраняя согласованность с интерфейсом.
Shepherd.js сочетает гибкость позиционирования, интерактивные события и модульную структуру, что делает его удобным инструментом для создания и тестирования сложных пользовательских туров в современных веб-приложениях.