Решение типичных проблем

Для корректной работы Locomotive Scroll необходимо правильно инициализировать скролл и настроить контейнер. Основной контейнер должен иметь атрибут data-scroll-container, а его содержимое — корректно структурированное. Пример базовой инициализации:

import LocomotiveScroll from 'locomotive-scroll';

const scroll = new LocomotiveScroll({
  el: document.querySelector('[data-scroll-container]'),
  smooth: true,
  multiplier: 1.0,
  class: 'is-revealed',
});

Ключевые параметры:

  • el — контейнер для скролла;
  • smooth — включение плавного скролла;
  • multiplier — скорость скролла относительно дефолтного поведения;
  • class — CSS-класс для анимации появления элементов.

Важно учитывать, что для мобильных устройств может понадобиться отдельная конфигурация smartphone и tablet с параметром smooth.


Проблемы с размерами контейнера и позиционированием

Частая ошибка — некорректное определение высоты контейнера. Locomotive Scroll рассчитывает скролл на основе размеров контейнера. Если контейнер не растягивается на всю высоту контента, появляются «обрезанные» скроллы. Решения:

  • Убедиться, что CSS для контейнера включает:
[data-scroll-container] {
  min-height: 100vh;
  overflow: hidden;
  position: relative;
}
  • Если контент динамически добавляется, необходимо обновлять скролл после изменений:
scroll.update();

Сбои плавного скролла на мобильных устройствах

На iOS и Android плавный скролл иногда «подтормаживает» или не работает. Основные причины:

  1. Включение smooth на мобильных устройствах. Решение: использовать условную инициализацию:
const scroll = new LocomotiveScroll({
  el: document.querySelector('[data-scroll-container]'),
  smooth: window.innerWidth > 1024, 
});
  1. Использование position: fixed внутри контейнера. Элементы с фиксированным позиционированием конфликтуют со скроллом. Выход: применять data-scroll-sticky и обертывать элемент в родительский контейнер.

Проблемы с анимацией элементов при скролле

Locomotive Scroll поддерживает анимацию через data-scroll и data-scroll-speed. Часто возникает ситуация, когда анимация не запускается. Основные причины:

  • Элемент вне видимой области при инициализации. Решение: вызвать scroll.update() после динамической загрузки контента.
  • Неправильное использование атрибутов:
<div data-scroll data-scroll-speed="2">Текст</div>
  • Конфликт с другими библиотеками анимации. В таких случаях рекомендуется отключить плавный скролл для конфликтующих элементов или использовать совместимые решения (например, GSAP с scrollTrigger).

Локальные и глобальные события скролла

Locomotive Scroll позволяет подписываться на события:

  • scroll — срабатывает при любом движении скролла;
  • call — триггерит функцию при достижении определённого элемента;

Пример использования:

scroll.on('scroll', (obj) => {
  console.log(obj.scroll.y);
});

scroll.on('call', (func, way, obj) => {
  if(func === 'animate') {
    // логика анимации
  }
});

Типичная ошибка — неправильное связывание событий с DOM-элементами, которые ещё не загружены. Решение: инициализировать скролл после полной загрузки DOM или использовать DOMContentLoaded.


Конфликты с горизонтальным скроллом и CSS-трансформациями

Locomotive Scroll применяет transform: translate3d для контейнера. Если другие элементы используют трансформации на родительском уровне, возникает визуальное смещение. Основные рекомендации:

  • Не применять transform к data-scroll-container или его непосредственным родителям.
  • Для горизонтального скролла использовать отдельный контейнер с data-scroll-direction="horizontal".

Пример:

const scroll = new LocomotiveScroll({
  el: document.querySelector('[data-scroll-container]'),
  direction: 'horizontal',
  smooth: true,
});

Работа с динамически подгружаемым контентом

Если контент добавляется после инициализации, без обновления скролла элементы могут не появляться в расчетах. Алгоритм решения:

  1. Добавить новый контент в контейнер.
  2. Вызвать:
scroll.update();
  1. Для анимации новых элементов, пометить их data-scroll и при необходимости повторно активировать обработчики событий.

Настройка производительности

Проблемы с производительностью возникают при большом количестве элементов с атрибутами data-scroll. Методы оптимизации:

  • Ограничение количества элементов с анимацией одновременно.
  • Использование scroll.update() только при необходимости.
  • Ограничение data-scroll-speed для тяжелых элементов.
  • Выключение smooth на мобильных устройствах и для слабых устройств.

Совместимость с другими библиотеками

Часто Locomotive Scroll конфликтует с:

  • GSAP — рекомендуется использовать ScrollTrigger с опцией scroller.
  • FullPage.js — оба скрипта управляют скроллом, требуется отключать один из них для предотвращения конфликтов.

Пример интеграции с GSAP:

gsap.registerPlugin(ScrollTrigger);

ScrollTrigger.scrollerProxy("[data-scroll-container]", {
  scrollTop(value) {
    return arguments.length ? scroll.scrollTo(value, 0, 0) : scroll.scroll.instance.scroll.y;
  },
  getBoundingClientRect() {
    return {top: 0, left: 0, width: window.innerWidth, height: window.innerHeight};
  },
});

Эти решения покрывают большинство типичных проблем при работе с Locomotive Scroll и обеспечивают корректное отображение, плавность и предсказуемое поведение скролла на всех устройствах.