Параметр scrollEl в библиотеке Stickybits определяет
пользовательский контейнер прокрутки, внутри которого должен
отслеживаться скролл для «прилипающего» элемента. По умолчанию
библиотека ориентируется на глобальный объект window,
однако в современных интерфейсах часто используются вложенные
скролл-контейнеры (overflow: auto или
overflow: scroll), и в таких случаях стандартное поведение
оказывается недостаточным.
Использование scrollEl позволяет:
stickybits('.element', {
scrollEl: '.scroll-container'
});
В качестве значения может передаваться:
Пример с DOM-элементом:
const container = document.querySelector('.scroll-container');
stickybits('.element', {
scrollEl: container
});
При указании scrollEl библиотека:
Назначает обработчик события scroll не на
window, а на указанный контейнер.
Рассчитывает позиции относительно границ этого контейнера.
Определяет моменты перехода между состояниями:
default)sticky)stuck)Ключевой момент — координаты элемента вычисляются в системе координат контейнера, а не документа.
scrollEl.scroll-container {
height: 400px;
overflow-y: auto;
}
<div class="scroll-container">
<div class="sidebar">...</div>
</div>
Без scrollEl:
С scrollEl:
stickybits('.sidebar', {
scrollEl: '.scroll-container'
});
Модальные окна часто блокируют прокрутку страницы
(body { overflow: hidden }), создавая собственный
scroll-контейнер.
stickybits('.modal-header', {
scrollEl: '.modal-body'
});
В интерфейсах с несколькими колонками и независимыми областями прокрутки:
Каждому sticky-элементу требуется свой scrollEl.
Stickybits вычисляет:
При использовании scrollEl:
offsetTop элемента берётся относительно контейнераscroll привязано к контейнеруЭто предотвращает типичные ошибки:
Для корректной работы необходимо:
.scroll-container {
position: relative;
overflow-y: auto;
}
.element {
position: relative;
}
Stickybits сам добавляет классы:
.js-is-sticky.js-is-stuckЕсли высота контейнера меньше содержимого и прокрутки нет —
scrollEl не даст эффекта.
Если контейнеры вложены:
<div class="outer">
<div class="inner">
<div class="element"></div>
</div>
</div>
Нужно выбирать именно тот контейнер, который:
overflowОшибка выбора приводит к:
stickybits('.item', {
scrollEl: '.scroll-container'
});
Stickybits создаёт независимые экземпляры для каждого элемента, но использует один scroll-контейнер.
Оптимизация:
scroll не дублируетсяВ случае изменения DOM:
const instance = stickybits('.element', {
scrollEl: '.container-1'
});
// позже
instance.cleanup();
stickybits('.element', {
scrollEl: '.container-2'
});
Stickybits не отслеживает изменения контейнера автоматически, поэтому требуется пересоздание.
Использование scrollEl влияет на производительность
следующим образом:
Плюсы:
Минусы:
Рекомендации:
scrollEl: '.container' // элемент не найден
Результат:
.container {
overflow: visible;
}
Stickybits не получает scroll-событий.
position: sticky вместе с StickybitsStickybits может работать как полифилл, но при использовании
scrollEl:
position: sticky не учитывает кастомный
контейнерРекомендуется:
.element {
position: relative;
}
stickybits('.element', {
scrollEl: '.horizontal-scroll'
});
Stickybits отслеживает только вертикальный скролл, но контейнер может быть горизонтальным — важно учитывать направление прокрутки.
stickybits('.element', {
scrollEl: '.container',
stickyBitStickyOffset: 20
});
Offset применяется относительно контейнера, а не окна.
При инициализации с scrollEl:
scroll и resizescrollTop контейнера вместо
window.pageYOffsetЭто обеспечивает изоляцию логики и корректную работу в сложных интерфейсах.
<div class="panel">
<div class="panel-content">
<div class="sticky">Навигация</div>
<div class="long-content">...</div>
</div>
</div>
.panel-content {
height: 300px;
overflow-y: auto;
}
stickybits('.sticky', {
scrollEl: '.panel-content'
});
Результат:
Stickybits учитывает:
stuck)При scrollEl:
Это критично для: