js實(shí)現(xiàn)數(shù)字滾動(dòng)特效
本文實(shí)例為大家分享了js實(shí)現(xiàn)數(shù)字滾動(dòng)展示的具體代碼,供大家參考,具體內(nèi)容如下
效果圖

html代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
#t,#tt{
border: #ccc thin solid;
width: 250px;
height: 60px;
display: flex;
justify-content: space-around;
align-items: center;
font-size: 20px;
}
.t-num{
height: 100%;
overflow: hidden;
/*background-color: #ccc;*/
width: 25px;
line-height: 60px;
text-align: center;
}
.t-num-s{
display: block;
height: 100%;
width: 100%;
/*border: red thin solid;*/
}
</style>
</head>
<body>
<div id="t">
</div>
<div id="tt">
</div>
<!--結(jié)構(gòu)示例-->
<!--<div>-->
<!--<div class="divClass"><span class="spanclass">1</span></div>-->
<!--<div class="divClass"><span class="spanclass">2</span></div>-->
<!--<div class="divClass"><span class="spanclass">3</span></div>-->
<!--<div class="divClass"><span class="spanclass">4</span></div>-->
<!--</div>-->
</body>
</html>
<script src="index.js"></script>
<script>
let num = 12345.5
//配置項(xiàng) p:滾動(dòng)熟讀,height:數(shù)字容器的高度,spanclass:數(shù)字容器的classname,divClasss: span容器的class
// numchange.config({p: 5}).change('t', num)
let t = numchange()
t.change('t', num)
setInterval(() => {
num = Math.random() * 100 + parseFloat(num)
num = num.toFixed(2)
t.change('t', num)
},3000)
let num1 = 12345
let t1 = numchange()
t1.change('tt', num1)
setInterval(() => {
num1 = parseInt(Math.random() * 100) + parseInt(num1)
t1.change('tt', num1)
},3000)
</script>
js代碼
let numchange = function (){
let point = '.'
// 數(shù)字容器高度
let height = 60
// 每次滾動(dòng)距離/滾動(dòng)速度
let p = 3
// 數(shù)字spanclass
let spanClass = 't-num-s'
// 數(shù)字divclass
let divClass = 't-num'
//
let cache = {}
function createDiv(id, num, len, paddingNum){
let str = ''
for (let i = 0; i < len; i++) {
str += `<div class="${divClass}" id="${id+i}"><span class="${spanClass}">${paddingNum === undefined?num[i]:paddingNum}</span></div>`
}
return str
}
function initZero(id, count){
document.getElementById(id).innerHTML = createDiv(id,null,count,0)
}
function refresh(oldNum, newNum, id){
let len = newNum.length - oldNum.length;
for (let i = 0; i < len; i++) {
oldNum.unshift('0')
}
document.getElementById(id).innerHTML = createDiv(id,oldNum,oldNum.length)
}
function refresh1(oldNum, newNum, id){
let len = oldNum.length - newNum.length;
for (let i = 0; i < len; i++) {
oldNum.shift()
}
document.getElementById(id).innerHTML = createDiv(id,oldNum,oldNum.length)
}
function scrollNum(id, num, order){
let h = num * height
let e = document.getElementById(id)
let t = setInterval(() => {
let m = e.scrollTop;
m = m + p
if(m > h){
clearInterval(t)
let cs = e.children
for (let i = cs.length-2; i >= 0; i--) {
e.removeChild(cs[i])
}
return
}
e.scrollTop = m
}, 10)
}
function createSpan(num){
let span = document.createElement('span')
span.className = spanClass
span.innerText = num
return span
}
function appendNum(id, start, end){
let f = document.createDocumentFragment()
let count = 0
if(start === end && isNaN(start)){
return 0
}
if(isNaN(start) && !isNaN(end)){
for (let i = 0; i <= end; i++) {
f.appendChild(createSpan(i))
count++
}
document.getElementById(id).appendChild(f)
return count
}
if(!isNaN(start) && isNaN(end)){
for (let i = start+1; i <= 9; i++) {
f.appendChild(createSpan(i))
count++
}
f.appendChild(createSpan('.'))
count++
document.getElementById(id).appendChild(f)
return count
}
if(start < end){
for (let i = start+1; i <= end; i++) {
f.appendChild(createSpan(i))
count++
}
}else if(start > end){
for (let i = start+1; i <= 9; i++) {
f.appendChild(createSpan(i))
count++
}
for (let i = 0; i <= end; i++) {
f.appendChild(createSpan(i))
count++
}
}else{
return 0
}
document.getElementById(id).appendChild(f)
return count
}
/**
* @param id 容器id
* @param num 展示的數(shù)字
*/
function change(id, num){
console.log(num)
let strArr = num.toString().split('');
let oldNum = cache[id]
// 如果沒(méi)有緩存,開(kāi)始數(shù)字全部填充0
if(!oldNum){
initZero(id,strArr.length)
oldNum = []
}else{
oldNum = cache[id].toString().split('')
// 如果新數(shù)字長(zhǎng),原來(lái)數(shù)字左側(cè)填充0
if(oldNum.length < strArr.length){
refresh(oldNum, strArr, id)
// 如果新數(shù)字短,原來(lái)數(shù)字左側(cè)移除
}else if(oldNum.length > strArr.length){
refresh1(oldNum, strArr, id)
}
}
// 循環(huán)比較每個(gè)數(shù)字差異,添加需要滾動(dòng)的數(shù)字列
for (let i = 0, len = strArr.length; i < len; i++) {
let start = oldNum[i] !== point ? parseInt(oldNum[i]||0) : oldNum[i]
let end = strArr[i] !== point ? parseInt(strArr[i]||0) : strArr[i]
let count = appendNum(id+i, start, end)
if(count > 0){
// 數(shù)字滾動(dòng)
scrollNum(id+i, count, i+1)
}
}
cache[id] = num
}
function config(param){
if(param.p){
p = param.p
}
if(param.height){
height = param.height
}
if(param.spanClass){
spanClass = param.spanClass
}
if(param.divClass){
divClass = param.divClass
}
return scroll
}
let scroll = {
change: change,
config: config
}
return scroll
}
遺留問(wèn)題:setInterval方法在切換頁(yè)面后,會(huì)變快。解決方案1:用setTimeout代替setInterval。2.requestAnimFrame
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript中最常見(jiàn)的三個(gè)面試題解析
JavaScript是所有現(xiàn)代瀏覽器的官方語(yǔ)言。 因此,JavaScript 問(wèn)題出現(xiàn)在各種開(kāi)發(fā)人員的面試中。這篇文章主要跟大家分享了關(guān)于JavaScript中最常見(jiàn)的三個(gè)面試題,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-03-03
JavaScript實(shí)現(xiàn)文字展開(kāi)和收起效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)文字展開(kāi)和收起效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
JavaScript 對(duì)象成員的可見(jiàn)性說(shuō)明
與java等基于類的面向?qū)ο笳Z(yǔ)言的private、protected、public等關(guān)鍵字的用途類似,基于對(duì)象的JavaScript語(yǔ)言,在對(duì)象構(gòu)造上也存在類似的成員可見(jiàn)性問(wèn)題。2009-10-10
js中用事實(shí)證明cssText性能高的問(wèn)題
首先要感謝 EtherDream 的不同觀點(diǎn),在 巧用cssText屬性批量操作樣式 一篇中由于他的質(zhì)疑態(tài)度使我做了進(jìn)一步的測(cè)試。2011-03-03
如何用JS判斷數(shù)組中是否存在某個(gè)值或者某個(gè)對(duì)象的值
數(shù)組是我們編程中經(jīng)常使用的的數(shù)據(jù)結(jié)構(gòu)之一,在處理數(shù)組時(shí),我們經(jīng)常需要在數(shù)組中查找特定的值,下面這篇文章主要給大家介紹了關(guān)于如何用JS判斷數(shù)組中是否存在某個(gè)值或者某個(gè)對(duì)象的值的相關(guān)資料,需要的朋友可以參考下2023-01-01
JavaScript實(shí)現(xiàn)LRU算法的示例詳解
不知道屏幕前的朋友們,有沒(méi)有和我一樣,覺(jué)得LRU算法原理很容易理解,實(shí)現(xiàn)起來(lái)卻很復(fù)雜。所以本文就為大家整理了一下實(shí)現(xiàn)的示例代碼,需要的可以參考一下2023-04-04

