Shepherd.js — это библиотека для создания интерактивных подсказок и пошаговых туров по интерфейсу. Для работы с формами она особенно полезна, поскольку позволяет поэтапно объяснять пользователю поля ввода, кнопки и другие элементы управления.
Для начала необходимо создать экземпляр тура:
const tour = new Shepherd.Tour({
defaultStepOptions: {
classes: 'shepherd-theme-arrows',
scrollTo: { beh * avior: 'smooth', block: 'center' }
}
});
Здесь defaultStepOptions задаёт общие
параметры для всех шагов: визуальную тему и плавную прокрутку к элементу
формы.
Каждая подсказка формируется как отдельный шаг с указанием элемента, текста и позиции. Пример для поля ввода имени:
tour.addStep({
id: 'name-field',
text: 'Введите своё имя в это поле. Оно будет отображаться в вашем профиле.',
attachTo: {
element: '#name',
on: 'bottom'
},
buttons: [
{
text: 'Далее',
action: tour.next
}
]
});
Ключевые моменты:
attachTo.element — CSS-селектор
элемента формы, к которому прикрепляется подсказка.attachTo.on — положение подсказки
относительно элемента (top, bottom,
left, right).buttons — массив кнопок управления:
переход к следующему шагу, завершение тура, возврат назад.Shepherd.js поддерживает управление туром через встроенные методы:
tour.next() — перейти к следующему шагу.tour.back() — вернуться к предыдущему шагу.tour.start() — запустить тур.tour.complete() — завершить тур.Для форм удобно использовать условные переходы, например, не давать пользователю перейти дальше, пока поле не заполнено:
tour.addStep({
id: 'email-field',
text: 'Введите корректный email. Формат: example@mail.com',
attachTo: { element: '#email', on: 'right' },
buttons: [
{
text: 'Далее',
action: function() {
const emailInput = document.querySelector('#email').value;
if (emailInput.includes('@')) {
tour.next();
} else {
alert('Пожалуйста, введите корректный email');
}
}
}
]
});
Если форма состоит из нескольких логических блоков, шаги можно организовать в последовательности:
const steps = [
{ id: 'personal', element: '#personal-info', text: 'Заполните персональные данные' },
{ id: 'contact', element: '#contact-info', text: 'Добавьте контактные данные' },
{ id: 'preferences', element: '#preferences', text: 'Укажите ваши предпочтения' }
];
steps.forEach(step => {
tour.addStep({
id: step.id,
text: step.text,
attachTo: { element: step.element, on: 'bottom' },
buttons: [{ text: 'Далее', action: tour.next }]
});
});
Такой подход упрощает поддержку кода и позволяет легко добавлять новые блоки формы без дублирования логики.
Shepherd.js позволяет создавать шаги на лету в зависимости от состояния формы. Например, если пользователь выбрал определённую опцию:
document.querySelector('#newsletter').addEventListener('change', (e) => {
if (e.target.checked) {
tour.addStep({
id: 'newsletter-options',
text: 'Выберите, какие рассылки вы хотите получать',
attachTo: { element: '#newsletter-options', on: 'top' },
buttons: [{ text: 'Готово', action: tour.next }]
});
tour.next();
}
});
Это обеспечивает адаптивность подсказок, подстраивая тур под действия пользователя.
Shepherd.js поддерживает кастомизацию через CSS-классы:
tour.addStep({
id: 'submit-button',
text: 'Нажмите эту кнопку для отправки формы',
attachTo: { element: '#submit', on: 'top' },
classes: 'shepherd-theme-dark',
buttons: [
{ text: 'Закрыть', action: tour.complete }
]
});
Можно использовать предустановленные темы
(shepherd-theme-arrows, shepherd-theme-dark)
или создать собственные стили для подсветки элементов формы.
Если форма рендерится динамически (например, через React или Vue), шаги нужно создавать после загрузки элементов DOM:
document.addEventListener('DOMContentLoaded', () => {
if (document.querySelector('#dynamic-form')) {
tour.addStep({
id: 'dynamic-step',
text: 'Это поле появилось динамически',
attachTo: { element: '#dynamic-field', on: 'right' },
buttons: [{ text: 'Далее', action: tour.next }]
});
tour.start();
}
});
Для SPA важно следить, чтобы селекторы были актуальны на момент добавления шага.
Shepherd.js можно интегрировать с существующей валидацией формы. Шаги могут блокировать переход, пока пользователь не выполнит условие:
tour.addStep({
id: 'password-step',
text: 'Пароль должен содержать минимум 8 символов',
attachTo: { element: '#password', on: 'bottom' },
buttons: [
{
text: 'Далее',
action: () => {
const password = document.querySelector('#password').value;
if (password.length >= 8) {
tour.next();
} else {
alert('Пароль слишком короткий');
}
}
}
]
});
Это делает интерактивные подсказки не только обучающими, но и проверяющими корректность заполнения формы.
tour.cancel() — отменяет тур в любой
момент.tour.hide() / tour.show()
— временно скрывает или показывает подсказку.step.updateStepOptions() — позволяет
динамически менять текст, кнопки или позицию шага, например, при
изменении состояния формы.Эти методы позволяют создавать интерактивные, адаптивные и многошаговые подсказки, которые органично встроятся в любой процесс заполнения формы.