В библиотеке Locomotive Scroll параметр
scrollbarContainer отвечает за размещение кастомного
скроллбара в пределах указанного DOM-элемента. По умолчанию скроллбар
добавляется в body, однако при необходимости его можно
изолировать и стилизовать в рамках конкретного контейнера.
Это особенно важно при создании сложных интерфейсов, где:
scrollbarContainerПри инициализации Locomotive Scroll параметр указывается в конфигурации:
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
scrollbarContainer: document.querySelector('.scrollbar-wrapper')
});
В данном случае:
[data-scroll-container].scrollbar-wrapperДля корректной работы важно заранее подготовить HTML-структуру:
<div class="scrollbar-wrapper"></div>
<div data-scroll-container>
<section data-scroll-section>
Контент
</section>
</div>
Ключевые моменты:
data-scroll-containerLocomotive Scroll автоматически создаёт следующие элементы:
<div class="c-scrollbar">
<div class="c-scrollbar_thumb"></div>
</div>
Если задан scrollbarContainer, эта структура будет
вставлена внутрь него.
Минимальный набор стилей:
.scrollbar-wrapper {
position: fixed;
top: 0;
right: 10px;
width: 8px;
height: 100vh;
}
.c-scrollbar {
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.1);
}
.c-scrollbar_thumb {
width: 100%;
background: #000;
border-radius: 4px;
cursor: grab;
}
Особенности:
cursor: grab улучшает UXПоскольку контейнер задаётся вручную, появляется полный контроль над размещением:
.scrollbar-wrapper {
position: fixed;
right: 20px;
top: 50px;
height: calc(100vh - 100px);
}
.scrollbar-wrapper {
position: absolute;
right: 0;
top: 0;
height: 100%;
}
.c-scrollbar {
background: transparent;
}
.c-scrollbar_thumb {
background: linear-gradient(to bottom, #ff7a18, #af002d);
}
.c-scrollbar_thumb {
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
}
Locomotive Scroll сам управляет позицией thumb, но можно
добавить визуальные эффекты:
.c-scrollbar {
opacity: 0;
transition: opacity 0.3s;
}
.has-scroll-scrolling .c-scrollbar {
opacity: 1;
}
.c-scrollbar_thumb {
transition: transform 0.2s;
}
.c-scrollbar_thumb:hover {
transform: scaleX(1.5);
}
При использовании кастомного скролла важно убрать стандартный:
html, body {
overflow: hidden;
}
Если используется горизонтальная прокрутка:
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
direction: 'horizontal',
scrollbarContainer: document.querySelector('.scrollbar-wrapper')
});
Стили:
.scrollbar-wrapper {
bottom: 10px;
left: 0;
width: 100%;
height: 8px;
}
.c-scrollbar_thumb {
height: 100%;
width: auto;
}
При необходимости можно синхронизировать скроллбар с другими элементами интерфейса:
scroll.on('scroll', (args) => {
const progress = args.scroll.y / args.limit.y;
document.querySelector('.progress-bar').style.width = `${progress * 100}%`;
});
1. Контейнер отсутствует в DOM
2. Неверное позиционирование
3. Перекрытие z-index
.scrollbar-wrapper {
z-index: 1000;
}
4. Конфликт с overflow
.scrollbar-wrapper {
overflow: hidden;
}
Можно создать независимые экземпляры:
new LocomotiveScroll({
el: document.querySelector('.container-1'),
scrollbarContainer: document.querySelector('.scrollbar-1')
});
new LocomotiveScroll({
el: document.querySelector('.container-2'),
scrollbarContainer: document.querySelector('.scrollbar-2')
});
scroll.options.scrollbarContainer = document.querySelector('.new-container');
scroll.update();
const scroll = new LocomotiveScroll({
scrollbarContainer: false
});
vh и
calc()box-shadow)blur,
backdrop-filter)smooth: falseПри использовании с анимационными библиотеками (например, GSAP):
scroll.on('scroll', ScrollTrigger.update);
Скроллбар при этом остаётся независимым, но визуально синхронизированным.
data-scroll-container — зона прокруткиscrollbarContainer — зона отображения скроллбара.c-scrollbar — трек.c-scrollbar_thumb — индикатор позицииТакое разделение даёт полный контроль над стилем, положением и поведением скроллбара без вмешательства в ядро библиотеки.