Headroom.js — это лёгкая JavaScript-библиотека, предназначенная для управления поведением верхней панели (header) при прокрутке страницы. Она автоматически скрывает или показывает меню в зависимости от направления скролла, что повышает удобство навигации и экономит пространство на экране. Основной механизм основан на отслеживании позиции прокрутки и применении CSS-классов к элементу шапки.
Библиотека не требует jQuery и работает с любыми современными
браузерами. В основе лежит событие scroll, которое
позволяет отслеживать движение страницы, и динамическое управление
классами, чтобы применять анимации через CSS.
Для работы необходимо подключить библиотеку к проекту. В современном окружении это делается через npm или CDN:
<script src="https://unpkg.com/headroom.js@0.12.0/dist/headroom.min.js"></script>
Создание экземпляра Headroom выглядит следующим образом:
// Получение элемента шапки
const header = document.querySelector('.header');
// Инициализация Headroom
const headroom = new Headroom(header, {
tolerance: {
up: 10, // Минимальное смещение вверх для срабатывания показа
down: 10 // Минимальное смещение вниз для срабатывания скрытия
},
offset: 50, // Смещение страницы от верхнего края для активации
classes: {
initial: 'headroom',
pinned: 'headroom--pinned', // Класс при показе шапки
unpinned: 'headroom--unpinned', // Класс при скрытии
top: 'headroom--top', // Класс при нахождении в начале страницы
notTop: 'headroom--not-top' // Класс при прокрутке вниз
}
});
// Активация
headroom.init();
Ключевые параметры:
tolerance — определяет чувствительность к движению
скролла. Можно задавать одно число или объект с отдельными значениями
для прокрутки вверх и вниз.offset — задаёт минимальное расстояние, которое нужно
прокрутить перед активацией.classes — набор CSS-классов, позволяющий подключать
анимации и стили.Headroom.js не занимается анимацией напрямую. Эффект достигается через CSS-транзиции. Пример плавного скрытия и появления шапки:
.header {
position: fixed;
width: 100%;
top: 0;
transition: transform 0.3s ease-in-out;
background-color: #fff;
z-index: 1000;
}
.headroom--unpinned {
transform: translateY(-100%); /* Скрытие вверх */
}
.headroom--pinned {
transform: translateY(0); /* Показ */
}
transform: translateY(-100%) позволяет полностью убрать
шапку за пределы видимой области.transition задаёт плавность движения при смене
классов.Headroom.js поддерживает расширенные возможности:
headroom.on('pin', () => {
console.log('Меню показано');
});
headroom.on('unpin', () => {
console.log('Меню скрыто');
});
tolerance и offset индивидуально
для разных размеров экрана.const headroom = new Headroom(header, {
tolerance: window.innerWidth < 768 ? 5 : 10,
offset: 60
});
Headroom.js легко интегрируется с React, Vue и Angular. Для React
используется обёртка react-headroom:
import Headroom from 'react-headroom';
function App() {
return (
<Headroom>
<header className="header">
Лого и навигация
</header>
</Headroom>
);
}
В Vue можно использовать стандартный lifecycle:
mounted() {
const header = this.$refs.header;
const headroom = new Headroom(header);
headroom.init();
}
Это позволяет сохранять привычное управление состоянием компонента и легко добавлять анимации через CSS.
transform вместо top для
GPU-ускоренной анимации.opacity для плавного
появления/затухания.will-change: transform для оптимизации
производительности.top,
not-top) для изменения стиля при прокрутке.<header class="header">Навигация</header>
<style>
.header {
position: fixed;
width: 100%;
top: 0;
background-color: #333;
color: white;
padding: 20px;
transition: transform 0.4s ease, background-color 0.4s ease;
will-change: transform;
}
.headroom--unpinned {
transform: translateY(-100%);
}
.headroom--pinned {
transform: translateY(0);
}
.headroom--not-top {
background-color: rgba(51, 51, 51, 0.9);
}
</style>
<script>
const header = document.querySelector('.header');
const headroom = new Headroom(header, {
tolerance: { up: 5, down: 5 },
offset: 50
});
headroom.init();
</script>
В этом примере шапка плавно исчезает при прокрутке вниз, появляется при прокрутке вверх, а также меняет фон при скролле от верхней границы страницы. Это создаёт современное и удобное анимированное меню.