Свойство position: sticky объединяет поведение
relative и fixed. Элемент с
sticky остаётся в потоке документа, пока не достигает
заданной позиции относительно своего ближайшего контейнера с прокруткой.
После достижения этой позиции элемент «прилипает» к указанному краю
контейнера до конца видимой области.
Ключевые моменты:
fixed, sticky не выводит элемент из потока,
поэтому соседние блоки учитывают его размеры.overflow: visible.top, bottom,
left или right. Например, top: 0
фиксирует элемент к верхней границе контейнера при прокрутке вниз.Пример CSS:
.sticky-element {
position: sticky;
top: 0;
z-index: 10;
background-color: white;
}
sticky, старые версии IE
и Edge не обрабатывают его.overflow: hidden или overflow: auto, элемент
«прилипает» только внутри этого блока.top, bottom, left или
right эффект не сработает.display: table-row и некоторыми
таблицами. Sticky не поддерживается для отдельных строк таблицы
(tr) и ячеек (td) в большинстве
браузеров.Stickybits — это лёгкая библиотека для полифила и управления
«прилипшими» элементами на основе нативного
position: sticky. Она автоматически решает большинство
ограничений нативного sticky и обеспечивает плавное поведение даже в
старых браузерах.
Ключевые особенности Stickybits:
sticky библиотека переключает элемент на
position: fixed.stick) и отпускания
(unstick).Подключение через npm:
npm install stickybits
Или через CDN:
<script src="https://unpkg.com/stickybits@3/dist/stickybits.min.js"></script>
Инициализация:
stickybits('.sticky-element');
Опции по умолчанию:
{
stickyBitStickyClass: 'is-sticky', // Класс, добавляемый при прилипания
stickyBitParentClass: 'is-sticky-parent', // Класс для родителя
useStickyClasses: true, // Добавлять CSS-классы
scrollEl: window, // Элемент, на котором отслеживается прокрутка
verticalPosition: 'top', // Направление прилипания
}
Можно задать собственный отступ прилипания:
stickybits('.sticky-element', {
verticalPosition: 'top',
offset: 20
});
Элемент будет «прилипать» 20px ниже верхней границы контейнера.
По умолчанию Stickybits отслеживает window.scroll. Для
элемента с внутренней прокруткой:
const container = document.querySelector('.scroll-container');
stickybits('.sticky-element', { scrollEl: container });
Теперь прилипающий элемент будет учитывать прокрутку именно этого блока.
Stickybits автоматически добавляет классы:
.is-sticky — элемент прилип.is-stuck — элемент достиг конца родителя.is-unstuck — элемент отпущенМожно использовать эти классы для анимаций и CSS-трансформаций:
.is-sticky {
transition: all 0.3s ease;
box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
Stickybits предоставляет методы для динамического контроля:
stickybits.update() — пересчитать позиции элементов
после изменения DOMstickybits.cleanup() — удалить все эффекты прилипания и
классыstickybits.destroy() — полностью удалить библиотеку со
страницыПример использования коллбеков:
const sticky = stickybits('.sticky-element', {
useStickyClasses: true
});
document.querySelector('.sticky-element').addEventListener('stickybit:stick', () => {
console.log('Элемент прилип');
});
document.querySelector('.sticky-element').addEventListener('stickybit:unstick', () => {
console.log('Элемент отпущен');
});
position: sticky в старых браузерах.is-sticky и is-stuck легко реализуются
визуальные эффекты, например изменение цвета фона или появление
тени.| Характеристика | position: sticky | Stickybits |
|---|---|---|
| Поддержка старых браузеров | нет | да, через fallback на fixed |
| Классы при прилипаниях | нет | есть (is-sticky, is-stuck) |
| Offset кастомизация | только через CSS | через JS и CSS |
| Контейнеры с прокруткой | поддерживается частично | полностью настраивается |
| API и динамическое управление | нет | update, cleanup, destroy |
z-index только при необходимости, иначе
может нарушиться наложение элементов.overflow у родителей — Stickybits корректно
обрабатывает только контейнеры с overflow: visible,
auto или scroll.update() после динамического изменения
DOM, чтобы корректно пересчитать позиции элементов.Stickybits расширяет возможности нативного
position: sticky, обеспечивая кроссбраузерность, управление
offset, классы для CSS и события для JS, позволяя строить сложные
интерфейсы с «прилипшими» элементами без ограничений стандартного
CSS.