Анимация чисел при прокрутке страницы
Здравствуйте, очень нужен небольшой скрипт анимации чисел при прокрутке страницы, ну например от 0 до 300.
Но при этом хотелось бы чтобы сама цифра ДО которой идет отсчет вводилась в html, а не в скрипте. Во нашел что то подобное, но там финальное число вводится в сам скрипт, а не в html http://jsfiddle.net/f48ZD/183/ |
|
Спасибо, но это не то, надо чтобы как в моем примере, человек прокручивает страницу до определенного дива и появляется число, которое быстро увеличивается (как в лендингах).
а в вашем оно просто увеличивается при прокрутке |
|
https://jsfiddle.net/Homelux/8jkr53n6/
вот сделал чтото похожее - но если несколько цифр на странице с одним классом, как тут http://demo.icetheme.com/?template=it_studio то СЧИАТЕТ БЕСКОНЕЧНО как поправить это можно? |
|
Да, то что надо
Но при этом хотелось бы чтобы сама цифра ДО которой идет отсчет вводилась в html, а не в скрипте. Можно сделать чтобы в эту строку вместо нуля? <div class="number">0</div> |
|
А как быть, если нужно увеличить одновременно 3 разных числа?
Например, изменив предыдущий пример таким образом: HTML: <div class="number" data-max="3">0</div> <div class="number" data-max="40">0</div> <div class="number" data-max="400">0</div> |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Document</title> <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1"> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui"> </head> <body> <div class="scrolling"> <p>Крути вниз!</p> <div class="number" data-max="30"></div> <div class="number" data-max="450"></div> <div class="number" data-max="7500"></div> <div class="number" data-max="1000000"></div> </div> <style> html { text-align: center; --angle: 5deg; background: linear-gradient(calc(180deg + var(--angle)), transparent 47%, #f5f5f5 50%, transparent 0) 0 0, linear-gradient(calc(180deg - var(--angle)), transparent 47%, #f5f5f5 50%, transparent 0) 100% 0; background-size: 50% 8em; background-repeat: repeat-y; } body { margin: 0; } .scrolling { overflow: auto; height: 100vh; } .number { font: 3em sans-serif; margin: 25em auto; } .number::after { background: rebeccapurple; color: white; border-radius: 50%; padding: 2em; counter-reset: number var(--value); content: counter(number); } </style> <script> { let inTheView = Symbol.for("inTheView"); let multiplier = Symbol.for("multiplier"); // Создадим новое событие, которое выстреливает, когда счётчик становится видимым for(let element of document.querySelectorAll(".scrolling")) { element.addEventListener("scroll", event => { for(let numberElement of element.querySelectorAll(".number")) { let y = (element.scrollTop - numberElement.offsetTop + element.offsetHeight) / (element.offsetHeight); let isInTheView = y > 0 && y < 1; if(numberElement[inTheView] !== isInTheView) { numberElement[inTheView] = isInTheView; if(isInTheView) numberElement.dispatchEvent(new Event("number:visible", { bubbles: true })); } } }); } // обработка нового события addEventListener("number:visible", event => { loop.call(event.target); console.log(event.target[inTheView]); }); // анимация цифр запускается, когда срабатывает новое событие function loop() { if(this[multiplier] === 1) { this[multiplier] = null; return; }; if(typeof this[multiplier] !== "number") { this[multiplier] = 0; this["dateStart"] = performance.now(); } this[multiplier] = Math.min((performance.now() - this.dateStart) / 750, 1); this.style.setProperty("--value", (this[multiplier] * this.getAttribute("data-max") | 0)); requestAnimationFrame(loop.bind(this)); } }; </script> </body> </html> |
Спасибо за ответ и интересное решение!:thanks:
Но, нельзя ли даную задачу выполнить иначе, а именно изменив лишь код javascript? А с помощью css, может, только задать числам горизонтальное расположение, а не вертикальное как сейчас, то есть расположить их в одну строку. |
анимация чисел в зоне видимости jquery
antonenkoab,
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> .number{ float: left; width: 100px; font-size: 22px; line-height: 44px; color: #FFFFFF; background-color: #8B4513; text-align: center; margin-right: 30px; } p{ height: 2000px; } </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script> $(function() { var num = $(".number"); num.each(function(indx, el) { var max = $(el).data("max"); var duration = 5000; var visibility = checkViewport(el); $(el).on("animeNum", function() { $({n: 0}).animate({n: max}, { easing: "linear", duration: duration, step: function(now, fx) { $(el).html(now | 0) } }) }).data("visibility", visibility); visibility && $(el).trigger("animeNum") }); function checkViewport(el) { var H = document.documentElement.clientHeight, h = el.scrollHeight, pos = el.getBoundingClientRect(); return pos.top + h > 0 && pos.bottom - h < H } $(window).scroll(function() { num.each(function(indx, el) { var visibility = checkViewport(el); el = $(el); var old = el.data("visibility"); old != visibility && el.data("visibility", visibility) && !old && el.trigger("animeNum") }) }) }); </script> </head> <body> <p></p> <div class="number" data-max="3">0</div> <div class="number" data-max="40">0</div> <div class="number" data-max="400">0</div> <p></p> </body> </html> |
Здорово! Спасибо! :thanks: Наверное таки следует изучать jquery :) .
А, все-таки, для приверженцев писать код на чистом javascript, как такое повторить без использования библиотек на подобие jquery? |
Цитата:
|
Заметил. Я на пост №10 тоже писал комментарий. Извините, я наверное многого хочу.
|
antonenkoab,
чем пост №10 не устроил? |
Цитата:
|
Часовой пояс GMT +3, время: 02:40. |