Stickybits — это легковесная JavaScript-библиотека, предназначенная
для создания «липких» элементов на веб-странице с поддержкой мобильных
устройств и плавной анимацией при скролле. Она обеспечивает
кроссбраузерное поведение и совместимость с современными и устаревшими
устройствами, избегая конфликтов с position: sticky в
CSS.
Библиотека работает с элементами, которые необходимо зафиксировать на экране при прокрутке страницы. В отличие от чистого CSS, Stickybits добавляет гибкость: динамическую активацию, возможность отключения, управление отступами и поддержку адаптивного поведения на мобильных устройствах.
Подключение Stickybits возможно через CDN или npm:
// Через npm
import stickybits from 'stickybits';
// Через CDN
<script src="https://unpkg.com/stickybits@3.7.8/dist/stickybits.min.js"></script>
Инициализация элемента выполняется вызовом функции
stickybits с селектором:
stickybits('.sticky-element');
Здесь .sticky-element — это CSS-класс элемента, который
необходимо сделать липким. Библиотека автоматически анализирует размеры
и позицию элемента, добавляя необходимые стили и события прокрутки.
Stickybits поддерживает конфигурацию через объект с опциями. Основные параметры:
stickyBitStickyOffset — отступ в пикселях от верхнего
края окна до начала фиксации.useStickyClasses — включение классов
is-sticky, is-stuck и is-top,
которые позволяют управлять стилями через CSS.verticalPosition — позиция элемента: "top"
или "bottom".noStyles — если true, библиотека не
применяет встроенные стили, оставляя контроль полностью
разработчику.updateHandler — функция обратного вызова, вызываемая
при каждом изменении позиции элемента.Пример инициализации с параметрами:
stickybits('.sticky-element', {
stickyBitStickyOffset: 20,
useStickyClasses: true,
verticalPosition: 'top',
noStyles: false
});
На мобильных устройствах часто возникают проблемы с
position: sticky, особенно в Safari и старых версиях
Android. Stickybits автоматически переключается на fallback-поведение,
используя JavaScript для симуляции фиксации.
Особенности поведения на мобильных устройствах:
window.addEventListener('resize', () => {
stickybits('.sticky-element', { stickyBitStickyOffset: 10 });
});
Это гарантирует, что элемент останется корректно прикреплённым при переходе из портретной ориентации в ландшафтную и обратно.
Stickybits добавляет три ключевых класса к элементу:
is-sticky — элемент находится в состоянии фиксации на
экране.is-stuck — элемент достиг конца родительского
контейнера и перестал «прилипать».is-top — элемент находится в исходной позиции, до
активации липкости.Эти классы позволяют управлять визуальным состоянием элемента через CSS:
.sticky-element.is-sticky {
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
.sticky-element.is-stuck {
opacity: 0.8;
}
Использование классов повышает гибкость и позволяет создавать сложные анимации при скролле без вмешательства в логику JavaScript.
Stickybits предоставляет методы для включения и отключения липкости элементов:
const sticky = stickybits('.sticky-element');
// Деактивация
sticky.cleanup();
// Повторная активация
sticky.update();
cleanup() удаляет все классы и события, возвращая
элемент в исходное состояние, а update() пересчитывает
позиции и размеры, что полезно при динамическом контенте.
Для большого количества липких элементов на странице важно:
useStickyClasses: true и минимизировать
прямое изменение стилей через JavaScript.update() при изменении
размеров окна с помощью debounce.noStyles: true и управлять стилями через CSS.Пример оптимизированного ресайза:
let resizeTimeout;
window.addEventListener('resize', () => {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(() => {
stickybits('.sticky-element').update();
}, 150);
});
При добавлении элементов через JavaScript после загрузки страницы Stickybits необходимо вызывать повторную инициализацию:
const newElement = document.createElement('div');
newElement.classList.add('sticky-element');
document.body.appendChild(newElement);
stickybits(newElement);
Это гарантирует, что новые элементы также получат липкое поведение, без необходимости пересоздавать все существующие объекты.
Stickybits совместим с современными фреймворками и позволяет:
Пример использования обратного вызова:
stickybits('.sticky-element', {
updateHandler: (el, state) => {
console.log(el, state); // state: 'top', 'sticky', 'stuck'
}
});
Это позволяет отслеживать состояние элемента и выполнять любые дополнительные действия при изменении позиции.
Stickybits обеспечивает гибкую и надёжную реализацию липких элементов на мобильных устройствах и десктопах, с расширяемой настройкой и контролем состояния через классы и обратные вызовы. Она является удобной альтернативой стандартному CSS, особенно когда требуется кроссбраузерная поддержка и динамическое управление элементами при скролле.