当前位置:首页 > VUE

vue实现数字过渡动画

2026-01-22 22:49:37VUE

Vue 数字过渡动画实现方法

使用 transition 和动态数据绑定

通过 Vue 的 transition 组件结合数据绑定实现数字变化时的过渡效果。定义数字变量,使用计算属性或方法动态更新数值。

<template>
  <div>
    <transition name="fade" mode="out-in">
      <span :key="currentNumber">{{ currentNumber }}</span>
    </transition>
    <button @click="increment">增加</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentNumber: 0
    };
  },
  methods: {
    increment() {
      this.currentNumber += 1;
    }
  }
};
</script>

<style>
.fade-enter-active, .fade-leave-active {
  transition: opacity 0.5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

使用第三方库如 Tween.js

引入 Tween.js 实现平滑的数字过渡动画。通过补间动画让数字变化更加流畅。

vue实现数字过渡动画

<template>
  <div>
    <span>{{ animatedNumber }}</span>
    <button @click="startAnimation">开始动画</button>
  </div>
</template>

<script>
import TWEEN from '@tweenjs/tween.js';

export default {
  data() {
    return {
      number: 0,
      animatedNumber: 0
    };
  },
  methods: {
    startAnimation() {
      new TWEEN.Tween({ value: this.number })
        .to({ value: 100 }, 1000)
        .onUpdate(obj => {
          this.animatedNumber = obj.value.toFixed(0);
        })
        .start();

      function animate() {
        requestAnimationFrame(animate);
        TWEEN.update();
      }
      animate();
    }
  }
};
</script>

使用 vue-count-to 插件

安装 vue-count-to 插件,快速实现数字过渡效果。该插件提供了丰富的配置选项。

vue实现数字过渡动画

npm install vue-count-to
<template>
  <div>
    <countTo :startVal="0" :endVal="100" :duration="2000"></countTo>
  </div>
</template>

<script>
import countTo from 'vue-count-to';

export default {
  components: { countTo }
};
</script>

自定义指令实现数字动画

通过自定义指令监听数字变化,触发动画效果。适用于需要高度定制的场景。

<template>
  <div>
    <span v-number-animation="currentNumber"></span>
    <button @click="currentNumber += 10">增加</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentNumber: 0
    };
  },
  directives: {
    numberAnimation: {
      bind(el, binding) {
        let animationDuration = 1000;
        let frameDuration = 1000 / 60;
        let totalFrames = Math.round(animationDuration / frameDuration);
        let easeOutQuad = t => t * (2 - t);

        let current = 0;
        let target = binding.value;
        let increment = (target - current) / totalFrames;

        let animate = () => {
          current += increment;
          el.textContent = Math.floor(current);

          if (current < target) {
            requestAnimationFrame(animate);
          } else {
            el.textContent = target;
          }
        };

        animate();
      },
      update(el, binding) {
        let animationDuration = 1000;
        let frameDuration = 1000 / 60;
        let totalFrames = Math.round(animationDuration / frameDuration);
        let easeOutQuad = t => t * (2 - t);

        let current = parseFloat(el.textContent) || 0;
        let target = binding.value;
        let increment = (target - current) / totalFrames;

        let animate = () => {
          current += increment;
          el.textContent = Math.floor(current);

          if (current < target) {
            requestAnimationFrame(animate);
          } else {
            el.textContent = target;
          }
        };

        animate();
      }
    }
  }
};
</script>

使用 CSS 动画结合 Vue

通过 CSS 关键帧动画与 Vue 数据绑定结合,实现数字过渡效果。

<template>
  <div>
    <span class="number" :class="{ animate: isAnimating }">{{ currentNumber }}</span>
    <button @click="changeNumber">变化数字</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      currentNumber: 0,
      isAnimating: false
    };
  },
  methods: {
    changeNumber() {
      this.isAnimating = true;
      setTimeout(() => {
        this.currentNumber += Math.floor(Math.random() * 100);
        this.isAnimating = false;
      }, 500);
    }
  }
};
</script>

<style>
.number {
  display: inline-block;
}
.animate {
  animation: pulse 0.5s;
}
@keyframes pulse {
  0% { transform: scale(1); }
  50% { transform: scale(1.2); }
  100% { transform: scale(1); }
}
</style>

以上方法涵盖了从简单到复杂的数字过渡动画实现,可根据项目需求选择合适的方式。

标签: 数字动画
分享给朋友:

相关文章

vue 实现数字求和

vue 实现数字求和

Vue 实现数字求和的方法 在 Vue 中实现数字求和可以通过多种方式完成,以下是几种常见的实现方法: 使用计算属性(Computed) 计算属性适合处理响应式数据的求和逻辑,当依赖的数据变化时,会…

vue实现数字求和

vue实现数字求和

实现数字求和的方法 在Vue中实现数字求和可以通过多种方式完成,以下是几种常见的方法: 使用计算属性(Computed Property) 计算属性适合处理响应式数据的求和,当依赖的数据变化时,求…

vue组件实现动画

vue组件实现动画

Vue 组件实现动画的方法 Vue 提供了多种方式实现组件动画,主要包括内置的 <transition> 和 <transition-group> 组件,以及结合 CSS 或…

vue实现数字翻页递增

vue实现数字翻页递增

Vue 实现数字翻页递增效果 实现数字翻页递增效果可以通过 Vue 的过渡动画和动态数据绑定完成。以下是具体实现方法: 基本实现思路 使用 Vue 的 transition 组件结合 CSS 动画,…

vue实现页面载入动画

vue实现页面载入动画

Vue 实现页面载入动画的方法 使用 CSS 动画和 Vue 生命周期钩子 在 Vue 组件的 mounted 或 created 钩子中触发动画效果,结合 CSS 动画或过渡实现平滑的载入效果。C…

vue实现资源加载动画

vue实现资源加载动画

实现资源加载动画的方法 在Vue中实现资源加载动画可以通过多种方式完成,以下是几种常见的方法: 使用CSS动画和Vue条件渲染 通过Vue的v-if或v-show指令控制加载动画的显示与隐藏。结合…