В библиотеке Locomotive Scroll скроллбар не является нативным элементом браузера. Он полностью контролируется JavaScript и рендерится поверх контента, что позволяет гибко настраивать внешний вид и поведение.
По умолчанию библиотека добавляет кастомный контейнер скроллбара
внутрь корневого элемента с атрибутом
data-scroll-container. Этот элемент получает класс:
.c-scrollbar
Внутри него располагается ползунок:
.c-scrollbar_thumb
Это основа для всей дальнейшей кастомизации.
После инициализации создаётся следующая структура:
<div class="c-scrollbar">
<div class="c-scrollbar_thumb"></div>
</div>
В случае горизонтального скролла добавляется модификатор:
<div class="c-scrollbar c-scrollbar_horizontal">
Ключевые особенности:
overflowtransformСтилизация начинается с переопределения стандартных классов.
.c-scrollbar {
position: absolute;
right: 0;
top: 0;
width: 8px;
height: 100%;
background: transparent;
}
Основные параметры:
width — ширина скроллбараbackground — фон контейнераposition — обычно absolute.c-scrollbar_thumb {
background-color: #000;
width: 100%;
border-radius: 4px;
}
Настраиваемые свойства:
background-color)border-radius)opacity)box-shadow)Скроллбар можно делать динамическим, скрывая его вне взаимодействия.
.c-scrollbar {
opacity: 0;
transition: opacity 0.3s ease;
}
.has-scroll-scrolling .c-scrollbar,
.has-scroll-dragging .c-scrollbar {
opacity: 1;
}
Классы:
.has-scroll-scrolling — активный скролл.has-scroll-dragging — перетаскиваниеЭто позволяет реализовать поведение, аналогичное macOS.
Инициализация с параметрами:
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
scrollbarContainer: document.querySelector('#custom-scrollbar')
});
Параметр:
scrollbarContainer — позволяет вынести скроллбар в
отдельный DOM-узелСоздание собственного контейнера:
<div id="custom-scrollbar"></div>
И подключение:
scrollbarContainer: document.getElementById('custom-scrollbar')
Это позволяет:
Скроллбар можно переместить в любое место интерфейса:
.c-scrollbar {
left: 20px;
right: auto;
}
Или сделать горизонтальным:
.c-scrollbar_horizontal {
bottom: 0;
height: 6px;
width: 100%;
}
Добавление интерактивности:
.c-scrollbar_thumb:hover {
background-color: #ff0000;
cursor: pointer;
}
Также можно изменить размер:
.c-scrollbar:hover {
width: 12px;
}
Библиотека предоставляет доступ к событиям скролла:
scroll.on('scroll', (args) => {
console.log(args.scroll.y);
});
Это позволяет:
Пример кастомного скроллбара в виде прогресс-линии:
<div class="progress-bar"></div>
.progress-bar {
position: fixed;
top: 0;
left: 0;
height: 4px;
background: black;
width: 0%;
}
scroll.on('scroll', ({ scroll, limit }) => {
const progress = scroll.y / limit.y;
document.querySelector('.progress-bar').style.width = `${progress * 100}%`;
});
Для удобства масштабирования:
:root {
--scrollbar-width: 8px;
--scrollbar-color: #111;
}
.c-scrollbar {
width: var(--scrollbar-width);
}
.c-scrollbar_thumb {
background-color: var(--scrollbar-color);
}
.c-scrollbar {
width: 2px;
background: transparent;
}
.c-scrollbar_thumb {
background: rgba(0, 0, 0, 0.5);
}
Подходит для:
.c-scrollbar {
width: 16px;
background: #f0f0f0;
}
.c-scrollbar_thumb {
background: #333;
border-radius: 8px;
}
Используется в:
.c-scrollbar_thumb {
box-shadow: inset 0 0 5px rgba(0,0,0,0.3);
}
Или внешняя тень:
.c-scrollbar {
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
body.dark .c-scrollbar_thumb {
background-color: #fff;
}
body.dark .c-scrollbar {
background-color: rgba(255,255,255,0.1);
}
Полное скрытие:
.c-scrollbar {
display: none;
}
Или через настройки:
scrollbar: false
Скроллбар не является нативным, поэтому:
Производительность зависит от transform и
requestAnimationFrame
Не работает корректно без smooth: true