В библиотеке Shepherd.js overflow играет ключевую
роль в управлении видимостью подсказок при ограниченном пространстве на
экране. Shepherd автоматически пытается позиционировать тултипы таким
образом, чтобы они не выходили за пределы окна просмотра, но поведение
можно детально настраивать через параметры tetherOptions и
popperOptions.
tetherOptionsShepherd изначально использует библиотеку Tether для позиционирования подсказок относительно элементов DOM. В объекте конфигурации шага можно определить поведение при переполнении:
const tour = new Shepherd.Tour({
defaultStepOptions: {
tetherOptions: {
constraints: [
{
to: 'window',
attachment: 'together',
pin: true
}
]
}
}
});
Ключевые моменты:
to: элемент или контейнер, к которому привязывается шаг
('window', 'scrollParent', CSS-селектор или
DOM-элемент).attachment: способ привязки тултипа к элементу
('top', 'bottom', 'left',
'right', с модификаторами 'start',
'end').pin: логическое значение, разрешающее закрепление шага
в пределах контейнера при переполнении.Использование tetherOptions.constraints позволяет
контролировать, что шаг никогда не выйдет за пределы указанного
контейнера.
popperOptions в Shepherd.js v8+Начиная с версии 8, Shepherd.js интегрируется с
библиотекой Popper.js для позиционирования, что даёт
более гибкое управление overflow. Параметр popperOptions
позволяет задавать поведение подсказки при нехватке места:
tour.addStep({
id: 'example-step',
text: 'Это пример шага с управлением overflow.',
attachTo: { element: '.example', on: 'bottom' },
popperOptions: {
modifiers: [
{
name: 'preventOverflow',
options: {
boundary: 'viewport', // можно указать любое DOM-узел
padding: 8
}
},
{
name: 'flip',
options: {
fallbackPlacements: ['top', 'right', 'left']
}
}
]
}
});
Особенности модификаторов:
preventOverflow: предотвращает выход тултипа за границы
контейнера (viewport, родительский элемент или кастомный
контейнер).padding: отступ от границы контейнера для безопасного
отображения подсказки.flip: автоматически меняет позицию шага при нехватке
места, используя массив fallbackPlacements.tetherOptions и popperOptionsДля максимальной гибкости можно использовать оба подхода, особенно
при необходимости поддержки старых версий браузеров и сложных
интерфейсов. В этом случае tetherOptions контролируют
базовое поведение привязки, а popperOptions управляют
динамическим изменением позиции и предотвращением переполнения.
const tour = new Shepherd.Tour({
defaultStepOptions: {
scrollTo: true,
tetherOptions: {
constraints: [
{ to: 'window', attachment: 'together', pin: true }
]
},
popperOptions: {
modifiers: [
{ name: 'preventOverflow', options: { boundary: 'viewport', padding: 10 } },
{ name: 'flip', options: { fallbackPlacements: ['top', 'right'] } }
]
}
}
});
Иногда поведение библиотек недостаточно, и требуется дополнительная настройка через CSS:
.shepherd-element {
max-width: 300px;
overflow-wrap: break-word;
word-break: break-word;
}
Важные моменты:
max-width ограничивает ширину тултипа, что
предотвращает горизонтальное переполнение.overflow-wrap и word-break обеспечивают
корректное перенесение длинных слов.Для интерфейсов с изменяющимся контентом полезно использовать метод
updateStepElementPosition:
tour.getCurrentStep().updateStepElementPosition();
Это заставляет шаг пересчитать своё положение, учитывая текущее расположение элемента и состояние overflow. Особенно актуально при открытии модальных окон или изменении размеров окна.
tetherOptions.constraints подходит для
статичных интерфейсов.popperOptions дают динамическое управление, позволяя
использовать модификаторы preventOverflow и
flip.Эта комбинация инструментов делает управление overflow в Shepherd.js гибким и надежным даже для сложных интерфейсов с ограниченным пространством.