JSFiddle - React, Tailwind, and code Playground
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex, nofollow">
<link rel="stylesheet" href="css/style.css">
<title>Values</title>
</head>
<body>
<div class="wrapper">
<main>
<div class="block js-counter-numbers-wrapper">
<div class="block__container">
<div class="block__grid">
<div class="block__item_grid block__item_grid--info-mod">
<div class="block__row">
<div class="block__col">
<div data-number="2800" class="block__numbers js-counter-numbers">
<div class="block__number_sizer">2800</div>
<div class="block__number js-counter-number">0</div>
</div>
<div class="block__text">
<p>Projects</p>
</div>
</div>
<div class="block__col">
<div data-number="106" class="block__numbers js-counter-numbers">
<div class="block__number_sizer">1060</div>
<div class="block__number js-counter-number">0</div>
</div>
<div class="block__text">
<p>Years</p>
</div>
</div>
</div>
<div class="block__row">
<div class="block__col">
<div data-number="1700"...
JavaScript
function counterNumbers() {
const SELECTORS = {
wrapper: ".js-counter-numbers-wrapper",
numbers: ".js-counter-numbers",
number: ".js-counter-number",
};
const $wrappers = document.querySelectorAll(SELECTORS.wrapper);
if (!$wrappers.length) return;
const TIME_COUNT = 6000; // Время счета
function counter ($wrapper, timeCount) {
const $numbers = $wrapper.querySelectorAll(SELECTORS.numbers);
if (!$numbers.length) return;
const $numbersText = $wrapper.querySelectorAll(SELECTORS.number);
const endValues = [];
$numbers.forEach(($numberWrapper) => {
const endValue = parseInt($numberWrapper.dataset.number);
endValues.push (endValue);
})
const timeStart = performance.now();
function showNumbers (currentTime) {
let part = (currentTime - timeStart) / timeCount;
if (part > 1) part = 1;
for (let i = 0; i < $numbersText.length; i++) {
let lang ='';
const ptl = $numbersText[i].closest('[lang]');
if (ptl) {
lang = ptl.getAttribute('lang')
}
const form = new Intl.NumberFormat(lang);
const value = Math.round( part * endValues[i]);
$numbersText[i].textContent = form.format(value);
}
if (part < 1) requestAnimationFrame(showNumbers);
}
requestAnimationFrame(showNumbers);
}
$wrappers.forEach(($wrapper) => {
counter ($wrapper, TIME_COUNT);
});
}
window.addEventListener("load", () => {
counterNumbers();
});