<script>
(function(){
const TRIGGER_OFFSET = 60;
const TOTAL_PATH = 5000; // общая длина пути (px)
const STEPS = [
{ px: 0, val: "/01" },
{ px: 800, val: "/02" },
{ px: 1800, val: "/03" },
{ px: 2800, val: "/04" },
{ px: 3800, val: "/05" },
];
function isDesktop() {
return window.innerWidth >= 1200;
}
function pickVal(scrolled){
let v = STEPS[0].val;
for (let i = 0; i < STEPS.length; i++){
if (scrolled >= STEPS[i].px) v = STEPS[i].val; else break;
}
return v;
}
function init(){
// Можно вешать .count на .tn-elem ИЛИ на .tn-atom — скрипт сам найдёт текстовый узел
const nodes = Array.from(document.querySelectorAll('.count')).map(root=>{
const atom = root.querySelector('.tn-atom') || root;
return { root, atom, startY: 0, lastVal: null };
});
if (!nodes.length) return;
function recomputeStart(){
nodes.forEach(it=>{
// Калибруем ноль от САМОГО элемента-счётчика
const rect = it.root.getBoundingClientRect();
const absTop = rect.top + window.scrollY; // абсолютный top элемента в документе
it.startY = absTop - TRIGGER_OFFSET; // момент, когда он «прилипнет» к top+offset
});
}
let ticking = false;
function onScroll(){
if (ticking) return;
ticking = true;
requestAnimationFrame(()=>{
const y = window.scrollY;
nodes.forEach(it=>{
const scrolled = Math.max(0, Math.min(TOTAL_PATH, y - it.startY));
const val = pickVal(scrolled);
if (val !== it.lastVal){
it.atom.textContent = val;
it.lastVal = val;
}
});
ticking = false;
});
}
recomputeStart();
window.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('resize', () => { recomputeStart(); onScroll(); });
onScroll();
// На случай, если Tilda поменяет размеры/позиции после загрузки
setTimeout(()=>{ recomputeStart(); onScroll(); }, 300);
}
if (document.readyState === 'complete' || document.readyState === 'interactive'){
init();
} else {
document.addEventListener('DOMContentLoaded', init);
}
})();
</script>