当前位置:首页 > 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 是一个专门实现数字滚动效果的库:

vue实现数字滚动

安装:

npm install vue-countup-v2

使用示例:

vue实现数字滚动

<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 实现国际化支持。

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

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

相关文章

vue实现按钮刷新

vue实现按钮刷新

Vue 实现按钮刷新功能 在 Vue 中实现按钮刷新功能可以通过多种方式实现,具体取决于刷新需求是局部刷新还是全局刷新。以下是几种常见的方法: 使用 window.location.reload(…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-for…

vue 实现在线预览

vue 实现在线预览

Vue 实现在线预览的常见方法 使用 iframe 嵌入 通过 iframe 标签可以嵌入多种类型的文件,如 PDF、图片、网页等。需要确保文件地址可访问。 <template> &…

vue实现语音

vue实现语音

Vue 实现语音功能的方法 使用 Web Speech API Vue 可以结合 Web Speech API 实现语音识别和合成功能。Web Speech API 包含 SpeechRecognit…

vue实现jqueryui

vue实现jqueryui

Vue 实现 jQuery UI 功能 在 Vue 项目中实现类似 jQuery UI 的功能,可以通过原生 Vue 组件或第三方库来实现。以下是几种常见 jQuery UI 功能的 Vue 替代方案…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…