Позиционирование шагов в Shepherd.js основано на привязке всплывающего элемента (tooltip) к целевому DOM-элементу. Это позволяет точно указывать, где именно должен появляться шаг относительно интерфейса.
Ключевую роль играет свойство attachTo, которое
определяет:
{
attachTo: {
element: '.button-start',
on: 'bottom'
}
}
element — CSS-селектор или DOM-узел;on — положение тултипа относительно элемента.Свойство on поддерживает набор направлений, определяющих
расположение:
| Значение | Описание |
|---|---|
top |
над элементом |
bottom |
под элементом |
left |
слева |
right |
справа |
top-start |
сверху, выравнивание по левому краю |
top-end |
сверху, выравнивание по правому краю |
bottom-start |
снизу, выравнивание по левому краю |
bottom-end |
снизу, выравнивание по правому краю |
Пример:
attachTo: {
element: '#menu',
on: 'right-start'
}
Такое позиционирование размещает шаг справа от элемента с выравниванием по верхнему краю.
Shepherd.js использует библиотеку позиционирования (Popper.js), которая автоматически корректирует положение, если заданное направление невозможно (например, элемент находится у края экрана).
Поведение включает:
flip) — смена стороны (например,
bottom → top);shift) — корректировка внутри доступной
области;Это обеспечивает стабильное отображение без выхода за границы окна.
Если attachTo не задан, шаг отображается по центру
экрана:
{
text: 'Общий шаг без привязки'
}
Такой подход используется для:
Вместо статического селектора допускается использование функции:
attachTo: {
element: () => document.querySelector('.dynamic'),
on: 'bottom'
}
Преимущества:
Если элемент не найден:
Практика обработки:
attachTo: {
element: () => document.querySelector('.optional') || 'body',
on: 'bottom'
}
Для точной настройки положения используется смещение через настройки Popper:
popperOptions: {
modifiers: [
{
name: 'offset',
options: {
offset: [0, 10]
}
}
]
}
Пример:
[0, 10] — сдвиг вниз;[10, 0] — сдвиг вправо.Можно ограничить область, внутри которой будет располагаться шаг:
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: document.body
}
}
]
}
Это важно для:
Если элемент находится вне видимой области, Shepherd автоматически прокручивает страницу.
Настройка:
scrollTo: true
Или более детально:
scrollTo: {
beh * avior: 'smooth',
block: 'center'
}
Параметры:
behavior: auto или
smooth;block: start, center,
end.При позиционировании часто используется выделение элемента:
highlightClass: 'highlighted-element'
Shepherd добавляет CSS-класс к целевому элементу, позволяя:
Иногда требуется привязка к одному из нескольких элементов:
attachTo: {
element: () => document.querySelectorAll('.item')[0],
on: 'top'
}
Или с логикой выбора:
attachTo: {
element: () => {
const items = document.querySelectorAll('.item');
return items.length ? items[items.length - 1] : null;
},
on: 'bottom'
}
Shepherd позволяет рендерить шаги внутри определённого контейнера:
stepsContainer: document.querySelector('#tour-container')
Это влияет на:
При работе с современными layout-системами:
Рекомендации:
attachTo;Shepherd автоматически пересчитывает положение при:
Дополнительно можно вручную инициировать обновление:
step.updateStepOptions({});
Shepherd корректно работает с:
Важно:
display: none).Наиболее распространённые проблемы:
1. Элемент скрыт
display: none;
→ позиционирование невозможно.
2. Неправильный селектор → элемент не найден.
3. Нулевые размеры → Popper не может вычислить позицию.
4. Контейнер с overflow
overflow: hidden;
→ обрезание тултипа.
data-*
атрибуты)tour.addStep({
id: 'example',
text: 'Описание элемента',
attachTo: {
element: () => document.querySelector('.target'),
on: 'bottom-start'
},
scrollTo: {
beh * avior: 'smooth',
block: 'center'
},
popperOptions: {
modifiers: [
{
name: 'offset',
options: {
offset: [0, 12]
}
},
{
name: 'preventOverflow',
options: {
boundary: document.body
}
}
]
},
highlightClass: 'active-highlight'
});
Такой подход обеспечивает: