当前位置:首页 > VUE

vue实现数字滚动

2026-01-19 13:17:51VUE

Vue 实现数字滚动效果

数字滚动效果常用于展示统计数据、计数器等场景。以下是几种常见的实现方法:

使用 transition 和 v-for

通过 Vue 的过渡效果和列表渲染实现数字滚动:

<template>
  <div>
    <transition-group name="count-up" tag="div" class="counter">
      <span v-for="digit in displayDigits" :key="digit.id" class="digit">
        {{ digit.value }}
      </span>
    </transition-group>
  </div>
</template>

<script>
export default {
  data() {
    return {
      targetNumber: 12345,
      displayDigits: []
    }
  },
  mounted() {
    this.animateNumber(0, this.targetNumber, 2000)
  },
  methods: {
    animateNumber(start, end, duration) {
      const startTime = performance.now()
      const updateNumber = (currentTime) => {
        const elapsedTime = currentTime - startTime
        const progress = Math.min(elapsedTime / duration, 1)
        const currentValue = Math.floor(start + (end - start) * progress)

        this.displayDigits = String(currentValue).split('').map((d, i) => ({
          id: i,
          value: d
        }))

        if (progress < 1) {
          requestAnimationFrame(updateNumber)
        }
      }
      requestAnimationFrame(updateNumber)
    }
  }
}
</script>

<style>
.count-up-enter-active, .count-up-leave-active {
  transition: all 0.5s;
}
.count-up-enter, .count-up-leave-to {
  transform: translateY(-20px);
  opacity: 0;
}
.digit {
  display: inline-block;
  margin: 0 2px;
}
</style>

使用第三方库

vue-countup 是一个专门实现数字滚动效果的库:

安装:

npm install vue-countup-v2

使用示例:

<template>
  <count-up
    :start-val="0"
    :end-val="targetNumber"
    :duration="2.5"
    :options="options"
  />
</template>

<script>
import CountUp from 'vue-countup-v2'

export default {
  components: { CountUp },
  data() {
    return {
      targetNumber: 9876,
      options: {
        useEasing: true,
        useGrouping: true,
        separator: ',',
        decimal: '.',
        prefix: '$',
        suffix: ''
      }
    }
  }
}
</script>

纯 CSS 动画方案

结合 CSS 动画实现简单数字滚动:

<template>
  <div class="number-scroll">
    <div
      v-for="(digit, index) in digits"
      :key="index"
      class="digit-container"
      :style="{ height: `${digitHeight}px` }"
    >
      <div
        class="digit-scroll"
        :style="{ transform: `translateY(-${digit * digitHeight}px)` }"
      >
        <span v-for="n in 10" :key="n">{{ n % 10 }}</span>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  props: {
    value: {
      type: Number,
      default: 0
    }
  },
  data() {
    return {
      digitHeight: 30
    }
  },
  computed: {
    digits() {
      return String(this.value).split('').map(Number)
    }
  }
}
</script>

<style>
.number-scroll {
  display: flex;
  overflow: hidden;
}
.digit-container {
  position: relative;
  overflow: hidden;
}
.digit-scroll {
  transition: transform 1s ease-out;
}
.digit-scroll span {
  display: block;
  height: 30px;
  line-height: 30px;
}
</style>

性能优化建议

对于频繁更新的数字滚动,考虑使用 requestAnimationFrame 而非 setInterval 来实现动画循环,减少性能消耗。数字格式化可使用 Intl.NumberFormat 实现国际化支持。

vue实现数字滚动

数字滚动效果可以结合图表库如 ECharts 或 D3.js 实现更复杂的数据可视化效果。根据项目需求选择合适方案,简单场景推荐使用 vue-countup 库,复杂动画可考虑自定义实现。

标签: 数字vue
分享给朋友:

相关文章

vue实现无线滚动列表

vue实现无线滚动列表

无限滚动列表的实现方法 在Vue中实现无限滚动列表通常结合监听滚动事件和动态加载数据。以下是几种常见方法: 使用自定义指令 创建自定义指令v-infinite-scroll监听滚动事件:…

实现vue

实现vue

安装Vue.js 通过npm安装Vue.js是最常见的方式。确保已安装Node.js和npm,运行以下命令: npm install vue 或者使用CDN直接引入: <script src…

vue实现方法

vue实现方法

Vue 实现方法 Vue 是一种流行的前端框架,用于构建用户界面和单页应用。以下是几种常见的 Vue 实现方法: 创建 Vue 实例 通过 new Vue() 创建一个 Vue 实例,传入配置对象,…

vue实现handsontable

vue实现handsontable

Vue 中实现 Handsontable 要在 Vue 项目中集成 Handsontable,可以使用官方提供的 @handsontable/vue 封装库。以下是一个完整的实现步骤。 安装依赖 确…

vue实现driver

vue实现driver

Vue 实现 Driver.js 引导功能 Driver.js 是一个轻量级的 JavaScript 库,用于在网页上创建引导式导览。以下是在 Vue 项目中集成 Driver.js 的详细方法:…

vue翻页实现

vue翻页实现

Vue翻页实现方法 基础分页组件实现 使用v-for和计算属性实现基础分页逻辑: <template> <div> <ul> <li…