Vue3+TS实现数字滚动效果CountTo组件

yizhihongxing

下面我将为您详细讲解“Vue3+TS实现数字滚动效果CountTo组件”的完整攻略。

1. 项目背景

数字滚动效果在 web 开发中经常用于展示数据增量或者倒计时情况,通过 CountTo 组件,我们可以方便地实现数字滚动动画效果。本文以 Vue3 和 TypeScript 的方式实现该组件。

2. 技术选型

CountTo 组件的实现需要使用到 Vue3 的响应式数据以及过渡动画效果,同时在实现过程中也需要考虑到代码的可维护性和可读性,因此我们选择使用 TypeScript 作为语言。

3. 实现方式

3.1. 安装依赖

首先,我们需要使用 Vue3,因此需要安装 @vue/cli 以及官方提供的 TypeScript 模板:

npm install -g @vue/cli
vue create --preset typescript my-project

在项目目录下安装 vue-typescript 对应插件以保证 TS 的正常使用:

npm install vue@next @vue/compiler-sfc @vue/runtime-core -D
npm install typescript ts-loader -D

3.2. 实现 CountTo 组件的 DOM 结构

CountTo 组件由多个数字组成,数字大小位置相同,只是数字内容不同,因此我们可以使用 Vue3 的 v-for 指令以及 :key 属性快速完成 CountTo 的 DOM 结构,CountTo 的模板代码如下:

<template>
  <div>
    <span v-for="(digit, index) in digits" :key="index" class="count-to-digit">
      {{ digit }}
    </span>
  </div>
</template>

3.3. 实现 CountTo 组件的动画效果

CountTo 的数字滚动效果需要运用到 Vue3 的过渡动画,我们需要使用 Vue3 的 Transition 组件,配合 CSS 过渡类名实现动画效果,CountTo 的动画效果代码如下:

<template>
  <div>
    <transition-group tag="span" name="count-to" class="count-to-container">
      <span v-for="(digit, index) in digits" :key="index" class="count-to-digit">
        {{ digit }}
      </span>
    </transition-group>
  </div>
</template>

<style>
.count-to-enter-active, .count-to-leave-active {
  transition: all 0.5s;
}
.count-to-enter, .count-to-leave-to {
  opacity: 0;
  transform: translateY(50%);
}
</style>

3.4. 实现 CountTo 组件的功能

在 CountTo 组件中,我们希望能够通过使用 props 接收传递过来的数字和动画持续时间,同时在 mounted 生命周期周期中开始数字的滚动动画。为了实现上述功能,我们还需要定义纯函数以完成 CountTo 组件的数字计算,并将计算结果绑定到 CountTo 的数据模型中,CountTo 组件的完整代码如下:

<template>
  <div>
    <transition-group tag="span" name="count-to" class="count-to-container">
      <span v-for="(digit, index) in digits" :key="index" class="count-to-digit">
        {{ digit }}
      </span>
    </transition-group>
  </div>
</template>

<script lang="ts">
import { defineComponent, ref, computed, onMounted } from 'vue';

export default defineComponent({
  props: {
    start: {
      type: Number,
      default: 0,
      required: true
    },
    end: {
      type: Number,
      default: 100,
      required: true
    },
    duration: {
      type: Number,
      default: 1000
    }
  },
  setup(props) {
    const digits = ref<Array<number>>([]);
    const intervalId = ref<NodeJS.Timeout | null>(null);

    /**
     * 计算 CountTo 组件的数字
     * @param progress 进度值
     */
    function calculateDigits(progress: number) {
      const numbers = Math.abs(props.end - props.start) + 1;
      const step = Math.floor((progress * numbers) / 100);

      digits.value = []
        .concat(props.start + step)
        .toString()
        .split('')
        .map((digit: string) => parseInt(digit));
    }

    /**
     * 开始数字滚动动画
     */
    function startAnimation() {
      let start = 0;

      intervalId.value = setInterval(() => {
        const progress = start / props.duration;

        if (progress < 1) {
          calculateDigits(progress * 100);
        } else {
          clearInterval(intervalId.value as NodeJS.Timeout);
          calculateDigits(100);
        }

        start += 10;
      }, 10);
    }

    onMounted(() => {
      if (props.start !== props.end) {
        startAnimation();
      } else {
        digits.value = [props.start];
      }
    });

    return {
      digits
    };
  }
});
</script>

<style>
.count-to-enter-active,
.count-to-leave-active {
  transition: all 0.5s;
}
.count-to-enter,
.count-to-leave-to {
  opacity: 0;
  transform: translateY(50%);
}
</style>

3.5. 使用 CountTo 组件

使用 CountTo 组件也非常简单,我们只需要传递 start、end 和 duration 三个 props 就可以完成数字滚动的动画效果。如下所示:

<template>
  <div class="container">
    <h1>CountTo Component Demo</h1>
    <div class="intro">
      Want to count from <strong>100</strong> to <strong>10</strong>, in <strong>3</strong> seconds?
    </div>
    <div class="demo">
      <count-to :start="100" :end="10" :duration="3000" />
    </div>
  </div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';
import CountTo from '@/components/CountTo.vue';

export default defineComponent({
  components: { CountTo }
});
</script>

<style scoped>
.container {
  display: flex;
  flex-direction: column;
  align-items: center;
}
.intro {
  margin-bottom: 20px;
}
.demo {
  font-size: 36px;
  font-weight: bold;
  color: #ff3e00;
  padding: 20px;
  border: 5px solid #ff3e00;
  border-radius: 5px;
}
</style>

4. 总结

通过以上我们可以发现 Vue3 和 TypeScript 配以过渡动画类名可以非常方便地实现数字滚动效果,同时对与高扩展、高可维护性有着很好的帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue3+TS实现数字滚动效果CountTo组件 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • 浅析Vue单文件组件与非单文件组件使用方法

    浅析Vue单文件组件与非单文件组件使用方法 Vue.js是目前非常热门的前端框架之一,其最大的特点是组件化。在Vue中组件是非常重要的概念之一,而Vue组件又分为单文件组件与非单文件组件。那么,我们如何选择使用单文件组件和非单文件组件呢? 非单文件组件的使用 非单文件组件一般是通过script标签直接将Vue组件定义在html文件中。下面是一个例子: &lt…

    Vue 2023年5月28日
    00
  • vue element-ui里的table中表头与表格出现错位的解决

    问题描述:在使用 vue element-ui 中的 table 组件时,如果表格中的数据太多,在滚动时表头和表格容易出现错位的问题。 解决方法:有两种方法可以解决这个问题: 方法一:通过设置样式来修复 可以通过设置表格容器的样式来解决表头和表格错位的问题。具体步骤如下: 在父容器中设置样式,设置为相对定位(position: relative); 在表格容…

    Vue 2023年5月28日
    00
  • vue components 动态组件详解

    Vue Components 动态组件详解 在Vue中,组件可以被并列或嵌套到其他组件中,形成一个视图层次结构。Vue提供了动态组件,可以根据不同的需要动态地渲染组件。本篇攻略将详细讲解Vue Components的动态组件,包括实现方式和示例代码。 动态组件的实现方式 在Vue中,动态组件有两种实现方式:基于标签和基于动态绑定。 基于标签的实现 标签是Vu…

    Vue 2023年5月27日
    00
  • 手拉手教你如何处理vue项目中的错误

    手拉手教你如何处理Vue项目中的错误 在开发Vue项目过程中,我们时常会遇到各种错误和异常情况。快速定位和解决问题有助于提高开发效率和代码健壮性,以下是处理Vue项目中出现错误的完整攻略。 1. 错误的分类 Vue项目中出现的错误大致可以分为些类型: 语法错误(Syntax errors) 运行时错误(Runtime errors),如传入无效数据,调用不存…

    Vue 2023年5月28日
    00
  • VUE的tab页面切换的四种方法

    VUE 是一款流行的 JavaScript 前端框架,用于构建交互式用户界面。在 VUE 中,tab 页面切换是常见的功能,以下是 VUE 中实现 tab 切换的四种方法的完整攻略。 1. 标准的 VUE 动态组件方法 我们可以使用标准的 VUE 动态组件方法,在模板中设置一个变量,然后根据变量的值确定要显示的组件。这种方法需要我们在 VUE 组件中定义所有…

    Vue 2023年5月27日
    00
  • Vue中的Strorage本地化存储详解

    Vue中的Storage本地化存储详解 在Vue中,为了提高Web应用程序的性能,我们通常会使用Storage本地化存储技术来存储和管理数据。Storage对象提供了一种存储键/值对的方式,可以通过键来获取、添加、删除以及查询存储的数据,它提供了两种类型:sessionStorage和localStorage,它们的区别在于存储数据的生命周期不同。 sess…

    Vue 2023年5月27日
    00
  • 使用electron将vue-cli项目打包成exe的方法

    下面是使用electron将vue-cli项目打包成exe的详细攻略: 1. 准备工作 在开始之前,你需要确保你的电脑已经安装了以下软件: Node.js npm包管理器 Vue CLI Git 其中,Node.js建议选择LTS版本,npm建议升级至最新版本。 2. 创建Vue项目 接下来,我们来创建一个Vue项目。在命令行中输入以下命令: vue cre…

    Vue 2023年5月28日
    00
  • 图文详解vue框架安装步骤

    图文详解Vue框架安装步骤 1. 确认运行环境 在安装Vue框架之前,需要先确认已经安装了node.js,并且其版本号为6以上。 可以通过以下命令来检查node.js的版本: node -v 如果确认已经安装了node.js,那么就可以继续进行后续的操作了。 2. 安装Vue CLI Vue CLI是专门用于Vue开发的脚手架工具,可以快速搭建Vue项目。 …

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部