Headroom.js — это лёгкая JavaScript-библиотека, предназначенная для управления видимостью элементов интерфейса в зависимости от прокрутки страницы. Чаще всего используется для создания «умных» шапок (header), которые скрываются при прокрутке вниз и появляются при прокрутке вверх.
Ключевая задача — улучшение пользовательского опыта за счёт экономии пространства на экране и обеспечения быстрого доступа к навигации.
Библиотека отслеживает направление прокрутки страницы и изменяет CSS-классы элемента, к которому она применена.
Поведение можно описать следующим образом:
Headroom.js не занимается анимацией напрямую — она лишь добавляет и удаляет CSS-классы. Вся визуальная часть реализуется через CSS.
Существует два основных способа подключения:
<script src="https://unpkg.com/headroom.js@0.12.0/dist/headroom.min.js"></script>
npm install headroom.js
Импорт в модульной среде:
import Headroom from "headroom.js";
Инициализация происходит через создание экземпляра класса Headroom:
const header = document.querySelector("header");
const headroom = new Headroom(header);
headroom.init();
После этого библиотека начинает отслеживать прокрутку и применять соответствующие классы.
Headroom.js добавляет и удаляет набор классов, определяющих состояние элемента:
headroom — базовый классheadroom--pinned — элемент виден (закреплён)headroom--unpinned — элемент скрытheadroom--top — страница в верхней позицииheadroom--not-top — страница прокручена внизheadroom--bottom — достигнут низ страницыheadroom--not-bottom — не достигнут низ страницыПример CSS для анимации:
header {
transition: transform 0.3s ease;
}
.headroom--pinned {
transform: translateY(0%);
}
.headroom--unpinned {
transform: translateY(-100%);
}
Состояния формируются на основе нескольких факторов:
unpinnedpinnedtopbottomИзменения состояния происходят не мгновенно, а после достижения определённого порога прокрутки (tolerance).
Headroom.js предоставляет гибкую систему конфигурации.
Пример инициализации с параметрами:
const headroom = new Headroom(header, {
offset: 100,
tolerance: {
up: 10,
down: 5
},
classes: {
initial: "headroom",
pinned: "headroom--pinned",
unpinned: "headroom--unpinned",
top: "headroom--top",
notTop: "headroom--not-top",
bottom: "headroom--bottom",
notBottom: "headroom--not-bottom"
}
});
Определяет расстояние (в пикселях), после которого начинается реакция на прокрутку.
offset: 100
До достижения этого значения элемент остаётся в состоянии
top.
Задаёт чувствительность к прокрутке.
tolerance: {
up: 10,
down: 5
}
up — минимальное расстояние прокрутки вверх для
изменения состоянияdown — аналогично для прокрутки внизПозволяет избежать частых переключений при мелких движениях.
Позволяет переопределить имена CSS-классов.
Полезно при интеграции в существующие проекты с собственной системой именования.
Headroom.js поддерживает набор колбэков, вызываемых при изменении состояния.
Пример:
const headroom = new Headroom(header, {
onPin: function() {
console.log("Появился");
},
onUnpin: function() {
console.log("Скрылся");
},
onTop: function() {
console.log("Верх страницы");
},
onNotTop: function() {
console.log("Не верх страницы");
}
});
onPin — элемент стал видимымonUnpin — элемент скрытonTop — достигнут верх страницыonNotTop — пользователь прокрутил внизonBottom — достигнут низ страницыonNotBottom — пользователь ушёл от нижней границыHeadroom.js предоставляет методы для ручного управления:
headroom.pin(); // показать элемент
headroom.unpin(); // скрыть элемент
headroom.freeze(); // остановить реакцию на прокрутку
headroom.unfreeze(); // возобновить работу
headroom.destroy(); // удалить все обработчики
window.addEventListener("click", () => {
headroom.freeze();
});
Библиотека оптимизирована для работы с прокруткой:
requestAnimationFrameЭто делает её подходящей даже для мобильных устройств.
Самый распространённый кейс — навигационная панель, которая:
Например:
Особенно актуально для небольших экранов, где важно экономить пространство.
Без Headroom.js:
С Headroom.js:
Headroom.js максимально эффективно работает в связке с:
transformtransitionwill-changeРекомендуемый подход:
header {
will-change: transform;
}
Это повышает производительность анимаций.
Возможности можно расширять за счёт:
Особенности:
toleranceПример:
tolerance: {
up: 20,
down: 10
}
Headroom.js — это инструмент для декларативного управления видимостью элементов на основе поведения пользователя при прокрутке. Библиотека отделяет логику от представления: JavaScript отвечает за состояние, CSS — за визуализацию.