Библиотека Locomotive Scroll изначально ориентирована на создание
плавного скроллинга с использованием трансформаций
(transform) и виртуального позиционирования. Это
накладывает определённые ограничения и требования при разработке
адаптивных интерфейсов.
Адаптивность в контексте Locomotive Scroll включает:
Locomotive Scroll поддерживает разные конфигурации для десктопа и
мобильных устройств через параметр smartphone и
tablet.
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
smartphone: {
smooth: false
},
tablet: {
smooth: false
}
});
Locomotive Scroll не предоставляет встроенной системы брейкпоинтов, поэтому адаптивность реализуется через:
const isMobile = window.innerWidth < 768;
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: !isMobile
});
function createScroll() {
return new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: window.innerWidth > 1024
});
}
let scroll = createScroll();
window.addEventListener('resize', () => {
scroll.destroy();
scroll = createScroll();
});
При изменении размера окна необходимо пересоздавать экземпляр, а не просто менять параметры.
Locomotive Scroll не всегда корректно реагирует на изменение размеров контейнера. Требуется ручной вызов обновления:
window.addEventListener('resize', () => {
scroll.update();
});
update():На мобильных устройствах рекомендуется:
smartphone: {
smooth: false
}
Locomotive Scroll ломает стандартное поведение
position: fixed, так как контейнер скролла
трансформируется.
data-scroll-sticky<div data-scroll data-scroll-sticky data-scroll-target="#section">
Фиксированный элемент
</div>
data-scroll-targetПри использовании Locomotive Scroll важно учитывать:
<img data-scroll src="image.jpg" alt="">
imagesLoaded(document.querySelector('[data-scroll-container]'), () => {
scroll.update();
});
Без update() элементы могут отображаться с неправильными
координатами.
Скорость скролла может отличаться на разных устройствах.
<div data-scroll data-scroll-speed="2">
Быстрый элемент
</div>
>3)На мобильных устройствах или слабых ПК рекомендуется отключать тяжёлые эффекты:
const scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: window.innerWidth > 768,
lerp: window.innerWidth > 768 ? 0.1 : 1
});
lerp:Locomotive Scroll активно использует data-атрибуты:
data-scrolldata-scroll-speeddata-scroll-directiondata-scroll-delayif (window.innerWidth < 768) {
document.querySelectorAll('[data-scroll-speed]').forEach(el => {
el.removeAttribute('data-scroll-speed');
});
}
Locomotive Scroll добавляет классы:
is-inviewhas-scroll-scrollinghas-scroll-smooth.has-scroll-smooth .menu {
opacity: 0.8;
}
@media (max-width: 768px) {
.menu {
opacity: 1;
}
}
Важно учитывать, что Locomotive Scroll работает с одним основным контейнером:
<div data-scroll-container>
...
</div>
Использовать flex и auto-height, избегая жёстких размеров.
Locomotive Scroll корректно работает с современными layout-системами, но:
scroll.on('scroll', () => {
scroll.update();
});
(использовать осторожно из-за производительности)
При добавлении элементов:
const newBlock = document.createElement('div');
newBlock.setAttribute('data-scroll', '');
document.querySelector('[data-scroll-container]').appendChild(newBlock);
scroll.update();
Иногда проще полностью отказаться от библиотеки на мобильных:
let scroll = null;
function initScroll() {
if (window.innerWidth > 1024) {
scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true
});
}
}
function destroyScroll() {
if (scroll) {
scroll.destroy();
scroll = null;
}
}
window.addEventListener('resize', () => {
if (window.innerWidth <= 1024) {
destroyScroll();
} else if (!scroll) {
initScroll();
}
});
position: fixedПри использовании вместе с:
необходимо:
scroll.update();
после каждого изменения DOM.
scroll.on('scroll', (args) => {
const scrollY = args.scroll.y;
if (scrollY > 500 && window.innerWidth > 768) {
// логика для десктопа
}
});
scroll.update() при изменениях