Headroom.js — это лёгкая библиотека для управления видимостью элементов при скролле страницы. Несмотря на кажущуюся простоту, ошибки при инициализации часто приводят к тому, что библиотека не работает должным образом или ведёт себя непредсказуемо. Рассмотрим наиболее частые ошибки.
Headroom.js требует, чтобы в качестве аргумента передавался DOM-элемент, который будет управляться. Распространённые ошибки:
// Ошибка: передан селектор в виде строки
var header = new Headroom('#header');
header.init();
В данном случае объект header не является DOM-элементом,
и вызов init() приведёт к ошибке. Правильный подход:
var headerElement = document.querySelector('#header');
var headroom = new Headroom(headerElement);
headroom.init();
Ключевой момент: Headroom.js работает только с реальными DOM-элементами, а не с селекторами или jQuery-объектами.
Попытка инициализировать Headroom.js до того, как элемент существует в DOM, приводит к неработоспособности:
var headerElement = document.querySelector('#header');
var headroom = new Headroom(headerElement);
headroom.init();
Если этот код выполняется до загрузки DOM, headerElement
будет null. Решение — оборачивать инициализацию в событие
DOMContentLoaded:
document.addEventListener('DOMContentLoaded', function() {
var headerElement = document.querySelector('#header');
var headroom = new Headroom(headerElement);
headroom.init();
});
Headroom.js работает через динамическое добавление и удаление CSS-классов. Частая ошибка — отсутствие базового CSS:
.headroom {
transition: transform 0.2s ease-in-out;
}
.headroom--pinned {
transform: translateY(0%);
}
.headroom--unpinned {
transform: translateY(-100%);
}
Если эти классы отсутствуют, эффект скрытия и показа шапки будет отсутствовать. Важно: библиотека сама не скрывает элемент — она управляет классами, и без CSS видимый результат невозможен.
Создание нескольких экземпляров Headroom на одном и том же элементе может вызвать конфликт классов:
var header = document.querySelector('#header');
var headroom1 = new Headroom(header);
var headroom2 = new Headroom(header);
headroom1.init();
headroom2.init();
Это приведёт к хаотичному добавлению и удалению классов
headroom--pinned и headroom--unpinned.
Правило: один элемент = один экземпляр Headroom.js.
Headroom.js поддерживает множество опций: tolerance,
offset, classes, onPin,
onUnpin и другие. Частые ошибки:
var headroom = new Headroom(header, {
tolerance: '5', // Ошибка: должно быть число, а не строка
offset: 100,
onPin: 'console.log("Pinned")' // Ошибка: должно быть функцией
});
Правильная конфигурация:
var headroom = new Headroom(header, {
tolerance: 5,
offset: 100,
onPin: function() { console.log("Pinned"); },
onUnpin: function() { console.log("Unpinned"); }
});
headroom.init();
Ключевой момент: строго соблюдать типы данных для опций. Headroom.js не производит автоматическое приведение типов.
Headroom.js реагирует на вертикальный скролл страницы. Если элемент
находится внутри контейнера с overflow: auto или
фиксированной высотой, скролл документа не влияет на элемент. Частая
ошибка — ожидание работы Headroom в таких случаях без дополнительной
настройки. Решение — указать скролл-контейнер вручную:
var headroom = new Headroom(header, {
scroller: document.querySelector('.scroll-container')
});
headroom.init();
Иногда Headroom.js может некорректно работать вместе с другими библиотеками, изменяющими DOM или скролл (например, Smooth Scroll, fullPage.js). Основные причины:
transform или top через
сторонние скрипты.headroom--pinned, headroom--unpinned).Рекомендация: проверять, что CSS и скрипты не конфликтуют с классами и поведением Headroom.js.
Если элемент, к которому привязан Headroom.js, удаляется и добавляется заново (например, через SPA-фреймворк), старый экземпляр Headroom становится недействительным. Нужно повторно создавать новый экземпляр после вставки элемента в DOM.
function initHeader() {
var headerElement = document.querySelector('#header');
if (headerElement) {
var headroom = new Headroom(headerElement);
headroom.init();
}
}
Эти ошибки покрывают более 90% проблем при инициализации Headroom.js на практике. Правильное использование DOM-элементов, CSS-классов и опций позволяет добиться стабильного и предсказуемого поведения при скролле.