当前位置:首页 > 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 Router实现页面跳转 安装Vue Router后,在项目中配置…

vue实现右下角弹框

vue实现右下角弹框

实现右下角弹框的基本思路 在Vue中实现右下角弹框,通常需要结合CSS定位和Vue的组件化特性。弹框可以通过绝对定位固定在右下角,并通过Vue控制其显示与隐藏。 创建弹框组件 新建一个Vue组件(如…

vue实现轮询

vue实现轮询

实现轮询的基本方法 在Vue中实现轮询可以通过setInterval或setTimeout配合递归调用完成。轮询通常用于定期向服务器请求数据更新。 使用setInterval的简单示例: data…

antd vue 实现

antd vue 实现

使用 Ant Design Vue 实现功能 Ant Design Vue 是基于 Vue.js 的 UI 组件库,提供了丰富的组件和设计规范。以下是一些常见功能的实现方法。 安装 Ant Desi…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

实现vue datepicker

实现vue datepicker

安装依赖 使用 vue-datepicker 或第三方库如 v-calendar 或 vue2-datepicker。以 vue2-datepicker 为例: npm install vue2…