Headroom.js — это библиотека для управления поведением заголовков при
скролле страницы. Она динамически добавляет и удаляет CSS-классы, такие
как headroom--pinned и headroom--unpinned,
чтобы контролировать видимость шапки при прокрутке. Одной из часто
встречающихся проблем при интеграции Headroom.js является неправильная
работа слоёв, вызванная некорректным использованием свойства
z-index.
z-index определяет порядок наложения элементов на
странице. Важно помнить, что z-index работает только для
элементов с позиционированием отличным от static
(relative, absolute, fixed,
sticky). Если заголовок Headroom имеет
z-index, но его родительский контейнер не имеет явного
позиционирования, браузер может игнорировать значение
z-index, и элемент окажется позади других слоёв.
header {
position: fixed;
top: 0;
width: 100%;
z-index: 1000;
}
В этом примере фиксированный заголовок будет отображаться поверх
большинства элементов страницы. Без position: fixed или
position: relative z-index не будет
работать.
Частая ошибка — назначение Headroom высоких значений
z-index, не учитывая другие элементы интерфейса: модальные
окна, выпадающие меню, уведомления. Например, если модальное окно имеет
z-index: 1050, а заголовок Headroom — 1000,
при открытии модального окна шапка может оказаться под ним, хотя
визуально ожидается обратное.
Решение — построить иерархию слоёв страницы и
определить диапазоны z-index для различных категорий
элементов:
0–499500–9991000–14991500+Эта система позволяет избежать неожиданных наложений и сохранить предсказуемое поведение элементов.
Headroom.js управляет состояниями заголовка с помощью классов
headroom--pinned и headroom--unpinned. Иногда
разработчики задают z-index только для исходного состояния
элемента. При динамическом переключении классов может произойти
ситуация, когда z-index теряет своё влияние из-за
переопределений стилей:
.headroom--unpinned {
transform: translateY(-100%);
z-index: 800; /* может конфликтовать с pinned */
}
.headroom--pinned {
transform: translateY(0);
z-index: 1000;
}
Чтобы избежать проблем, рекомендуется задавать z-index в
базовом селекторе заголовка, а не только в состояниях, либо использовать
консистентные значения для всех классов, чтобы слои
оставались предсказуемыми при анимациях.
transform и opacity, применяемые к
родительским контейнерам или самому заголовку, создают новый контекст
наложения (stacking context). Это может неожиданно изменить поведение
z-index. Например:
.container {
transform: translateZ(0);
}
header {
position: fixed;
z-index: 1000;
}
В такой конфигурации заголовок будет ограничен своим родителем
.container, и даже высокое значение z-index не
позволит ему перекрыть элементы вне этого контекста. Для Headroom.js это
критично, так как анимации скрытия и показа (translateY)
часто используют transform. Решение — размещать заголовок
вне трансформированных контейнеров или избегать создания лишних stacking
context.
fixed или sticky для заголовка Headroom
обязательно.headroom--pinned
и headroom--unpinned должны использовать согласованные
z-index.var header = document.querySelector("header");
var headroom = new Headroom(header, {
offset: 50,
tolerance: 5,
classes: {
initial: "headroom",
pinned: "headroom--pinned",
unpinned: "headroom--unpinned",
top: "headroom--top",
notTop: "headroom--not-top"
}
});
headroom.init();
header.headroom {
position: fixed;
top: 0;
width: 100%;
z-index: 1000; /* базовое значение */
transition: transform 0.2s ease-in-out;
}
.headroom--unpinned {
transform: translateY(-100%);
z-index: 1000;
}
.headroom--pinned {
transform: translateY(0);
z-index: 1000;
}
Такое оформление гарантирует, что анимации скрытия и показа заголовка не нарушают порядок слоёв и обеспечивают предсказуемое перекрытие элементов страницы.