返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue3基于countUp.js实现数字滚动的插件
  • 321
分享到

Vue3基于countUp.js实现数字滚动的插件

Vue3countUp.js数字滚动Vue3数字滚动 2023-05-17 05:05:56 321人浏览 泡泡鱼
摘要

目录countUp 简介countUp 组件封装文末countUp 简介 CountUp.js 是一种无依赖项的轻量级 javascript 类,可用于快速创建以更有趣的方式显示数字

countUp 简介

CountUp.js 是一种无依赖项的轻量级 javascript 类,可用于快速创建以更有趣的方式显示数字数据的动画。CountUp 可以在两个方向上进行计数,具体取决于传递的开始和结束值。

虽然现在市面上基于 countUp.js 二次封装的Vue组件不在少数, 但我个人是不太喜欢使用这些第三方封装的,因为第三方组件的更新频率很难保证,也许作者只是一时兴起封装上传了, 并未打算继续维护,如果使用了 等于后续根本没有维护性了, 所以这种二次封装我推荐自行实现, 我们可以通过本次封装熟悉一下 vue3, ts 的语法

countUp 组件封装

首先进行安装

npm i countup.js

安装好之后新建文件 CountUp.vue , template部分很简单, 只需要一个span标签, 同时给span一个 ref='countupRef' 就完成了,首先引入 countup.js, 按住Ctrl鼠标左键点击Countup.js可以看到 d.ts文件, countUp.d.ts 如下

export interface CountUpOptions {
    startVal?: number;
    decimalPlaces?: number;
    duration?: number;
    useGrouping?: boolean;
    useIndianSeparators?: boolean;
    useEasing?: boolean;
    smartEasingThreshold?: number;
    smartEasingAmount?: number;
    separator?: string;
    decimal?: string;
    easingFn?: (t: number, b: number, c: number, d: number) => number;
    fORMattingFn?: (n: number) => string;
    prefix?: string;
    suffix?: string;
    numerals?: string[];
    enableScrollSpy?: boolean;
    scrollSpyDelay?: number;
    scrollSpyOnce?: boolean;
    onCompleteCallback?: () => any;
    plugin?: CountUpPlugin;
}
export declare interface CountUpPlugin {
    render(elem: htmlElement, formatted: string): void;
}
export declare class CountUp {
    private endVal;
    options?: CountUpOptions;
    version: string;
    private defaults;
    private rAF;
    private startTime;
    private remaining;
    private finalEndVal;
    private useEasing;
    private countDown;
    el: HTMLElement | HTMLInputElement;
    formattingFn: (num: number) => string;
    easingFn?: (t: number, b: number, c: number, d: number) => number;
    error: string;
    startVal: number;
    duration: number;
    paused: boolean;
    frameVal: number;
    once: boolean;
    constructor(target: string | HTMLElement | HTMLInputElement, endVal: number, options?: CountUpOptions);
    handleScroll(self: CountUp): void;
    
    private determineDirectionAndSmartEasing;
    start(callback?: (args?: any) => any): void;
    pauseResume(): void;
    reset(): void;
    update(newEndVal: string | number): void;
    count: (timestamp: number) => void;
    printValue(val: number): void;
    ensureNumber(n: any): boolean;
    validateValue(value: string | number): number;
    private resetDuration;
    formatNumber: (num: number) => string;
    easeOutExpo: (t: number, b: number, c: number, d: number) => number;
}

这里 export 了一个 CountUp 类 还有一个 CountUpOptions 的interface, CountUp 类的 constructor 接收三个参数, 分别是 dom节点, endVal, 以及 options, 我们将这三个参数当成是 props 传入同时给定默认值, , 首先获取span的ref作为 countUp初始化的容器 , 定义一个变量 numAnim 接收 new CountUp(countupRef.value, props.end, props.options) 的返回值, , 在 onMounted中初始化countUp.js,接着我们就可以去页面引入 CountUp.vue 看看效果,因为有默认值,所以我们不需要传入任何参数, 直接看就好了, 此时CountUp.vue组件代码如下,

<script setup lang="ts">
  import { CountUp } from 'countup.js'
  import type { CountUpOptions } from 'countup.js'
  import { onMounted, ref } from 'vue'

  let numAnim = ref(null) as any
  const countupRef = ref()
  const props = defineProps({
    end: {
      type: Number,
      default: 2023
    },
    options: {
      type: Object,
      default() {
        let options: CountUpOptions = {
          startVal: 0, // 开始的数字  一般设置0开始
          decimalPlaces: 2, // number类型 小数位,整数自动添.00
          duration: 2, // number类型 动画延迟秒数,默认值是2
          useGrouping: true, // boolean类型  是否开启逗号,默认true(1,000)false(1000)
          useEasing: true,  // booleanl类型 动画缓动效果(ease),默认true
          smartEasingThreshold: 500, // numberl类型 大于这个数值的值开启平滑缓动
          smartEasingAmount: 300, // numberl类型
          separator: ',',// string 类型 分割用的符号
          decimal: '.', // string 类型  小数分割符合
          prefix: '¥', // sttring 类型  数字开头添加固定字符
          suffix: '元', // sttring类型 数字末尾添加固定字符
          numerals: []  // Array类型 替换从0到9对应的字,也就是自定数字字符了,数组存储
        }
        return options
      }
    }
  })
  onMounted(() => {
    initCount()
  })
  const initCount = () => {
    numAnim = new CountUp(countupRef.value, props.end, props.options)
    numAnim.start()
  }
</script>

<template>
  <span ref="countupRef"></span>
</template>

这时我们发现,在 onMounted 执行之后, 如果我们的endVal值发生了改动, 由于 CountUp.vueonMounted 已经完成,并不会同步修改, 如果我们的值是异步获取的,会造成渲染不出我们想要的结果,那么我们就需要在组件中把这个 initCount 方法给暴露给父组件使用,在vue3中,我们只需要使用 defineExpose 暴露即可, 同时我们也进一步完善一下我们的props, 校验限制一下传入的optinos值, 尽量避免使用上的错误, 同时修改一下默认值,避免造成一些问题,最终的代码如下

<script setup lang="ts">
  import { CountUp } from 'countup.js'
  import type { CountUpOptions } from 'countup.js'
  import { onMounted, ref } from 'vue'

  let numAnim = ref(null) as any
  const countupRef = ref()
  const props = defineProps({
    end: {
      type: Number,
      default: 0
    },
    options: {
      type: Object,
      validator(option: Object) {
        let keys = ['startVal', 'decimalPlaces', 'duration', 'useGrouping', 'useEasing', 'smartEasingThreshold', 'smartEasingAmount', 'separator', 'decimal', 'prefix', 'suffix', 'numerals']
        for (const key in option) {
          if (!keys.includes(key)) {
            console.error(" CountUp 传入的 options 值不符合 CountUpOptions")
            return false
          }
        }
        return true
      },
      default() {
        let options: CountUpOptions = {
          startVal: 0, // 开始的数字  一般设置0开始
          decimalPlaces: 2, // number类型 小数位,整数自动添.00
          duration: 2, // number类型 动画延迟秒数,默认值是2
          useGrouping: true, // boolean类型  是否开启逗号,默认true(1,000)false(1000)
          useEasing: true,  // booleanl类型 动画缓动效果(ease),默认true
          smartEasingThreshold: 500, // numberl类型 大于这个数值的值开启平滑缓动
          smartEasingAmount: 300, // numberl类型
          separator: ',',// string 类型 分割用的符号
          decimal: '.', // string 类型  小数分割符合
          prefix: '', // sttring 类型  数字开头添加固定字符
          suffix: '', // sttring类型 数字末尾添加固定字符
          numerals: []  // Array类型 替换从0到9对应的字,也就是自定数字字符了,数组存储
        }
        return options
      }
    }
  })
  onMounted(() => {
    initCount()
  })
  const initCount = () => {
    numAnim = new CountUp(countupRef.value, props.end, props.options)
    numAnim.start()
  }

  defineExpose({
    initCount
  })
</script>

<template>
  <span ref="countupRef"></span>
</template>

<style scoped lang='sCSS'></style>

文末

至此,CountUp 的组件开发已经完成了,后续我们也可以根据自己的项目需求自行去调整组件。 这里是拿了一个很简单的 countUp 组件举了一个简单例子,有的时候自己动手丰衣足食,很多插件的封装比想象中简单的多。

到此这篇关于Vue3基于countUp.js实现数字滚动的插件的文章就介绍到这了,更多相关Vue3 countUp.js数字滚动内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue3基于countUp.js实现数字滚动的插件

本文链接: https://lsjlt.com/news/210656.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Vue3基于countUp.js实现数字滚动的插件
    目录countUp 简介countUp 组件封装文末countUp 简介 CountUp.js 是一种无依赖项的轻量级 JavaScript 类,可用于快速创建以更有趣的方式显示数字...
    99+
    2023-05-17
    Vue3 countUp.js数字滚动 Vue3 数字滚动
  • 基于Vue3定制复杂组件滚动条的实现
    目录⛸️ 怎样定制复杂组件的自定义滚动条?原生滚动条样式一言难尽寻找简单的解决方案Use Scrollbars 的诞生使用示例⛸️ 怎样定制复杂组件的自定义滚动条? 原生滚动条样式一...
    99+
    2023-05-18
    Vue3定制复杂组件滚动条 Vue3复杂组件 Vue3组件
  • 基于Vue3实现无限滚动组件的示例代码
    目录为什么还要使用无限滚动组件无限滚动的优点无限滚动的缺点主要分为三个部分1.模拟 API 调用2.制作我们的内容组件3.显示我们的内容4.Vue3 无限滚动如果你在社交媒体上停留的...
    99+
    2024-04-02
  • 基于Vue3实现列表虚拟滚动效果
    目录前言完成效果思路和需要解决的问题vue3+setup 写的组件使用组件前言 近期在做一个网页播放器项目中,用到很多需要展示歌单的列表 一个歌单动辄千百首歌曲,页面中的元素太多导致...
    99+
    2024-04-02
  • vue3实现数字滚动特效实例详解
    目录前言思路文件目录使用示例入口文件index.jsmain.js使用requestAnimationFrame.js思路完整代码:CountTo.vue组件思路总结前言 vue3不...
    99+
    2024-04-02
  • 基于python实现MUI区域滚动
    目录1、前言2、问题描述3、解决方案4、结语本文转自微信公众号:"算法与编程之美"   Python用HBuilder创建交流社区APP   基于Python实现...
    99+
    2024-04-02
  • vue3数据可视化实现数字滚动特效代码
    目录前言思路文件目录使用示例入口文件index.jsmain.js使用requestAnimationFrame.js思路完整代码:CountTo.vue组件思路总结前言 vue3不...
    99+
    2024-04-02
  • 基于zepto插件如何实现移动端无缝向上滚动并上下触摸滑动
    这篇文章将为大家详细讲解有关基于zepto插件如何实现移动端无缝向上滚动并上下触摸滑动,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。HTML部分:<!DOCTYPE...
    99+
    2024-04-02
  • 关于实现Vue3版抖音滑动插件踩坑指南
    目录起步调研实现思路工程构建代码实现video实现slide.vue组合使用视频自动播放问题git地址总结起步 年前单位需要搞一个类似抖音的需求,这本应是客户端的任务,然而,不知天高...
    99+
    2024-04-02
  • 基于Vue实现卡片无限滚动动画
    目录概要设计详细设计进阶功能功能分析概要设计详细设计完整代码概要设计 设置css的animation在适当的时间点重置动画来现实视觉上无限滚动的效果。 详细设计 计算动画中所需预设的...
    99+
    2024-04-02
  • Vue transition组件简单实现数字滚动
    目录实现效果Scrip布局动画逻辑控制总结实现效果 Scrip <template> <button @click="addCount">点我滚动数字&...
    99+
    2024-04-02
  • jQuery如何实现marquee无缝滚动的插件
    这篇文章给大家分享的是有关jQuery如何实现marquee无缝滚动的插件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码如下: jQuery.fn.extend({ &nbs...
    99+
    2024-04-02
  • 基于vue如何实现tree插件
    这篇文章将为大家详细讲解有关基于vue如何实现tree插件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。iview提供的控件iview已经很成熟了,如果说我写的控件和iv...
    99+
    2024-04-02
  • 基于Vue3实现数字华容道游戏的示例代码
    目录前言环境思路实现GameCntGameToolGamePassGameTipMenu最后前言 恰逢春之四月,天气忽热忽凉,遇游戏大赛,以笨拙之技,书一篇小文。 游戏规则:存在n*...
    99+
    2024-04-02
  • Flutter实现滚动选择数字
    本文实例为大家分享了Flutter实现滚动选择数字的具体代码,供大家参考,具体内容如下 前言 本来想百度查的,结果没查到,只有自己写,顺便记录一下,加深印象 页面需求要用户输入页码,...
    99+
    2024-04-02
  • Vue组件实现数字滚动抽奖效果
    本文实例为大家分享了Vue组件实现数字滚动抽奖效果的具体代码,供大家参考,具体内容如下 可调整数字滚动速度,可指定开奖延迟时间,可指定开奖数字,按个人需求自行改动(录了个效果供参考,...
    99+
    2024-04-02
  • React如何实现数字滚动组件numbers-scroll
    本篇内容主要讲解“React如何实现数字滚动组件numbers-scroll”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“React如何实现数字滚动组件numbers-scroll”吧!首先给大...
    99+
    2023-07-05
  • 基于iScroll如何实现内容滚动效果
    这篇文章主要介绍基于iScroll如何实现内容滚动效果,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、iScroll简介iScroll 是一款针对web app使用的滚动控件,它可...
    99+
    2024-04-02
  • 基于vue实现循环滚动列表功能
    注意:需要给父容器一个height和:data='Array'和overfolw:hidden;左右滚动需要给ul容器一个初始化 css width。 先来介绍该组件的用法: 1.安...
    99+
    2024-04-02
  • 基于vue-seamless-scroll实现无缝滚动效果
    vue中,基于vue-seamless-scroll无缝滚动,供大家参考,具体内容如下 1、安装vue-seamless-scroll npm install vue-seamles...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作