当前位置:首页 > VUE

vue实现数字跳动

2026-01-17 01:00:10VUE

Vue 实现数字跳动效果

数字跳动(数字滚动动画)是一种常见的交互效果,通常用于展示统计数据、计数器等场景。以下是几种实现方式:

方法一:使用 transition 和 v-for

通过遍历数字字符并应用过渡效果实现跳动:

<template>
  <div class="number-display">
    <transition-group name="jump" tag="span">
      <span v-for="(digit, index) in displayedNumber" :key="index" class="digit">
        {{ digit }}
      </span>
    </transition-group>
  </div>
</template>

<script>
export default {
  props: ['value'],
  data() {
    return {
      currentNumber: 0
    }
  },
  computed: {
    displayedNumber() {
      return String(this.currentNumber).split('')
    }
  },
  watch: {
    value(newVal) {
      this.animateNumber(newVal)
    }
  },
  methods: {
    animateNumber(target) {
      const duration = 1000
      const start = this.currentNumber
      const increment = (target - start) / duration * 16

      const animate = () => {
        if ((increment > 0 && this.currentNumber < target) || 
            (increment < 0 && this.currentNumber > target)) {
          this.currentNumber += increment
          requestAnimationFrame(animate)
        } else {
          this.currentNumber = target
        }
      }
      animate()
    }
  },
  mounted() {
    this.currentNumber = this.value
  }
}
</script>

<style>
.jump-enter-active, .jump-leave-active {
  transition: all 0.3s ease;
  display: inline-block;
}
.jump-enter, .jump-leave-to {
  transform: translateY(-20px);
  opacity: 0;
}
.digit {
  display: inline-block;
  min-width: 1em;
  text-align: center;
}
</style>

方法二:使用第三方库 vue-count-to

vue-count-to 是专门为 Vue 开发的数字动画组件:

安装依赖:

vue实现数字跳动

npm install vue-count-to

使用示例:

<template>
  <count-to :start-val="0" :end-val="target" :duration="2000"></count-to>
</template>

<script>
import CountTo from 'vue-count-to'
export default {
  components: { CountTo },
  data() {
    return {
      target: 1000
    }
  }
}
</script>

方法三:纯 CSS 动画结合 Vue

通过 CSS @keyframes 实现跳动效果:

vue实现数字跳动

<template>
  <div class="animated-number">{{ currentNumber }}</div>
</template>

<script>
export default {
  props: ['value'],
  data() {
    return {
      currentNumber: 0
    }
  },
  watch: {
    value(newVal) {
      this.animateNumber(newVal)
    }
  },
  methods: {
    animateNumber(target) {
      const duration = 1000
      const start = this.currentNumber
      const frames = duration / 16
      const increment = (target - start) / frames

      let frame = 0
      const animate = () => {
        if (frame < frames) {
          this.currentNumber = Math.floor(start + (increment * frame))
          frame++
          requestAnimationFrame(animate)
        } else {
          this.currentNumber = target
        }
      }
      animate()
    }
  },
  mounted() {
    this.currentNumber = this.value
  }
}
</script>

<style>
.animated-number {
  animation: jump 0.5s ease;
}
@keyframes jump {
  0% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
  100% { transform: translateY(0); }
}
</style>

方法四:使用 GSAP 实现高级动画

GSAP 提供更强大的动画控制:

安装 GSAP:

npm install gsap

实现代码:

<template>
  <div ref="numberEl">{{ currentNumber }}</div>
</template>

<script>
import { gsap } from 'gsap'
export default {
  props: ['value'],
  data() {
    return {
      currentNumber: 0
    }
  },
  watch: {
    value(newVal) {
      this.animateWithGSAP(newVal)
    }
  },
  methods: {
    animateWithGSAP(target) {
      gsap.to(this, {
        duration: 1,
        currentNumber: target,
        ease: "elastic.out(1, 0.3)",
        onUpdate: () => {
          this.currentNumber = Math.floor(this.currentNumber)
        }
      })
    }
  },
  mounted() {
    this.currentNumber = this.value
  }
}
</script>

实现要点

  1. 性能考虑:使用 requestAnimationFrame 实现平滑动画
  2. 数字格式化:可以结合 filters 或 computed 属性格式化显示
  3. 响应式设计:确保组件能响应 prop 变化
  4. 可配置性:通过 props 暴露动画持续时间、缓动函数等参数
  5. 浏览器兼容性:考虑降级方案确保在不支持动画的浏览器中正常显示

以上方法可根据具体需求选择,简单场景推荐方法一或方法二,复杂动画建议使用方法四。

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

相关文章

vue 实现在线预览

vue 实现在线预览

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

vue 实现弹幕

vue 实现弹幕

vue 实现弹幕的方法 使用 CSS 动画和动态渲染 在 Vue 中实现弹幕效果,可以通过动态渲染弹幕元素并结合 CSS 动画实现。以下是具体步骤: 数据准备 创建一个数组存储弹幕数据,每条弹幕包…

vue computed实现

vue computed实现

计算属性的基本用法 在Vue中,计算属性通过computed选项定义,用于声明依赖于其他属性的动态值。计算属性基于它们的依赖进行缓存,只有依赖发生变化时才会重新计算。 new Vue({ dat…

vue实现监听

vue实现监听

监听数据变化 在Vue中,可以通过watch选项或$watch方法监听数据的变化。watch适用于组件选项内声明式监听,$watch适用于动态监听。 // 选项式API export default…

vue 实现滑动

vue 实现滑动

Vue 实现滑动效果的方法 在Vue中实现滑动效果可以通过多种方式,以下是几种常见的方法: 使用CSS过渡和动画 通过Vue的<transition>组件结合CSS过渡或动画实现滑动效果…

vue 实现报价

vue 实现报价

Vue 实现报价功能 在 Vue 中实现报价功能通常涉及前端表单交互、数据计算和与后端 API 的通信。以下是实现报价功能的几种常见方法: 表单设计与数据绑定 使用 Vue 的 v-model 指…