Headroom.js — это легковесная JavaScript-библиотека, предназначенная для управления поведением заголовков (header) при прокрутке страницы. Она позволяет скрывать или отображать элементы интерфейса в зависимости от направления скролла, создавая динамичный UX. Понимание работы с viewport и масштабированием критично для правильного применения этой библиотеки, так как многие функции Headroom.js зависят от текущей видимой области браузера.
Viewport — это видимая область веб-страницы,
доступная пользователю в браузере. В терминах JavaScript viewport
определяется размерами окна (window.innerHeight и
window.innerWidth) и точкой прокрутки
(window.scrollY).
В Headroom.js ключевой элемент — вычисление смещения, которое определяет, когда заголовок должен скрываться или появляться. Эти вычисления выполняются относительно текущего viewport, а не полной высоты страницы. Например:
var header = document.querySelector("header");
var headroom = new Headroom(header, {
offset: 100, // пиксели прокрутки для активации скрытия/появления
tolerance: {
up: 5, // минимальное смещение вверх, чтобы показать header
down: 5 // минимальное смещение вниз, чтобы скрыть header
},
});
headroom.init();
Здесь offset учитывает именно расстояние от верхней
границы viewport до прокрученного содержимого, что обеспечивает
корректное срабатывание анимаций независимо от размера окна.
При изменении размеров окна браузера (resize) viewport меняется, что напрямую влияет на вычисления смещения. Headroom.js не зависит от конкретных размеров экрана, но для сложных интерфейсов может потребоваться динамическая адаптация параметров:
window.addEventListener('resize', function() {
headroom.offset = window.innerHeight / 3; // адаптация offset к высоте окна
});
Такой подход позволяет:
Хотя Headroom.js управляет поведением header через JavaScript, CSS свойства viewport также играют важную роль. Основные рекомендации:
height: 100vh для элементов, которые
должны занимать всю видимую область.overflow: hidden и
overflow-y: auto для контейнеров с прокруткой, чтобы
избежать конфликтов с вычислением прокрутки Headroom.js.box-sizing: border-box, чтобы размеры
элементов и отступы корректно соответствовали viewport.Пример:
header {
position: fixed;
top: 0;
left: 0;
width: 100%;
transition: transform 0.3s ease-in-out;
}
.header--pinned {
transform: translateY(0);
}
.header--unpinned {
transform: translateY(-100%);
}
Здесь классы header--pinned и
header--unpinned добавляются Headroom.js в зависимости от
скролла относительно viewport. Плавная анимация делает скрытие и
появление header визуально комфортным.
Масштабирование и viewport особенно важны при адаптивной верстке. Тестирование должно учитывать:
Для этого часто используют динамическое вычисление offset в зависимости от текущей высоты окна:
headroom.offset = Math.max(50, window.innerHeight * 0.2);
Это обеспечивает предсказуемое поведение header независимо от устройства и размера окна.
На мобильных устройствах поведение viewport может отличаться из-за:
Headroom.js учитывает реальное смещение через scrollY,
но для точного контроля рекомендуется:
requestAnimationFrame для отслеживания
скролла;Ключевые моменты:
Эти принципы позволяют создавать адаптивные, отзывчивые и интуитивно понятные заголовки с использованием Headroom.js, независимо от размера и масштаба окна браузера.