Driver.js — библиотека для создания интерактивных руководств по интерфейсу, позволяющая выделять элементы страницы, добавлять подсказки и контролировать последовательность шагов. Одним из мощнейших инструментов является возможность динамического формирования контента, что особенно важно для сложных веб-приложений с изменяющейся разметкой.
Для начала необходимо создать экземпляр класса
Driver:
import Driver from 'driver.js';
import 'driver.js/dist/driver.min.css';
const driver = new Driver({
animate: true,
opacity: 0.7,
padding: 10,
allowClose: false
});
Ключевые опции:
animate — анимация при переходе между шагами.opacity — затемнение остальной части страницы.padding — отступ вокруг выделяемого элемента.allowClose — возможность закрытия тура
пользователем.Шаги (steps) могут формироваться в рантайме на основе
состояния приложения, данных с сервера или событий пользователя. Каждый
шаг представляет собой объект с обязательным полем element
и popover:
const steps = [
{
element: '#header',
popover: {
title: 'Заголовок',
description: 'Здесь отображается основная информация',
position: 'bottom'
}
}
];
При динамическом формировании шагов ключевым моментом является проверка существования элементов на странице. Это предотвращает ошибки и обеспечивает корректное отображение:
const dynamicSteps = [];
document.querySelectorAll('.feature-item').forEach((item, index) => {
dynamicSteps.push({
element: item,
popover: {
title: `Функция ${index + 1}`,
description: item.dataset.description || 'Описание отсутствует',
position: 'top'
}
});
});
Driver.js легко интегрируется с асинхронными запросами, что позволяет строить тур на основе полученных данных:
fetch('/api/features')
.then(response => response.json())
.then(features => {
const serverSteps = features.map((feature, idx) => ({
element: document.querySelector(`#feature-${feature.id}`),
popover: {
title: feature.name,
description: feature.description,
position: 'right'
}
}));
driver.defineSteps(serverSteps);
driver.start();
});
Особенности:
driver.defineSteps(array) — позволяет задать шаги после
создания экземпляра.Иногда требуется отображать шаги только при определённых условиях:
const steps = [];
if (user.isAdmin) {
steps.push({
element: '#admin-panel',
popover: {
title: 'Панель администратора',
description: 'Только для пользователей с правами администратора',
position: 'left'
}
});
}
driver.defineSteps(steps);
driver.start();
Такой подход позволяет создавать персонализированные туры, адаптированные под роль пользователя или состояние приложения.
Для динамических приложений важно уметь обновлять шаги, если элементы появляются или изменяются:
const updateSteps = () => {
const steps = [];
document.querySelectorAll('.dynamic-section').forEach((section, idx) => {
steps.push({
element: section,
popover: {
title: `Секция ${idx + 1}`,
description: section.dataset.info,
position: 'bottom'
}
});
});
driver.defineSteps(steps);
};
const observer = new MutationObserver(updateSteps);
observer.observe(document.body, { childList: true, subtree: true });
Примечания:
MutationObserver позволяет отслеживать добавление,
удаление и изменение элементов.driver.defineSteps.Driver.js поддерживает события, которые можно использовать для динамического контроля:
driver.on('next', step => {
console.log('Следующий шаг:', step);
});
driver.on('complete', () => {
console.log('Тур завершён');
});
События next, previous,
complete и reset позволяют управлять логикой и
подстраивать динамический контент под действия пользователя.
Поповеры можно позиционировать относительно элементов в зависимости от их размеров и расположения:
driver.defineSteps([
{
element: '#menu',
popover: {
title: 'Меню',
description: 'Главное навигационное меню',
position: window.innerWidth < 768 ? 'bottom' : 'right'
}
}
]);
Также можно использовать собственные CSS-классы для каждого шага, что особенно полезно при динамически генерируемых элементах:
driver.defineSteps([
{
element: '#dynamic-feature',
popover: {
title: 'Особенность',
description: 'Динамически добавленная секция',
position: 'left',
className: 'custom-driver-popover'
}
}
]);
MutationObserver для реактивного
обновления шагов при динамическом контенте.Эти методы обеспечивают плавный, адаптивный и масштабируемый опыт работы с интерактивными турами в сложных интерфейсах.