Headroom.js — это легковесная библиотека для управления поведением заголовков при прокрутке страницы. Её ключевая задача — скрывать или показывать шапку сайта в зависимости от направления скролла и скорости движения страницы. Интеграция с Intersection Observer API позволяет создавать более гибкие и контекстно-зависимые эффекты появления и скрытия элементов, реагируя не только на прокрутку, но и на видимость определённых блоков на странице.
Для начала подключается Headroom.js и инициализируется объект:
// Получаем DOM-элемент шапки
const header = document.querySelector('.header');
// Инициализация Headroom
const headroom = new Headroom(header, {
tolerance: 5, // Чувствительность к прокрутке
offset: 50, // Высота смещения перед активацией
classes: {
initial: 'header--initial',
pinned: 'header--pinned',
unpinned: 'header--unpinned',
}
});
// Активация Headroom
headroom.init();
Ключевые параметры:
tolerance — число пикселей, на которое можно прокрутить
страницу, прежде чем будет скрыт или показан заголовок.offset — количество пикселей от верхней границы
страницы, после которого начинается реакция.classes — CSS-классы для разных состояний:
initial, pinned (показывается),
unpinned (скрывается).Intersection Observer API позволяет отслеживать появление или исчезновение элементов в пределах видимой области окна браузера. Для интеграции с Headroom.js создаётся наблюдатель:
const observerOptions = {
root: null, // Отслеживание относительно viewport
rootMargin: '0px',
threshold: 0 // Срабатывание при пересечении хотя бы 0% элемента
};
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
// Элемент видим — закрепляем шапку
headroom.pin();
} else {
// Элемент вышел из зоны видимости — скрываем шапку
headroom.unpin();
}
});
}, observerOptions);
Наблюдатель применяется к выбранным элементам страницы:
const target = document.querySelector('.hero-section');
observer.observe(target);
В этом примере header будет показываться, когда
.hero-section находится в видимой зоне, и скрываться, когда
этот блок исчезает с экрана.
1. Несколько элементов
Можно отслеживать несколько секций и управлять состоянием шапки в зависимости от того, какой элемент виден:
const sections = document.querySelectorAll('.section');
sections.forEach(section => observer.observe(section));
2. Комбинирование с прокруткой
Intersection Observer можно использовать совместно с обычным поведением Headroom.js:
window.addEventListener('scroll', () => {
if (window.scrollY > 200) {
headroom.unpin(); // Скроем шапку после определённого скролла
}
});
Так достигается динамическая реакция и на видимость элементов, и на направление прокрутки.
3. Настройка threshold для частичной видимости
Параметр threshold принимает массив значений от 0 до 1,
что позволяет реагировать на различные степени видимости элемента:
const observerOptions = {
root: null,
threshold: [0, 0.25, 0.5, 0.75, 1]
};
Здесь можно выполнять разные действия при частичном появлении элемента на экране.
tolerance и offset
Headroom.js для плавного скрытия/показа шапки.pinned
и unpinned для более приятного UX:.header {
transition: transform 0.3s ease;
}
.header--unpinned {
transform: translateY(-100%);
}
.header--pinned {
transform: translateY(0);
}
Headroom.js поддерживает события pin и
unpin, которые можно слушать для синхронизации с другими
интерфейсными эффектами:
header.addEventListener('headroom:pin', () => {
console.log('Шапка закреплена');
});
header.addEventListener('headroom:unpin', () => {
console.log('Шапка скрыта');
});
В комбинации с Intersection Observer это позволяет строить сложные сценарии: анимации, подсветку меню, ленивую загрузку контента при прокрутке и видимости элементов.
Интеграция Headroom.js с Intersection Observer API позволяет создавать адаптивные и контекстные интерфейсы, где шапка реагирует не только на направление прокрутки, но и на конкретное положение элементов на странице. Такой подход улучшает UX и делает интерфейс визуально более «живым» и отзывчивым.