Smooth Scroll — это легковесная библиотека для плавной прокрутки по якорям на странице. В современных проектах часто возникает необходимость совмещать её работу с другими JavaScript-библиотеками, такими как анимационные фреймворки, слайдеры или ленивые загрузчики контента. Основная задача при этом — избежать конфликтов между событиями прокрутки, дублирования обработчиков и нарушения плавности анимаций.
Smooth Scroll строит свою логику вокруг перехвата стандартных действий браузера при клике на ссылки с якорями. Поэтому любые библиотеки, которые также управляют скроллом или изменяют положение элементов на странице, должны корректно учитывать, что прокрутка может быть уже управляемой Smooth Scroll.
Библиотеки вроде GSAP или Anime.js часто используют анимации элементов во время прокрутки. Для корректной работы совместно со Smooth Scroll необходимо:
Синхронизировать триггеры прокрутки. Если Smooth
Scroll прокручивает страницу, события scroll срабатывают
непрерывно. Анимационные библиотеки должны использовать эти события или
специальные коллбэки Smooth Scroll.
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 600,
speedAsDuration: true
});
document.addEventListener('scroll', () => {
// GSAP-анимации на основе текущей позиции прокрутки
gsap.to(".box", { y: window.scrollY / 2 });
});Использовать callback-функции Smooth Scroll.
Smooth Scroll предоставляет after и before
callbacks, которые позволяют запускать анимации после завершения
прокрутки или перед её началом.
const scroll = new SmoothScroll('a[href*="#"]', {
speed: 800,
before: (anchor, toggle) => {
console.log("Прокрутка началась к:", anchor);
},
after: (anchor, toggle) => {
console.log("Прокрутка завершена на:", anchor);
gsap.fromTo(anchor, {opacity: 0}, {opacity: 1, duration: 1});
}
});При интеграции Smooth Scroll с слайдерами типа Swiper, Slick, Flickity, важно учитывать:
Слайдеры могут изменять размер контейнера или смещать элементы при инициализации. Smooth Scroll должен быть инициализирован после окончательной разметки и отрисовки слайдера, чтобы корректно вычислять позиции якорей.
При динамическом изменении DOM (добавление слайдов, удаление элементов) нужно обновлять кеш позиций Smooth Scroll:
const scroll = new SmoothScroll('a[href*="#"]');
swiper.on('slideChange', () => {
scroll.update(); // пересчитывает позиции якорей
});Если слайдер содержит ссылки с якорями, желательно отключать автоматическую прокрутку слайдера при активации Smooth Scroll, чтобы не возникало «двойного» эффекта.
Lazy loading библиотек, таких как Lozad.js или lazysizes, может изменять высоту страницы после загрузки изображений или блоков. Smooth Scroll использует текущие координаты элементов для прокрутки, поэтому позиции якорей могут быть некорректными до полной загрузки контента.
Решения:
Вызывать scroll.update() после того, как новые
элементы появятся на странице:
const observer = lozad('.lazy', {
loaded: function(el) {
scroll.update(); // обновление координат
}
});
observer.observe();Использовать отложенную инициализацию Smooth Scroll до полной загрузки критически важных блоков:
window.addEventListener('load', () => {
const scroll = new SmoothScroll('a[href*="#"]');
});Некоторые библиотеки перехватывают события wheel,
touchmove или scroll для своих целей
(например, инерционная прокрутка, параллакс-эффекты). В таких случаях
Smooth Scroll может конфликтовать, создавая дерганую прокрутку или
«скачки».
Рекомендации:
Использовать опцию ignore, чтобы
исключить определённые ссылки или блоки из обработки Smooth Scroll.
const scroll = new SmoothScroll('a[href*="#"]', {
ignore: '[data-no-scroll]'
});Если библиотека полностью управляет скроллом, Smooth Scroll лучше использовать только для внутренних якорей, не вмешиваясь в глобальные события.
Для параллакса и sticky-элементов применять
requestAnimationFrame вместо прямого привязания к
событию scroll, чтобы снизить нагрузку и исключить
конфликты.
Предположим, есть страница с:
Правильная интеграция будет выглядеть так:
window.addEventListener('load', () => {
const scroll = new SmoothScroll('a[href*="#"]', { speed: 700 });
const swiper = new Swiper('.swiper-container', { slidesPerView: 1 });
const observer = lozad('.lazy', {
loaded: el => scroll.update()
});
observer.observe();
document.addEventListener('scroll', () => {
gsap.to(".animate-box", { y: window.scrollY / 3 });
});
swiper.on('slideChange', () => {
scroll.update();
});
});
Этот подход обеспечивает:
Такая стратегия интеграции позволяет использовать Smooth Scroll вместе с другими библиотеками без потери производительности и стабильности анимаций.