Headroom.js — это библиотека для управления видимостью верхней панели
при скролле страницы. При интеграции с элементами, использующими CSS
position: sticky, важно учитывать специфику поведения таких
элементов: sticky-панель остаётся в пределах родительского контейнера и
реагирует на скролл относительно его границ, а не всей страницы.
Ключевой момент: Headroom.js оперирует изменением
классов headroom--pinned и headroom--unpinned
в зависимости от направления скролла. Sticky-элементы могут
конфликтовать с этими классами, если не учесть их родительскую область и
смещение (offset).
<header class="site-header sticky-header">
<nav>
<ul>
<li><a href="#">Главная</a></li>
<li><a href="#">О проекте</a></li>
<li><a href="#">Контакты</a></li>
</ul>
</nav>
</header>
<main>
<section>Контент 1</section>
<section>Контент 2</section>
</main>
Класс sticky-header задаёт элементу
position: sticky через CSS.
.sticky-header {
position: sticky;
top: 0;
z-index: 1000;
transition: transform 0.3s ease-in-out;
}
.headroom--unpinned {
transform: translateY(-100%);
}
.headroom--pinned {
transform: translateY(0);
}
Выделенные моменты:
top: 0 задаёт точку, от которой элемент становится
фиксированным.z-index гарантирует нахождение панели поверх
контента.transform плавно скрывает и показывает
панель.const header = document.querySelector('.sticky-header');
const headroom = new Headroom(header, {
offset: 50, // Начало отслеживания после скролла на 50px
tolerance: { // Настройка «чувствительности» к скроллу
up: 5,
down: 10
},
classes: {
pinned: 'headroom--pinned',
unpinned: 'headroom--unpinned'
}
});
headroom.init();
Особенности для sticky-панели:
offset нужно выбирать с учётом высоты самой панели и
верхнего отступа родителя.tolerance предотвращает постоянное переключение классов
при микросколлах.position: sticky.Если внутри sticky-панели есть элементы, которые также используют
position: sticky (например, подменю), стоит учитывать, что
Headroom.js управляет только внешним контейнером. Для корректной
работы:
top на вложенные sticky-элементы, чтобы они
правильно позиционировались при скрытии родителя.transform только на внешней панели.
Внутренние элементы сохраняют собственный sticky-поток..submenu {
position: sticky;
top: 60px; /* учитывая высоту родителя */
}
Проблема: панель «дергается» при скролле.
Причина: пересечение offset и sticky top. Решение: скорректировать
offset в Headroom.js, чтобы оно начиналось после полного
закрепления панели.
Проблема: sticky не работает при применении
transform. Причина: CSS transform создаёт новый контекст
наложения, что может нарушать sticky. Решение: применять transform
только на видимую часть панели (headroom--unpinned) и
проверять родительский контекст.
Проблема: панель перекрывает контент. Решение: добавить верхний padding родителю или main-контейнеру, равный высоте панели:
main {
padding-top: 80px;
}
will-change: transform для
smoother-анимаций скрытия/появления панели.headroom--pinned / headroom--unpinned.Эта интеграция позволяет создать динамическую навигацию, которая сохраняет плавность и корректность поведения при любых скролл-сценариях.