数字动态变化 vue实现
效果图
代码
hmtl
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>动态数字</title>
<script src="./dynamicDigital.js"></script>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
</head>
<body>
<div id="app">
</div>
<script>
new Vue({
el: '#app',
data() {
return {
digital: 0
}
},
mounted() {
this.setValue()
},
methods: {
setValue() {
let value = 500
let dynamicDigital = new DynamicDigital()
const dom = document.getElementById('app')
dynamicDigital.render(value, 2000, dom)
dynamicDigital.show()
setInterval(() => {
value += 500
dynamicDigital.render(value, 2000)
dynamicDigital.show();
}, 5000);
}
},
})
</script>
</body>
</html>
dynamicDigital.js
class DynamicDigital {
constructor() {
this.descDigital = 0
//起始值
this.prevDigital = 0
//时长
this.step = 0
this.duration = 20
this.dom = null
}
/*
descDigital 设定的数值
duration 时长
dom 节点
*/
render(descDigital, duration, dom) {
this.descDigital = descDigital
this.duration = duration
this.dom = dom
}
show() {
//等于设定值时结束
if (this.prevDigital === this.descDigital) {
this.step = 0;
return;
}
//设置步长
if (this.step === 0) {
const diff = this.descDigital - this.prevDigital;
const count = this.duration / 50
this.step = diff > 0 ? Math.ceil(diff / count) : Math.floor(diff / count)
}
this.prevDigital += this.step
//防止数值超出
if (this.step > 0) {
this.prevDigital = this.prevDigital > this.descDigital ? this.descDigital : this.prevDigital
} else {
this.prevDigital = this.prevDigital < this.descDigital ? this.descDigital : this.prevDigital
}
this.dom.innerHTML = this.prevDigital.toLocaleString()
//每50毫秒绘制一次
setTimeout(() => {
this.show()
}, 50)
}
}