customStickyChangeNumber — это дополнительная настройка
библиотеки Stickybits, позволяющая вручную задать точку, в которой
элемент получает состояние “прилипшего” (sticky). В отличие
от стандартного поведения, при котором момент прилипания определяется
положением элемента относительно верхней границы окна, этот параметр
даёт возможность сместить триггер на произвольное количество
пикселей.
Это особенно полезно в сложных интерфейсах, где:
По умолчанию Stickybits вычисляет момент прилипания на основе позиции
элемента в документе. При использовании
customStickyChangeNumber происходит переопределение этой
логики:
.js-is-stickyФактически, библиотека начинает отслеживать не сам элемент, а заданную точку на экране.
import stickybits from 'stickybits';
const instance = stickybits('.sidebar', {
customStickyChangeNumber: 100
});
В этом примере:
.sidebar станет “липким” не сразуStickybits добавляет несколько служебных классов:
.js-is-sticky — элемент в состоянии прилипания.js-is-stuck — элемент достиг нижней границы
контейнера.js-is-sticky--change — состояние в момент
измененияПри использовании customStickyChangeNumber:
.js-is-sticky будет применён строго при
достижении заданного порога.js-is-sticky--change помогает отследить переходное
состояниеПример CSS:
.sidebar.js-is-sticky {
background: #fff;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
.sidebar.js-is-sticky--change {
transition: all 0.3s ease;
}
Один из самых распространённых сценариев — наличие фиксированного header.
Без customStickyChangeNumber sticky-элемент может
“залезать” под шапку. Решение:
stickybits('.sidebar', {
customStickyChangeNumber: 80
});
Если высота шапки равна 80px:
В реальных приложениях высота элементов часто изменяется. В таких случаях значение можно вычислять:
const header = document.querySelector('.header');
stickybits('.sidebar', {
customStickyChangeNumber: header.offsetHeight
});
Особенности:
Stickybits не всегда автоматически реагирует на изменения размеров, поэтому при адаптивной верстке требуется пересоздание экземпляра:
let instance;
function initSticky() {
if (instance) instance.cleanup();
const headerHeight = document.querySelector('.header').offsetHeight;
instance = stickybits('.sidebar', {
customStickyChangeNumber: headerHeight
});
}
window.addEventListener('resize', initSticky);
initSticky();
customStickyChangeNumber часто используется вместе
с:
stickyBitStickyOffsetОпределяет смещение уже прилипшего элемента:
stickybits('.sidebar', {
customStickyChangeNumber: 100,
stickyBitStickyOffset: 20
});
Разница:
customStickyChangeNumber — когда прилипаетstickyBitStickyOffset — где фиксируетсяuseStickyClassesПозволяет явно управлять CSS через классы:
stickybits('.sidebar', {
customStickyChangeNumber: 100,
useStickyClasses: true
});
При наличии нескольких элементов важно избежать конфликтов:
stickybits('.nav', {
customStickyChangeNumber: 0
});
stickybits('.sidebar', {
customStickyChangeNumber: 120
});
Результат:
.nav фиксируется сразу.sidebar — с задержкойcustomStickyChangeNumber часто используется для создания
плавных переходов:
.sidebar {
transition: transform 0.3s ease;
}
.sidebar.js-is-sticky {
transform: translateY(0);
}
.sidebar {
transform: translateY(50px);
}
Поведение:
Использование customStickyChangeNumber не создаёт
значительной нагрузки, однако важно учитывать:
Рекомендации:
Неверное значение (слишком большое):
customStickyChangeNumber: 1000
Элемент может никогда не стать sticky.
Игнорирование высоты header:
Отсутствие пересчёта при responsive:
Конфликт с CSS position: sticky:
Stickybits может использовать нативный sticky, если он поддерживается. В таких случаях:
customStickyChangeNumber работает через JS-логикуТипичные кейсы:
Stickybits отслеживает событие scroll и сравнивает:
customStickyChangeNumberУсловно:
if (scrollTop >= elementTop - customStickyChangeNumber) {
// добавить класс sticky
}
Это делает поведение полностью предсказуемым и управляемым.
customStickyChangeNumber:
Грамотное использование этого параметра позволяет добиться точного и предсказуемого поведения элементов в интерфейсе любой сложности.