Headroom.js — это библиотека для управления поведением фиксированных заголовков на веб-страницах. Она позволяет автоматически скрывать или показывать шапку при прокрутке страницы, что улучшает пользовательский опыт и экономит место на экране.
Главная идея Headroom.js заключается в наблюдении за направлением и
скоростью прокрутки страницы, после чего применяется соответствующий
CSS-класс к элементу, обычно <header>, для управления
его видимостью.
// Пример базовой инициализации
const header = document.querySelector("header");
const headroom = new Headroom(header);
headroom.init();
В этом примере Headroom создаёт экземпляр для элемента
<header> и автоматически добавляет к нему необходимые
слушатели прокрутки.
Headroom.js управляет видимостью элемента через CSS-классы. Основные из них:
Эти классы позволяют использовать CSS-переходы и анимации для плавного появления и скрытия шапки.
header {
transition: transform 0.3s ease-in-out;
}
.headroom--unpinned {
transform: translateY(-100%);
}
.headroom--pinned {
transform: translateY(0);
}
Headroom.js предоставляет множество опций для тонкой настройки поведения заголовка:
{up: x, down: y}.const headroom = new Headroom(header, {
tolerance: { up: 5, down: 10 },
offset: 50,
classes: {
pinned: "header-visible",
unpinned: "header-hidden",
},
onPin: () => console.log("Header pinned"),
onUnpin: () => console.log("Header unpinned"),
});
headroom.init();
Headroom.js легко интегрируется с React, Vue или Angular. В React
можно создать компонент обёртку для <header>:
import React, { useEffect, useRef } from "react";
import Headroom from "headroom.js";
export default function StickyHeader({ children }) {
const headerRef = useRef(null);
useEffect(() => {
const headroom = new Headroom(headerRef.current);
headroom.init();
return () => headroom.destroy();
}, []);
return (
<header ref={headerRef}>
{children}
</header>
);
}
Во Vue достаточно создать директиву для автоматического подключения Headroom.js к нужному элементу.
transform и transition для минимизации
«дёргания» заголовка.tolerance для прокрутки вверх и вниз.@media (max-width: 768px) {
header {
height: 60px;
}
.headroom--unpinned {
transform: translateY(-60px);
}
}
requestAnimationFrame для плавного
обновления стиля элемента. Headroom.js делает это автоматически, но для
сложных анимаций можно кастомизировать.onPin и onUnpin для фиксации пользовательского
поведения.const headroom = new Headroom(header, {
onPin: () => analytics.track("HeaderPinned"),
onUnpin: () => analytics.track("HeaderHidden"),
});
Headroom.js сочетает простоту и гибкость, позволяя создавать современный и отзывчивый интерфейс с динамическими заголовками, которые улучшают взаимодействие пользователя с сайтом.