Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Срабатывания счетчика цифр при иностранном формате чисел (https://javascript.ru/forum/css-html/85729-srabatyvaniya-schetchika-cifr-pri-inostrannom-formate-chisel.html)

NastyaVs 28.01.2024 18:26

Срабатывания счетчика цифр при иностранном формате чисел
 
Добрый день, уважаемые специалисты JS.
Прошу Вас помочь в доработке кода на JS для счетчика цифр, который позволял бы:

- перелистывать значения которые находятся в иностранной разрядности цифр (сейчас у меня значения в обычном формате 2800, 1700, 106, 720. А нужно чтобы эти же значения код смог перелистывать когда они находятся в формате с иностранной разрядностью, а именно (2,800, 1,700, 106, 720))

- значения начинали пересвистываться когда при скроле страницы они достигали данного блока с этими значениями.

- и все значения до конечного результата останавливались синхронно.

Это то что я смога реализовать самостоятельно:

<!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" class="block__numbers js-counter-numbers">
										<div class="block__number_sizer">106</div>
										<div class="block__number js-counter-number">0</div>
									</div>
									<div class="block__text">
										<p>Clients</p>
									</div>
								</div>
								<div class="block__col">
									<div data-number="720" class="block__numbers js-counter-numbers">
										<div class="block__number_sizer">1670</div>
										<div class="block__number js-counter-number">0</div>
									</div>
									<div class="block__text">
										<p>Directions</p>
									</div>
								</div>
							</div>
						</div>
					</div>
				</div>
			</div>
		</main>
	</div>
	<script src="js/app.js"></script>
</body>

</html>


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 BASE_DELAY = 200;

	$wrappers.forEach(($wrapper) => {
		const $numbers = $wrapper.querySelectorAll(SELECTORS.numbers);

		if (!$numbers.length) return;

		$numbers.forEach(($numberWrapper) => {
			const $number = $numberWrapper.querySelector(SELECTORS.number);
			const endValue = parseInt($numberWrapper.dataset.number);

			if (!endValue) return;

			const delay = Math.floor(BASE_DELAY / endValue);

			const interval = setInterval(() => {
				const currentNum = parseInt($number.innerText);

				if (currentNum >= endValue) clearInterval(interval);
				else $number.innerText = currentNum + 1;
			}, delay);
		});
	});
}

window.addEventListener("load", () => {
	counterNumbers();
});

voraa 28.01.2024 20:35

Чего то я не понял про "иностранную разрядность".

Цитата:

Сообщение от NastyaVs
- значения начинали пересвистываться когда при скроле страницы они достигали данного блока с этими значениями.

- и все значения до конечного результата останавливались синхронно.

Как они могут останавливаться синхронно, если начинаются в разное время (когда появятся при скролле)?

NastyaVs 28.01.2024 21:25

Цитата:

Сообщение от voraa (Сообщение 554608)
Чего то я не понял про "иностранную разрядность".

voraa, Обычный формат чисел в тысячах - пишутся 1800 или число 1700
В некоторых странах при разрядности тысячей они отделяются запятой - то есть 1800 пишется как 1,800 или число 1700 пишется как 1,700

NastyaVs 28.01.2024 21:27

Цитата:

Сообщение от voraa (Сообщение 554608)
Как они могут останавливаться синхронно, если начинаются в разное время (когда появятся при скролле)?

voraa, Они же находятся в одном блоке. Вот как это выглядит в коде:
https://codepen.io/AlmUA/pen/xxBpOmp

voraa 28.01.2024 22:48

Цитата:

Сообщение от NastyaVs
некоторых странах при разрядности тысячей они отделяются запятой - то есть 1800 пишется как 1,800 или число 1700 пишется как 1,700

Ну это не сложно
https://developer.mozilla.org/ru/doc...l/NumberFormat

Что такое BASE_DELAY?
Это максимальное время, через которое должен завершиться отсчет?
(по программе это так, судя по
const delay = Math.floor(BASE_DELAY / endValue);
)

Или это все таки интервал, между прибавлениями 1 для max endValue? Тогда все время отсчета будет BASE_DELAY * max endValue в миллисекундах.

NastyaVs 29.01.2024 00:59

Цитата:

Сообщение от voraa (Сообщение 554611)

Я сама не смогу. Пыталась

Цитата:

Что такое BASE_DELAY?
Это максимальное время, через которое должен завершиться отсчет?
(по программе это так, судя по
const delay = Math.floor(BASE_DELAY / endValue);
)
Да

voraa 29.01.2024 08:15

Что бы одновременно останавливались и выводились числа с учетом языковой настройки такой код

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();
        
        const form = new Intl.NumberFormat();
        
        function showNumbers (currentTime) {
            let part = (currentTime - timeStart) / timeCount;
            if (part > 1) part = 1;
            for (let i = 0; i < $numbersText.length; i++) {
                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);
    });
}

NastyaVs 29.01.2024 12:00

Цитата:

Сообщение от voraa (Сообщение 554615)
Что бы одновременно останавливались и выводились числа с учетом языковой настройки такой код

Не срабатыват

voraa 29.01.2024 16:27

Цитата:

Сообщение от NastyaVs
Не срабатыват

У меня CSS нет, поэтому так смотрите. Все работает
https://jsfiddle.net/013sf5w9/

NastyaVs 29.01.2024 17:56

voraa,
Сработало.
Но как добиться того чтобы разделитель в тысячных числах был не через пробел:
2 800
а через запятую
2,800

То есть как бы по факту работа счетчика (отсчета) нужна: Чтобы значения которые идут в тысячах отделялись не через пробел как сейчас, а через запятую 2,800. Можно пожалуйста так так сделать?

https://dropmefiles.com/PHIbt - вот на видео сейчас тысячи счетчик отчитывает через пробел нижние числа, а верхние как бы хотелось через запятую.


Часовой пояс GMT +3, время: 16:15.