Headroom.js — это библиотека для управления поведением шапки страницы при скролле, которая динамически скрывает и показывает header, улучшая UX. На слабых устройствах производительность особенно критична, так как частые пересчёты стилей и анимации могут приводить к лагам и задержкам.
Headroom.js использует событие scroll для отслеживания
движения страницы. На слабых устройствах каждое срабатывание scroll
вызывает вычисления и перерисовку, что может создавать нагрузку. Для
оптимизации следует:
const headroom = new Headroom(document.querySelector("header"));
window.addEventListener('scroll', _.throttle(() => headroom.update(), 100));
Каждое изменение классов у шапки вызывает reflow и
repaint. В Headroom.js это происходит при добавлении или
удалении классов headroom--pinned,
headroom--unpinned и т. д. Чтобы уменьшить нагрузку:
width, height,
top, left). Предпочтение отдавать
transform: translateY..headroom {
transition: transform 0.2s ease-in-out;
}
.headroom--unpinned {
transform: translateY(-100%);
}
.headroom--pinned {
transform: translateY(0);
}
Headroom.js предоставляет возможность использовать кастомный
scroller. Для слабых устройств рекомендуется:
update() не на каждое событие, а с
фиксированным интервалом (через
requestAnimationFrame):let ticking = false;
window.addEventListener('scroll', function() {
if (!ticking) {
window.requestAnimationFrame(function() {
headroom.update();
ticking = false;
});
ticking = true;
}
});
Для слабых устройств важно минимизировать объём передаваемых и выполняемых данных:
Если на странице несколько шапок или header появляется только после определенного события:
document.addEventListener('DOMContentLoaded', () => {
const header = document.querySelector("header");
if (header) {
new Headroom(header).init();
}
});
Headroom.js имеет конфигурацию:
offset — задаёт расстояние скролла до начала скрытия.
Для слабых устройств лучше увеличить значение, чтобы сократить частоту
переключения классов.tolerance — порог движения для триггера. Увеличение
этого параметра снижает количество обновлений.Пример:
const header = document.querySelector("header");
const headroom = new Headroom(header, {
offset: 150,
tolerance: {
up: 20,
down: 20
}
});
headroom.init();
update()
при скролле.Ключевые моменты:
transform, а не через
top/height.offset и tolerance
для редких изменений классов.Эти методы позволяют Headroom.js работать плавно даже на слабых устройствах, обеспечивая стабильный UX без лагов и задержек при скролле.