Locomotive Scroll — мощная библиотека для плавного скролла и управления анимациями при прокрутке. Часто возникает необходимость адаптировать поведение скролла под разные размеры экранов. Для этого используются media queries и механизмы реинициализации.
Для начала создаём экземпляр скролла с базовыми опциями:
import LocomotiveScroll from 'locomotive-scroll';
let scroll = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
lerp: 0.1,
});
Чтобы включить или отключить плавный скролл в зависимости от ширины
экрана, используют window.matchMedia:
const mq = window.matchMedia('(min-width: 1024px)');
let scrollInstance;
function initScroll() {
if (mq.matches) {
scrollInstance = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
lerp: 0.1,
});
} else {
if (scrollInstance) {
scrollInstance.destroy();
scrollInstance = null;
}
}
}
mq.addEventListener('change', initScroll);
window.addEventListener('load', initScroll);
Ключевые моменты:
mq.matches возвращает true, если условие
media query выполняется..destroy(), чтобы избежать утечек
памяти или конфликтов с анимациями.addEventListener('change', ...) позволяет
автоматически реагировать на изменение ширины окна.Если контент страницы динамически изменяется (например, добавляются новые секции, изображения или асинхронные блоки), необходимо обновить скролл:
scrollInstance.update();
Сценарии применения:
Важно:
update()пересчитывает позиции всех элементов с атрибутомdata-scroll, но не создаёт новый экземпляр. Для изменения настроек потребуется сначала вызвать.destroy()и затем создать новый объект.
Часто встречается ситуация, когда на мобильных устройствах нужно отключить smooth scroll. В таком случае media queries и реинициализация работают вместе:
function responsiveScroll() {
const width = window.innerWidth;
if (width >= 1024) {
if (!scrollInstance) {
scrollInstance = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
lerp: 0.1,
});
}
} else {
if (scrollInstance) {
scrollInstance.destroy();
scrollInstance = null;
}
}
}
window.addEventListener('resize', responsiveScroll);
window.addEventListener('load', responsiveScroll);
Особенности:
destroy() полностью очищает события, inline-стили и
слушатели библиотеки.resize позволяет плавно
переключаться между режимами при повороте экрана или изменении размера
окна.reset() для переинициализации отдельных эффектовLocomotive Scroll предоставляет метод reset(), который
полезен для повторного расчёта позиций и триггеров без
уничтожения всего скролла:
scrollInstance.reset();
Применяется, когда:
data-scroll или
data-scroll-speed.Разница между
.update()и.reset()заключается в том, чтоupdate()обновляет позиции элементов, аreset()сбрасывает все внутренние кэши и позиции, что важно при кардинальных изменениях контента.
Если проект содержит сложные анимации, ленивую загрузку изображений и адаптивный дизайн, рекомендуется объединять подходы:
update() или reset().function dynamicResponsiveScroll() {
const mq = window.matchMedia('(min-width:1024px)');
if (mq.matches) {
if (!scrollInstance) {
scrollInstance = new LocomotiveScroll({
el: document.querySelector('[data-scroll-container]'),
smooth: true,
lerp: 0.1,
});
} else {
scrollInstance.update();
}
} else {
if (scrollInstance) {
scrollInstance.destroy();
scrollInstance = null;
}
}
}
window.addEventListener('resize', dynamicResponsiveScroll);
window.addEventListener('load', dynamicResponsiveScroll);
Такой подход гарантирует, что:
data-scroll.destroy() inline-стили и transform свойства,
установленные библиотекой, полностью убираются, что предотвращает
визуальные артефакты.Media queries и реинициализация являются фундаментальными инструментами для построения адаптивного и динамичного скролла с Locomotive Scroll, обеспечивая стабильное поведение и корректную работу анимаций на любых устройствах.