Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 28.01.2024, 18:26
Интересующийся
Отправить личное сообщение для NastyaVs Посмотреть профиль Найти все сообщения от NastyaVs
 
Регистрация: 28.01.2024
Сообщений: 28

Срабатывания счетчика цифр при иностранном формате чисел
Добрый день, уважаемые специалисты 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();
});
Ответить с цитированием
  #2 (permalink)  
Старый 28.01.2024, 20:35
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

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

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

- и все значения до конечного результата останавливались синхронно.
Как они могут останавливаться синхронно, если начинаются в разное время (когда появятся при скролле)?
Ответить с цитированием
  #3 (permalink)  
Старый 28.01.2024, 21:25
Интересующийся
Отправить личное сообщение для NastyaVs Посмотреть профиль Найти все сообщения от NastyaVs
 
Регистрация: 28.01.2024
Сообщений: 28

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

Последний раз редактировалось NastyaVs, 28.01.2024 в 21:32.
Ответить с цитированием
  #4 (permalink)  
Старый 28.01.2024, 21:27
Интересующийся
Отправить личное сообщение для NastyaVs Посмотреть профиль Найти все сообщения от NastyaVs
 
Регистрация: 28.01.2024
Сообщений: 28

Сообщение от voraa Посмотреть сообщение
Как они могут останавливаться синхронно, если начинаются в разное время (когда появятся при скролле)?
voraa, Они же находятся в одном блоке. Вот как это выглядит в коде:
https://codepen.io/AlmUA/pen/xxBpOmp

Последний раз редактировалось NastyaVs, 28.01.2024 в 21:31.
Ответить с цитированием
  #5 (permalink)  
Старый 28.01.2024, 22:48
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от 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 в миллисекундах.

Последний раз редактировалось voraa, 28.01.2024 в 23:11.
Ответить с цитированием
  #6 (permalink)  
Старый 29.01.2024, 00:59
Интересующийся
Отправить личное сообщение для NastyaVs Посмотреть профиль Найти все сообщения от NastyaVs
 
Регистрация: 28.01.2024
Сообщений: 28

Сообщение от voraa Посмотреть сообщение
Ну это не сложно
https://developer.mozilla.org/ru/doc...l/NumberFormat
Я сама не смогу. Пыталась

Цитата:
Что такое BASE_DELAY?
Это максимальное время, через которое должен завершиться отсчет?
(по программе это так, судя по
const delay = Math.floor(BASE_DELAY / endValue);
)
Да
Ответить с цитированием
  #7 (permalink)  
Старый 29.01.2024, 08:15
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

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

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);
    });
}
Ответить с цитированием
  #8 (permalink)  
Старый 29.01.2024, 12:00
Интересующийся
Отправить личное сообщение для NastyaVs Посмотреть профиль Найти все сообщения от NastyaVs
 
Регистрация: 28.01.2024
Сообщений: 28

Сообщение от voraa Посмотреть сообщение
Что бы одновременно останавливались и выводились числа с учетом языковой настройки такой код
Не срабатыват
Ответить с цитированием
  #9 (permalink)  
Старый 29.01.2024, 16:27
Аватар для voraa
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 2,745

Сообщение от NastyaVs
Не срабатыват
У меня CSS нет, поэтому так смотрите. Все работает
https://jsfiddle.net/013sf5w9/
Ответить с цитированием
  #10 (permalink)  
Старый 29.01.2024, 17:56
Интересующийся
Отправить личное сообщение для NastyaVs Посмотреть профиль Найти все сообщения от NastyaVs
 
Регистрация: 28.01.2024
Сообщений: 28

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

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

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

Последний раз редактировалось NastyaVs, 29.01.2024 в 17:59.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Подсчет суммы чисел при отметке чекбоксов Garik Элементы интерфейса 11 27.07.2013 21:47
Создания счетчика при событие arhonik jQuery 4 17.03.2013 12:52
Изменение чисел при передаче в БД FoxTrix Серверные языки и технологии 9 05.03.2013 22:44
Ошибка при сложении двух чисел SER Events/DOM/Window 2 20.12.2012 08:35
Загрузка счетчика при редиректе Johny Общие вопросы Javascript 6 31.08.2010 20:19