Headroom.js — это легковесная библиотека для управления поведением верхней панели навигации при прокрутке страницы. Основная задача библиотеки — динамически скрывать и показывать хедер в зависимости от направления прокрутки, что улучшает пользовательский опыт и экономит место на экране.
Библиотека оперирует тремя ключевыми состояниями элемента:
Эти состояния задаются через CSS-классы, которые Headroom.js добавляет и убирает автоматически.
Для работы Headroom.js необходимо получить DOM-элемент, к которому будет применяться библиотека. Инициализация выглядит следующим образом:
const header = document.querySelector('header');
const headroom = new Headroom(header, {
tolerance: 5,
offset: 100,
classes: {
initial: "headroom",
pinned: "headroom--pinned",
unpinned: "headroom--unpinned",
top: "headroom--top",
notTop: "headroom--not-top",
bottom: "headroom--bottom",
notBottom: "headroom--not-bottom"
}
});
headroom.init();
Параметры конфигурации:
tolerance — минимальное смещение в пикселях,
необходимое для изменения состояния. Может быть числом или объектом
{ up: X, down: Y }.offset — вертикальное смещение в пикселях, после
которого начнёт работать скрытие/показ хедера.classes — объект, задающий CSS-классы для различных
состояний.Headroom.js предоставляет встроенные события, которые позволяют реагировать на изменение состояния хедера:
header.addEventListener("headroom:pin", () => {
console.log("Header pinned");
});
header.addEventListener("headroom:unpin", () => {
console.log("Header hidden");
});
header.addEventListener("headroom:top", () => {
console.log("Reached top");
});
Использование этих событий позволяет интегрировать Headroom.js с анимациями, изменением стилей или логикой интерфейса.
Headroom.js использует
requestAnimationFrame для отслеживания
прокрутки, что снижает нагрузку на основной поток и повышает
производительность по сравнению с классическим обработчиком
scroll.
tolerance и offset помогают уменьшить
количество лишних обновлений.transform: translateY)
вместо изменения top или margin повышает
производительность, так как такие свойства обрабатываются GPU.Headroom.js легко интегрируется с React, Vue и Angular. Пример для React:
import Headroom from 'headroom.js';
import { useEffect, useRef } from 'react';
function AppHeader() {
const headerRef = useRef(null);
useEffect(() => {
const headroom = new Headroom(headerRef.current, {
tolerance: { up: 10, down: 20 },
offset: 50
});
headroom.init();
return () => headroom.destroy();
}, []);
return <header ref={headerRef}>Navigation</header>;
}
Для Vue можно использовать mounted и
ref, для Angular — ngAfterViewInit и
ElementRef.
Для анализа производительности Headroom.js можно использовать инструменты профилирования браузера:
headroom:pin/unpin.transform и
opacity, а не height или
top.debounce или throttle с сохранением работы
Headroom.js.Headroom.js можно конфигурировать под различные устройства:
const headroom = new Headroom(header, {
offset: window.innerWidth < 768 ? 50 : 100,
tolerance: { up: 10, down: 5 }
});
Такой подход позволяет скрывать хедер активнее на мобильных устройствах и более щадяще на десктопах.
Headroom.js поддерживает пользовательские плагины. Пример добавления анимации с библиотекой GSAP:
header.addEventListener("headroom:unpin", () => {
gsap.to(header, { y: -header.offsetHeight, duration: 0.3 });
});
header.addEventListener("headroom:pin", () => {
gsap.to(header, { y: 0, duration: 0.3 });
});
Такой подход позволяет объединять Headroom.js с любыми библиотеками анимации без потери производительности.
requestAnimationFrame вместо scroll
listener напрямую снижает нагрузку на рендер.tolerance и offset уменьшает
частоту изменений DOM.transform обеспечивают плавность и
минимальную нагрузку.headroom:* позволяют гибко управлять логикой
интерфейса без лишних перерасчётов.Headroom.js сочетает простоту и высокую производительность, что делает его оптимальным выбором для динамических интерфейсов с адаптивным хедером.