Headroom.js — это лёгкая библиотека для управления поведением шапки сайта при прокрутке страницы. Основная функциональность заключается в том, чтобы скрывать шапку при прокрутке вниз и показывать её при прокрутке вверх, что повышает удобство навигации и экономит пространство на экране.
Для работы Headroom.js необходим доступ к элементу DOM, который будет «контролироваться» библиотекой:
// Подключение через npm или CDN
import Headroom from "headroom.js";
// Получение элемента шапки
const header = document.querySelector(".header");
// Инициализация Headroom
const headroom = new Headroom(header, {
tolerance: {
up: 5, // минимальное смещение вверх для показа шапки
down: 10 // минимальное смещение вниз для скрытия шапки
},
offset: 50, // расстояние прокрутки, после которого начинает работать Headroom
classes: {
initial: "headroom",
pinned: "headroom--pinned",
unpinned: "headroom--unpinned",
top: "headroom--top",
notTop: "headroom--not-top"
}
});
// Запуск наблюдения за прокруткой
headroom.init();
Ключевым моментом является объект classes, который
позволяет задавать кастомные CSS-классы для различных состояний
шапки.
Headroom.js использует четыре состояния:
CSS-анимации для плавного появления и скрытия шапки могут выглядеть так:
.headroom {
transition: transform 0.3s ease-in-out;
}
.headroom--unpinned {
transform: translateY(-100%);
}
.headroom--pinned {
transform: translateY(0%);
}
Infinite scroll (бесконечная прокрутка) подразумевает динамическую подгрузку контента при достижении конца страницы. Интеграция с Headroom.js требует аккуратного отслеживания события скролла и состояния страницы.
Пример реализации бесконечной прокрутки:
let page = 1;
const container = document.querySelector(".content");
window.addEventListener("scroll", () => {
const scrollTop = window.pageYOffset || document.documentElement.scrollTop;
const windowHeight = window.innerHeight;
const documentHeight = document.documentElement.scrollHeight;
// Подгрузка контента за 100px до конца страницы
if (scrollTop + windowHeight >= documentHeight - 100) {
loadMoreContent();
}
});
function loadMoreContent() {
page++;
fetch(`/api/content?page=${page}`)
.then(response => response.json())
.then(data => {
data.items.forEach(item => {
const element = document.createElement("div");
element.className = "item";
element.innerHTML = item.html;
container.appendChild(element);
});
// Обновляем Headroom после добавления нового контента
headroom.update();
});
}
Особенности работы Headroom.js с динамическим контентом:
headroom.update(), чтобы пересчитать высоту и позиции
шапки.tolerance и offset помогает
предотвратить «дребезг» шапки при частой подгрузке контента.Параметр tolerance может быть задан как числом или
объектом с раздельной настройкой для прокрутки вверх и вниз.
tolerance: {
up: 15, // показывает шапку после прокрутки вверх на 15px
down: 20 // скрывает шапку после прокрутки вниз на 20px
}
Такой подход особенно полезен при интеграции с бесконечной прокруткой, когда страница постоянно изменяет высоту.
Headroom.js предоставляет несколько полезных методов:
headroom.init() – запуск библиотеки.headroom.destroy() – отключение наблюдения за
прокруткой.headroom.unpin() – программное скрытие шапки.headroom.pin() – программное показание шапки.headroom.update() – пересчет позиции и высоты шапки
после динамического изменения DOM.Также доступны события через кастомные колбэки:
const headroom = new Headroom(header, {
onPin: () => console.log("Шапка показана"),
onUnpin: () => console.log("Шапка скрыта"),
onTop: () => console.log("Достигнут верх страницы"),
onNotTop: () => console.log("Страница покинула верх")
});
Headroom.js в сочетании с бесконечной прокруткой позволяет создавать интерфейсы, где шапка остаётся функциональной и ненавязчивой, обеспечивая комфортное взаимодействие с динамическим контентом.