数字动画,有数字的地方都能用上,拿去吧!
效果:
1、template部分
<template>
<div class="v-count-up">{{ dispVlaue }}</div>
</template>
2、js部分
export default {
data() {
return {
timer: "",
calcValue: 0,
startTime: 0,
remaining: 0,
raf: "",
};
},
props: {
value: Number,
startValue: {
type: Number,
default: 0,
},
time: {
type: Number,
default: 5000,
},
useease: {
type: Boolean,
default: true,
},
tofixed: {
type: Number,
default: 0,
},
separator: {
type: Boolean,
default: false,
},
reset: {
type: Boolean,
default: false,
},
},
computed: {
dispVlaue() {
const calcValue = (this.calcValue || 0).toFixed(this.tofixed);
return this.separator ? this.formatNumber(calcValue) : calcValue;
},
startVal() {
return this.startValue > this.value ? this.value : this.startValue;
},
},
created() {
this.start();
},
watch: {
reset() {
this._reset();
},
},
methods: {
count(timestamp) {
if (!this.startTime) {
this.startTime = timestamp;
}
let progress = timestamp - this.startTime;
this.remaining = this.time - progress;
if (this.useease) {
this.calcValue = this.easeOutExpo(
progress,
this.startVal,
this.value - this.startVal,
this.time
);
} else {
this.calcValue =
this.startVal + (this.value - this.startVal) * (progress / this.time);
}
if (this.calcValue > this.value) {
this.calcValue = this.value;
}
if (progress < this.time) {
this.raf = requestAnimationFrame(this.count);
} else {
this.$emit("end");
cancelAnimationFrame(this.raf);
}
},
start() {
if (this.time > 0) {
this.raf = requestAnimationFrame(this.count);
} else {
this.printValue();
}
},
_reset() {
this.startTime = 0;
this.calcValue = 0;
this.remaining = 0;
this.start();
},
easeOutExpo(t, b, c, d) {
return (c * (-Math.pow(2, (-10 * t) / d) + 1) * 1024) / 1023 + b;
},
printValue() {
this.calcValue = this.value;
},
formatNumber(num) {
var result, x, x1, x2, x3;
result = String(num);
x = result.split(".");
x1 = x[0];
x2 = x.length > 1 ? "." + x[1] : "";
if (this.separator) {
x3 = "";
for (var i = 0, len = x1.length; i < len; ++i) {
if (i !== 0 && i % 3 === 0) {
x3 = "," + x3;
}
x3 = x1[len - i - 1] + x3;
}
x1 = x3;
}
return x1 + x2;
},
},
destroyed() {
cancelAnimationFrame(this.raf);
},
};