Headroom.js — это лёгкая библиотека для управления поведением верхней
панели при скролле страницы. По умолчанию библиотека использует
предопределённые CSS-классы для управления состояниями элемента:
headroom, headroom--pinned,
headroom--unpinned и headroom--top,
headroom--not-top. Иногда стандартные классы не
соответствуют существующему стилю проекта, поэтому необходимо их
переопределять.
При инициализации Headroom.js можно передавать объект конфигурации
classes, который позволяет определить собственные имена
классов для различных состояний:
var myElement = document.querySelector("#header");
var headroom = new Headroom(myElement, {
classes: {
initial: "header-initial", // класс при инициализации
pinned: "header-visible", // класс при закреплении
unpinned: "header-hidden", // класс при скрытии
top: "header-top", // класс, когда скролл на вершине
notTop: "header-not-top", // класс, когда скролл не на вершине
bottom: "header-bottom", // класс при достижении низа (опционально)
notBottom: "header-not-bottom" // класс, когда не на дне (опционально)
}
});
headroom.init();
Ключевые моменты:
initial — используется единожды при первом создании
экземпляра, обычно для задания базового стиля.pinned и unpinned — отвечают за
динамическое поведение при скролле. При прокрутке вниз
unpinned активируется, скрывая элемент, а при прокрутке
вверх — pinned, показывая его.top и notTop — позволяют задавать
визуальное различие между верхней позицией страницы и остальной областью
скролла.bottom и notBottom — позволяют реагировать
на достижение нижней границы страницы, что может быть полезно для
футеров или sticky-элементов.Даже при использовании стандартных классов, их поведение можно изменить через CSS. Например:
.headroom {
transition: transform 0.3s ease-in-out;
position: fixed;
width: 100%;
}
.headroom--pinned {
transform: translateY(0);
}
.headroom--unpinned {
transform: translateY(-100%);
}
При переопределении стандартных классов важно сохранить
логическую структуру состояний. Например, нельзя убрать
headroom--unpinned, иначе библиотека не сможет корректно
управлять скрытием элемента.
Headroom.js позволяет использовать кастомные события для управления поведением через JavaScript. Это полезно, если требуется добавить дополнительный класс при специфическом событии скролла:
myElement.addEventListener("headroom:unpinned", function() {
myElement.classList.add("shadow-effect");
});
myElement.addEventListener("headroom:pinned", function() {
myElement.classList.remove("shadow-effect");
});
Такой подход позволяет полностью контролировать визуальное оформление без изменения внутренней логики библиотеки.
site-header--pinned, чтобы избежать конфликтов.При интеграции с React, Vue или Angular рекомендуется использовать ref или querySelector для получения DOM-элемента, затем передавать его в Headroom.js. При этом кастомные классы могут использоваться совместно с библиотеками CSS-in-JS или scoped CSS:
// React пример
import { useEffect, useRef } from "react";
import Headroom from "headroom.js";
function Header() {
const headerRef = useRef(null);
useEffect(() => {
const headroom = new Headroom(headerRef.current, {
classes: {
initial: "header-initial",
pinned: "header-visible",
unpinned: "header-hidden",
}
});
headroom.init();
}, []);
return <header ref={headerRef}>...</header>;
}
Использование собственных классов позволяет полностью контролировать визуальное поведение верхнего блока, интегрировать Headroom.js в существующие системы стилей и создавать более плавный UX при скролле.