<!-- Модификации счетчика чисел. https://t.me/breeze_tilda -->
<script>
document.addEventListener("DOMContentLoaded", function () {
var CLASS_ATOM = '.uc-animation-num .tn-atom'; // ← класс Zero Block
var CLASS_TEXT = '.uc-animation-text'; // ← класс обычного блока
var OFFSET = -50; // ← отступ, когда начинает срабатывать анимация
var DURATION = 4000; // ← вот здесь менять время отсчета в миллисекундах
var SEPARATOR = ' ';
var SCROLL_DEBOUNCE = 50;
var INIT_DELAY = 100;
function formatNumber(num) {
return Math.floor(num).toString().replace(/\B(?=(\d{3})+(?!\d))/g, SEPARATOR);
}
function isVisible(el) {
var rect = el.getBoundingClientRect();
return rect.top <= window.innerHeight + OFFSET && rect.bottom >= -OFFSET;
}
function easeInOut(p) {
return p < 0.5 ? 2 * p * p : -1 + (4 - 2 * p) * p;
}
function animate(item) {
if (item.hasAnimated) return;
item.hasAnimated = true;
var startTime = Date.now();
function tick() {
var progress = Math.min((Date.now() - startTime) / DURATION, 1);
var current = item.target * easeInOut(progress);
item.el.textContent = item.prefix
? item.prefix + formatNumber(current) + item.suffix
: formatNumber(current);
if (progress < 1) requestAnimationFrame(tick);
}
requestAnimationFrame(tick);
}
function buildAtomItems() {
var items = [];
document.querySelectorAll(CLASS_ATOM).forEach(function (el) {
var text = el.textContent;
var match = text.match(/[\d,.]+/);
if (!match) return;
var target = parseFloat(match[0].replace(/[,]/g, ''));
if (isNaN(target)) return;
var start = text.indexOf(match[0]);
items.push({
el: el,
target: target,
prefix: text.substring(0, start),
suffix: text.substring(start + match[0].length),
hasAnimated: false,
});
el.textContent = text.substring(0, start) + '0' + text.substring(start + match[0].length);
});
return items;
}
function buildTextItems() {
var items = [];
document.querySelectorAll(CLASS_TEXT).forEach(function (container) {
var walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT, null, false);
var textNodes = [];
while (walker.nextNode()) {
textNodes.push(walker.currentNode);
}
textNodes.forEach(function (node) {
var text = node.nodeValue;
var parts = text.split(/(\d+)/);
if (parts.length <= 1) return;
var frag = document.createDocumentFragment();
parts.forEach(function (part) {
if (/^\d+$/.test(part)) {
var span = document.createElement('span');
span.textContent = '0';
items.push({
el: span,
target: parseInt(part, 10),
prefix: null,
suffix: null,
hasAnimated: false,
});
frag.appendChild(span);
} else {
frag.appendChild(document.createTextNode(part));
}
});
node.parentNode.replaceChild(frag, node);
});
});
return items;
}
function checkAll(items) {
items.forEach(function (item) {
if (!item.hasAnimated && isVisible(item.el)) animate(item);
});
}
var items = buildAtomItems().concat(buildTextItems());
var scrollTimer;
window.addEventListener('scroll', function () {
clearTimeout(scrollTimer);
scrollTimer = setTimeout(function () { checkAll(items); }, SCROLL_DEBOUNCE);
}, { passive: true });
window.addEventListener('resize', function () { checkAll(items); });
setTimeout(function () { checkAll(items); }, INIT_DELAY);
});
</script>