Headroom.js — это легковесная библиотека для управления поведением шапки страницы при прокрутке. Основной принцип её работы заключается в добавлении или удалении CSS-классов в зависимости от направления скролла и текущего положения страницы. Это позволяет реализовать эффекты скрытия и появления шапки без непосредственной постоянной перерисовки элементов.
Ключевое преимущество Headroom.js — минимизация reflow и repaint. Библиотека не изменяет inline-стили часто, не пересчитывает размеры элементов без необходимости, а работает через добавление CSS-классов, что позволяет браузеру использовать аппаратное ускорение и оптимизированные стратегии композитинга.
Headroom.js использует три основных класса:
headroom--unpinned — шапка скрыта, обычно сдвигается
вверх.headroom--pinned — шапка видима, зафиксирована в
верхней части окна.headroom--top / headroom--not-top —
состояние положения страницы относительно верха.Эти классы минимально влияют на layout. Переключение классов затрагивает только transform и opacity, что не вызывает дорогостоящих перерисовок и перерасчета компоновки, а выполняется через GPU.
Пример CSS:
.headroom {
position: fixed;
width: 100%;
transition: transform 0.25s ease-in-out;
will-change: transform;
}
.headroom--unpinned {
transform: translateY(-100%);
}
.headroom--pinned {
transform: translateY(0);
}
Ключевое здесь — использование transform вместо
top или margin-top. Изменение
top приводит к reflow, так как браузеру приходится
пересчитывать положение всех соседних элементов, а
transform работает на уровне композитного слоя и не
вызывает перерасчет макета.
Headroom.js слушает событие scroll для определения
направления движения страницы. Прямое реагирование на каждое событие
scroll приводит к огромному количеству вызовов и потенциальным
reflow/repaint, особенно на мобильных устройствах.
Для оптимизации используется requestAnimationFrame и throttling:
window.addEventListener('scroll', () => {
if (!ticking) {
window.requestAnimationFrame(() => {
headroom.update();
ticking = false;
});
ticking = true;
}
});
Таким образом, обновление классов выполняется максимум один раз на кадр, что значительно снижает нагрузку на движок рендеринга.
Headroom.js никогда не создаёт или не удаляет элементы динамически. Вся работа ведётся через добавление и удаление CSS-классов. Любые изменения DOM вызывают reflow, поэтому подход Headroom.js исключительно эффективен:
will-changeИспользование свойства will-change позволяет заранее
сообщить браузеру, какие CSS-свойства будут меняться, чтобы он создал
отдельный композитный слой:
.headroom {
will-change: transform;
}
Это предотвращает ненужные repaint и reflow, так как трансформации применяются на GPU, не блокируя основной поток компоновки.
Headroom.js позволяет настроить такие параметры, как
offset и tolerance, чтобы шапка не реагировала
на каждый пиксель прокрутки:
var header = document.querySelector('.headroom');
var headroom = new Headroom(header, {
offset: 100,
tolerance: {
up: 5,
down: 10
}
});
headroom.init();
offset задаёт порог появления/скрытия шапки.tolerance определяет, сколько пикселей нужно
прокрутить, прежде чем произойдёт изменение состояния.Это снижает частоту смены классов и уменьшает нагрузку на браузер.
Headroom.js легко интегрируется с React, Vue или Vanilla JS, поскольку не требует прямого изменения DOM-структуры. Основные принципы оптимизации сохраняются:
transform для сдвига шапки.Эти подходы позволяют поддерживать высокую производительность даже на страницах с большим количеством элементов и сложной версткой.
Использование Headroom.js по вышеописанным принципам позволяет:
Благодаря архитектуре, основанной на классах и CSS-трансформациях, Headroom.js является примером эффективного подхода к управлению UI без дорогостоящих перерисовок.