Headroom.js — это лёгкая библиотека для управления видимостью шапки страницы при скролле, основанная на принципе скрытия и показа элементов интерфейса в зависимости от направления прокрутки. Для глубокого понимания её работы и возможности адаптировать поведение под свои задачи полезно изучить процесс форка и модификации исходного кода.
Исходный код Headroom.js организован следующим образом:
Core module – основной модуль, отвечающий за:
CSS-классы – по умолчанию библиотека использует:
headroom – базовый класс элемента.headroom--pinned – элемент закреплён на экране.headroom--unpinned – элемент скрыт.headroom--top и headroom--not-top –
дополнительные состояния для верхней позиции страницы.Настройки конфигурации включают:
tolerance – порог для срабатывания событий.offset – смещение при котором начинает работать логика
скрытия.classes – объект с настраиваемыми CSS-классами.Форк библиотеки предполагает копирование исходного репозитория и создание собственного проекта с возможностью внесения изменений. Для этого необходимо:
git clone https://github.com/WickyNilliams/headroom.js.git
cd headroom.js
git checkout -b custom-headroom
Основной метод обработки скролла находится в классе
Headroom:
Headroom.prototype.update = function () {
var currentScroll = window.pageYOffset || document.documentElement.scrollTop;
var toleranceExceeded = Math.abs(currentScroll - this.lastScrollY) >= this.tolerance;
if (!toleranceExceeded) return;
if (currentScroll > this.lastScrollY && currentScroll > this.offset) {
this.unpin();
} else if (currentScroll < this.lastScrollY) {
this.pin();
}
this.lastScrollY = currentScroll;
};
Изменение чувствительности:
tolerance можно увеличивать, чтобы шапка реже
скрывалась, либо уменьшать для более чувствительного реагирования.Изменение смещения:
offset задаёт позицию, после которой появляется логика
скрытия. Можно задать разный offset для мобильной и десктопной
версии.Кастомные события:
pin и
unpin позволяет интегрировать анимацию или трекинг:Headroom.prototype.pin = function () {
this.elem.classList.add(this.classes.pinned);
this.elem.classList.remove(this.classes.unpinned);
this.onPin && this.onPin();
};
Headroom.prototype.unpin = function () {
this.elem.classList.add(this.classes.unpinned);
this.elem.classList.remove(this.classes.pinned);
this.onUnpin && this.onUnpin();
};
npm install
npm run build
Результат будет находиться в папке dist, где доступны
версии headroom.js и headroom.min.js.
import Headroom from './dist/headroom.js';
var myElement = document.querySelector('header');
var headroom = new Headroom(myElement, {
tolerance: 10,
offset: 50,
onPin: function() { console.log('Pinned'); },
onUnpin: function() { console.log('Unpinned'); }
});
headroom.init();
Для создания уникального поведения можно:
Добавить новые состояния:
headroom--scrolled-half для изменения стиля
после достижения 50% высоты страницы.Изменять CSS-анимации через JS:
Комбинировать с другими библиотеками:
console.log или debugger
внутри методов pin, unpin и
update.После внесения изменений можно:
package.json.npm run build.Форк и модификация Headroom.js дают полную свободу контроля над поведением шапки страницы, позволяя адаптировать библиотеку под любые требования интерфейса и анимации.