Headroom.js — это легковесная библиотека для управления поведением шапки страницы при скролле. Одним из ключевых аспектов при интеграции Headroom.js на сложных веб-страницах является его взаимодействие с библиотеками для параллакса, такими как Rellax.js, Parallax.js или Locomotive Scroll. Основная задача — избежать конфликтов в обработке событий прокрутки и обеспечить плавную анимацию элементов.
Headroom.js реагирует на события scroll и вычисляет
направление движения страницы (вверх или вниз). Parallax-библиотеки
также часто используют событие scroll для обновления
позиции элементов с эффектом глубины. Если обработчики скролла обеих
библиотек выполняются некорректно или в неправильном порядке, возможны
следующие проблемы:
Чтобы этого избежать, важно правильно управлять приоритетом обработки событий и минимизировать нагрузку на основной поток браузера.
Rellax.js работает с элементами, имеющими атрибут
data-rellax-speed. Для совместной работы с Headroom.js
рекомендуется:
var header = document.querySelector('header');
var headroom = new Headroom(header, {
tolerance: 5,
offset: 50,
classes: {
pinned: 'headroom--pinned',
unpinned: 'headroom--unpinned'
}
});
headroom.init();
var rellax = new Rellax('.rellax', {
speed: -2,
center: false,
round: true,
vertical: true
});
requestAnimationFrame для обновления
Rellax, чтобы синхронизировать с анимацией шапки:window.addEventListener('scroll', function() {
requestAnimationFrame(function() {
rellax.refresh();
});
});
Это уменьшает нагрузку на основной поток и предотвращает дергание элементов при быстром скролле.
Parallax.js создает эффект движения элементов относительно курсора и скролла. При сочетании с Headroom.js необходимо:
headroom--pinned и headroom--unpinned.update() после каждой смены
состояния шапки:headroom.on('pin', function() {
parallaxInstance.update();
});
headroom.on('unpin', function() {
parallaxInstance.update();
});
Это гарантирует, что при скрытии и появлении шапки элементы параллакса корректно пересчитают свои позиции и не окажутся “плавающими” на странице.
Locomotive Scroll использует виртуальный скролл через
transform-атрибуты, что может вызвать конфликты с Headroom.js, если
шапка рассчитывает смещение страницы через window.scrollY.
Чтобы совместить обе библиотеки:
scroller в конфигурацию Headroom.js через
кастомный метод getScrollY:var headroom = new Headroom(header, {
tolerance: 5,
offset: 50,
onUnpin: function() { /* кастомная логика */ },
onPin: function() { /* кастомная логика */ },
scrollElem: document.querySelector('[data-scroll-container]') // контейнер Locomotive Scroll
});
headroom.init();
update() после изменения классов Headroom:headroom.on('pin', function() {
locoScroll.update();
});
headroom.on('unpin', function() {
locoScroll.update();
});
Таким образом сохраняется плавность шапки и точность параллакса одновременно.
Правильная интеграция Headroom.js с parallax-библиотеками позволяет достичь гладкого UX, где шапка корректно скрывается и появляется, а элементы с параллакс-эффектом остаются стабильными и синхронизированными с прокруткой.