Vue 2中实现数字滚动效果

发布时间 2023-03-31 19:24:53作者: 於生

 

代码:

<template>
  <div class="statistics-num">
    <!-- 显示当前数字,不使用逗号分隔符 -->
    <span class="num">{{ currentVal.toString() }}</span>
     <!-- 显示当前数字,用逗号分隔符 -->
    <!-- <span class="num">{{ currentVal.toLocaleString() }}</span> -->
    <!-- 显示加号 -->
    <!-- <span class="sign">+</span> -->
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 目标数字
      endVal: 20000,
      // 动画持续时间(单位:毫秒)
      duration: 2000,
      // 当前数字,初始值为0
      currentVal: 0,
      // 动画开始时间
      startTime: null
    }
  },
  mounted() {
    // 在组件挂载后启动数字滚动效果
    this.startCount()
  },
  methods: {
    startCount() {
      // 使用requestAnimationFrame()方法实现动画效果
      window.requestAnimationFrame(timestamp => {
        // 如果startTime属性为空,则将当前时间赋值给它
        if (!this.startTime) this.startTime = timestamp
        // 计算当前时间与动画开始时间之间的时间差,以及时间差所占总时间的百分比
        const progress = timestamp - this.startTime
        const percentage = Math.min(progress / this.duration, 1)
        // 根据时间百分比计算当前数字,并将其赋值给currentVal属性
        this.currentVal = Math.floor(percentage * (this.endVal - 0) + 0)
        // 如果动画持续时间还没有达到,则继续循环调用startCount()方法
        if (progress < this.duration) {
          this.startCount()
        }
      })
    }
  }
}
</script>

<style>
.statistics-num {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 130px;
  background: #f3f3f3;
}

.num {
  font-size: 80px;
  font-weight: 600;
  color: #000;
  margin-right: 10px;
  transition: 1s ease-out;
}

.sign {
  font-size: 40px;
  font-weight: 600;
  color: #000;
}
</style>

源码地址:https://github.com/yusheng9/number-scrolling

 

效果: