Типичные ошибки инициализации

Headroom.js — это лёгкая библиотека для управления видимостью элементов при скролле страницы. Несмотря на кажущуюся простоту, ошибки при инициализации часто приводят к тому, что библиотека не работает должным образом или ведёт себя непредсказуемо. Рассмотрим наиболее частые ошибки.


1. Неправильный выбор DOM-элемента

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-объектами.


2. Инициализация до полной загрузки DOM

Попытка инициализировать 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();
});

3. Игнорирование CSS-классов Headroom.js

Headroom.js работает через динамическое добавление и удаление CSS-классов. Частая ошибка — отсутствие базового CSS:

.headroom {
    transition: transform 0.2s ease-in-out;
}

.headroom--pinned {
    transform: translateY(0%);
}

.headroom--unpinned {
    transform: translateY(-100%);
}

Если эти классы отсутствуют, эффект скрытия и показа шапки будет отсутствовать. Важно: библиотека сама не скрывает элемент — она управляет классами, и без CSS видимый результат невозможен.


4. Дублирование инициализации

Создание нескольких экземпляров 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.


5. Неправильное использование опций

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 не производит автоматическое приведение типов.


6. Игнорирование высоты и скролл-контекста

Headroom.js реагирует на вертикальный скролл страницы. Если элемент находится внутри контейнера с overflow: auto или фиксированной высотой, скролл документа не влияет на элемент. Частая ошибка — ожидание работы Headroom в таких случаях без дополнительной настройки. Решение — указать скролл-контейнер вручную:

var headroom = new Headroom(header, {
    scroller: document.querySelector('.scroll-container')
});
headroom.init();

7. Конфликты с другими библиотеками

Иногда Headroom.js может некорректно работать вместе с другими библиотеками, изменяющими DOM или скролл (например, Smooth Scroll, fullPage.js). Основные причины:

  • Перезапись transform или top через сторонние скрипты.
  • Манипуляция классами, которые Headroom использует (headroom--pinned, headroom--unpinned).

Рекомендация: проверять, что CSS и скрипты не конфликтуют с классами и поведением Headroom.js.


8. Проблемы при динамическом изменении DOM

Если элемент, к которому привязан 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-классов и опций позволяет добиться стабильного и предсказуемого поведения при скролле.