Для работы с Headroom.js необходимо подключить саму библиотеку. В
базовом случае можно использовать стандартное подключение через
или через пакетный менеджер, но в
современных веб-приложениях эффективнее использовать ленивую загрузку.
Это позволяет уменьшить время первой отрисовки страницы и подгружать
скрипт только тогда, когда он действительно нужен.
Ключевой момент — использование динамического import().
Этот метод позволяет загрузить библиотеку только после полной загрузки
DOM и только в случае, если элемент для управления действительно
присутствует на странице.
Headroom.js предоставляет несколько опций, которые можно гибко конфигурировать:
tolerance – количество пикселей прокрутки,
необходимое для срабатывания. Может быть числом или массивом
[upTolerance, downTolerance].
offset – расстояние от верхней границы страницы, после которого скрытие/появление шапки становится активным.
classes – объект с классами для разных состояний:
initial – начальный класс элемента;pinned – шапка зафиксирована при прокрутке вверх;unpinned – шапка скрыта при прокрутке вниз;top – элемент на верхней границе страницы;notTop – элемент не находится в верхней точке.Пример настройки с разными толерансами для прокрутки вверх и вниз:
const headroom = new Headroom(header, {
tolerance: { up: 10, down: 5 },
offset: 100,
classes: {
initial: "headroom",
pinned: "headroom--pinned",
unpinned: "headroom--unpinned",
top: "headroom--top",
notTop: "headroom--not-top"
}
});
При использовании React, Vue или Angular ленивую загрузку Headroom.js можно реализовать через динамический импорт внутри компонента или хука жизненного цикла. Например, в React:
import { useEffect } from "react";
function Header() {
useEffect(() => {
let headroomInstance;
async function loadHeadroom() {
const { default: Headroom } = await import('headroom.js');
const header = document.querySelector(".header");
headroomInstance = new Headroom(header);
headroomInstance.init();
}
loadHeadroom();
return () => headroomInstance?.destroy();
}, []);
return Меню ;
}
Преимущества такого подхода:
Для крупных страниц рекомендуется:
requestIdleCallback или setTimeout.Пример с requestIdleCallback:
document.addEventListener("DOMContentLoaded", () => {
if ('requestIdleCallback' in window) {
requestIdleCallback(async () => {
const { default: Headroom } = await import('headroom.js');
const header = document.querySelector(".header");
new Headroom(header).init();
});
} else {
setTimeout(async () => {
const { default: Headroom } = await import('headroom.js');
const header = document.querySelector(".header");
new Headroom(header).init();
}, 200);
}
});
Такой метод гарантирует, что загрузка скрипта не блокирует основной рендеринг страницы и повышает скорость отображения критического контента.
Headroom.js позволяет отслеживать состояния шапки через кастомные события:
header.addEventListener("headroom.pinned", () => console.log("Шапка зафиксирована"));
header.addEventListener("headroom.unpinned", () => console.log("Шапка скрыта"));
header.addEventListener("headroom.top", () => console.log("Верх страницы"));
header.addEventListener("headroom.notTop", () => console.log("Не на верхней границе"));
События можно использовать для динамического управления интерфейсом, подгрузки других модулей или изменения стилей в зависимости от прокрутки.