Для интеграции Shepherd.js с Angular необходимо сначала установить библиотеку через npm:
npm install shepherd.js
Также потребуется установка стилей Shepherd:
npm install shepherd.js/dist/css/shepherd.css
После установки нужно подключить CSS в глобальные стили Angular,
например, в angular.json:
"styles": [
"src/styles.css",
"node_modules/shepherd.js/dist/css/shepherd.css"
]
В Angular компонентах Shepherd импортируется следующим образом:
import { Component, OnInit } from '@angular/core';
import Shepherd from 'shepherd.js';
@Component({
selector: 'app-tour',
templateUrl: './tour.component.html',
styleUrls: ['./tour.component.css']
})
export class TourComponent implements OnInit {
private tour: Shepherd.Tour;
ngOnInit(): void {
this.initializeTour();
}
private initializeTour(): void {
this.tour = new Shepherd.Tour({
defaultStepOptions: {
scrollTo: true,
cancelIcon: { enabled: true },
classes: 'shepherd-theme-arrows',
},
useModalOverlay: true
});
this.tour.addStep({
id: 'step-1',
text: 'Добро пожаловать в наш Angular-приложение!',
attachTo: { element: '.start-button', on: 'bottom' },
buttons: [
{
text: 'Далее',
action: this.tour.next
}
]
});
this.tour.addStep({
id: 'step-2',
text: 'Здесь находятся основные функции.',
attachTo: { element: '.features', on: 'right' },
buttons: [
{
text: 'Назад',
action: this.tour.back
},
{
text: 'Завершить',
action: this.tour.complete
}
]
});
}
startTour(): void {
this.tour.start();
}
}
В шаблоне компонента необходимо добавить элементы, к которым будут прикреплены шаги тура, и кнопку для запуска:
<button class="start-button" (click)="startTour()">Начать тур</button>
<div class="features">
<!-- Содержимое функциональных блоков -->
</div>
Для удобного повторного использования можно создать Angular-сервис, который будет управлять туром. Это позволяет централизовать логику и избежать дублирования кода в нескольких компонентах:
import { Injectable } from '@angular/core';
import Shepherd from 'shepherd.js';
@Injectable({
providedIn: 'root'
})
export class TourService {
private tour: Shepherd.Tour;
constructor() {
this.tour = new Shepherd.Tour({
defaultStepOptions: {
scrollTo: true,
cancelIcon: { enabled: true },
classes: 'shepherd-theme-arrows'
},
useModalOverlay: true
});
this.setupSteps();
}
private setupSteps(): void {
this.tour.addStep({
id: 'intro',
text: 'Это первый шаг тура.',
attachTo: { element: '.intro', on: 'bottom' },
buttons: [
{ text: 'Далее', action: this.tour.next }
]
});
this.tour.addStep({
id: 'details',
text: 'Дополнительная информация отображается здесь.',
attachTo: { element: '.details', on: 'top' },
buttons: [
{ text: 'Назад', action: this.tour.back },
{ text: 'Завершить', action: this.tour.complete }
]
});
}
startTour(): void {
this.tour.start();
}
}
Компонент теперь может вызывать тур через сервис:
constructor(private tourService: TourService) {}
startTour(): void {
this.tourService.startTour();
}
Shepherd позволяет менять темы через CSS-классы. Для Angular-проектов можно добавить собственный файл стилей и переопределить стандартные классы:
.shepherd-theme-arrows .shepherd-content {
background-color: #f0f0f0;
color: #333;
}
.shepherd-theme-arrows .shepherd-button {
background-color: #007bff;
color: white;
}
Подключение собственного CSS позволяет сохранять единый стиль приложения.
Если элементы страницы создаются динамически через Angular
ngIf или ngFor, важно запускать тур только после
рендеринга этих элементов. Для этого можно использовать
AfterViewInit и setTimeout для гарантии
наличия элементов в DOM:
import { AfterViewInit } from '@angular/core';
export class TourComponent implements AfterViewInit {
ngAfterViewInit(): void {
setTimeout(() => {
this.startTour();
});
}
}
Для проведения тура через несколько маршрутов Angular необходимо подписываться на события роутера и обновлять шаги тура:
import { Router, NavigationEnd } from '@angular/router';
constructor(private router: Router) {
this.router.events.subscribe(event => {
if (event instanceof NavigationEnd) {
// Обновление текущего шага тура или его запуск
this.tour.show('step-2');
}
});
}
Shepherd.js поддерживает кастомные кнопки с пользовательской логикой:
this.tour.addStep({
id: 'custom-step',
text: 'Пример с кастомной кнопкой.',
attachTo: { element: '.custom', on: 'bottom' },
buttons: [
{
text: 'Выполнить действие',
action: () => {
console.log('Действие выполнено');
this.tour.next();
}
}
]
});
Это позволяет создавать интерактивные и адаптивные обучающие последовательности внутри Angular-приложения.
Для сложных туров полезно сохранять состояние пользователя в localStorage или через сервис:
if (!localStorage.getItem('tourCompleted')) {
this.startTour();
}
this.tour.on('complete', () => {
localStorage.setItem('tourCompleted', 'true');
});
Такой подход предотвращает повторный запуск тура при последующих визитах пользователя и позволяет контролировать прогресс.
Shepherd.js в связке с Angular предоставляет гибкий механизм создания интерактивных обучающих туров, поддерживает динамический контент, роутинг и кастомизацию интерфейса, обеспечивая богатый пользовательский опыт.