countUp.js实现数字滚动效果


Posted in Javascript onOctober 18, 2019

本文实例为大家分享了countUp.js数字滚动效果展示的具体代码,供大家参考,具体内容如下

1. 概述

1.1 说明

在项目过程中,有时候需要动态的去展示一些数据的加载状态,如一个数字为10000,需要5秒时间滚动加载完成。此时使用countup.js就能够很方便的处理此类功能问题。

1.2 countup.js

countup.js是一个无依赖性、轻量级的javascript类,可用于快速创建动画,以更有趣的方式显示数字/数据。详见countup.js

1.3 countup.js使用

npm install countup  进行安装依赖

import CountUp from "countup"  在页面中引入

new CountUp(target, startVal, endVal, decimals, duration, options)

参数:

  • target: 目标元素的id  *必填
  • startVal:开始的值(从哪个值开始)  *必填
  • endVal:结束的值(滚动到哪个值结束)  *必填
  • decimals:小数位数,默认值为0  *可选
  • duration:动画持续时间,单位为秒,默认值为2  *可选
  • options:选项的可选对象  *可选

                     useEasing:true  --是否使用缓动动画,默认为缓动,可设置为false让其匀速

                     useGrouping:true --对数字进行分组,如12345,按三位一组变为类似12,345这样的

                     separator: ','  --分组时使用的分隔符默认是逗号

                      decimal: '.'  --小数点

                      prefix: ''  --添加前缀如12345,变为¥12345

                      suffix: ''  --添加后缀如12345 通过添加后缀变为12345$,12345元之类的

方法:

暂停/恢复      pauseResume
重置动画       reset
更新值           update(newVal)

2. 代码

2.1 源代码

var CountUp = function(target, startVal, endVal, decimals, duration, options) {
 var self = this;
 self.version = function() {
 return "1.9.2"
 };
 self.options = {
 useEasing: true,
 useGrouping: true,
 separator: ",",
 decimal: ".",
 easingFn: easeOutExpo,
 formattingFn: formatNumber,
 prefix: "",
 suffix: "",
 numerals: []
 };
 if (options && typeof options === "object") {
 for (var key in self.options) {
  if (options.hasOwnProperty(key) && options[key] !== null) {
  self.options[key] = options[key]
  }
 }
 }
 if (self.options.separator === "") {
 self.options.useGrouping = false
 } else {
 self.options.separator = "" + self.options.separator
 }
 var lastTime = 0;
 var vendors = ["webkit", "moz", "ms", "o"];
 for (var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
 window.requestAnimationFrame = window[vendors[x] + "RequestAnimationFrame"];
 window.cancelAnimationFrame = window[vendors[x] + "CancelAnimationFrame"] || window[vendors[x] + "CancelRequestAnimationFrame"]
 }
 if (!window.requestAnimationFrame) {
 window.requestAnimationFrame = function(callback, element) {
  var currTime = new Date().getTime();
  var timeToCall = Math.max(0, 16 - (currTime - lastTime));
  var id = window.setTimeout(function() {
  callback(currTime + timeToCall)
  },
  timeToCall);
  lastTime = currTime + timeToCall;
  return id
 }
 }
 if (!window.cancelAnimationFrame) {
 window.cancelAnimationFrame = function(id) {
  clearTimeout(id)
 }
 }
 function formatNumber(num) {
 num = num.toFixed(self.decimals);
 num += "";
 var x, x1, x2, x3, i, l;
 x = num.split(".");
 x1 = x[0];
 x2 = x.length > 1 ? self.options.decimal + x[1] : "";
 if (self.options.useGrouping) {
  x3 = "";
  for (i = 0, l = x1.length; i < l; ++i) {
  if (i !== 0 && ((i % 3) === 0)) {
   x3 = self.options.separator + x3
  }
  x3 = x1[l - i - 1] + x3
  }
  x1 = x3
 }
 if (self.options.numerals.length) {
  x1 = x1.replace(/[0-9]/g,
  function(w) {
  return self.options.numerals[ + w]
  });
  x2 = x2.replace(/[0-9]/g,
  function(w) {
  return self.options.numerals[ + w]
  })
 }
 return self.options.prefix + x1 + x2 + self.options.suffix
 }
 function easeOutExpo(t, b, c, d) {
 return c * ( - Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b
 }
 function ensureNumber(n) {
 return (typeof n === "number" && !isNaN(n))
 }
 self.initialize = function() {
 if (self.initialized) {
  return true
 }
 self.error = "";
 self.d = (typeof target === "string") ? document.getElementById(target) : target;
 if (!self.d) {
  self.error = "[CountUp] target is null or undefined";
  return false
 }
 self.startVal = Number(startVal);
 self.endVal = Number(endVal);
 if (ensureNumber(self.startVal) && ensureNumber(self.endVal)) {
  self.decimals = Math.max(0, decimals || 0);
  self.dec = Math.pow(10, self.decimals);
  self.duration = Number(duration) * 1000 || 2000;
  self.countDown = (self.startVal > self.endVal);
  self.frameVal = self.startVal;
  self.initialized = true;
  return true
 } else {
  self.error = "[CountUp] startVal (" + startVal + ") or endVal (" + endVal + ") is not a number";
  return false
 }
 };
 self.printValue = function(value) {
 var result = self.options.formattingFn(value);
 if (self.d.tagName === "INPUT") {
  this.d.value = result
 } else {
  if (self.d.tagName === "text" || self.d.tagName === "tspan") {
  this.d.textContent = result
  } else {
  this.d.innerHTML = result
  }
 }
 };
 self.count = function(timestamp) {
 if (!self.startTime) {
  self.startTime = timestamp
 }
 self.timestamp = timestamp;
 var progress = timestamp - self.startTime;
 self.remaining = self.duration - progress;
 if (self.options.useEasing) {
  if (self.countDown) {
  self.frameVal = self.startVal - self.options.easingFn(progress, 0, self.startVal - self.endVal, self.duration)
  } else {
  self.frameVal = self.options.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration)
  }
 } else {
  if (self.countDown) {
  self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration))
  } else {
  self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration)
  }
 }
 if (self.countDown) {
  self.frameVal = (self.frameVal < self.endVal) ? self.endVal: self.frameVal
 } else {
  self.frameVal = (self.frameVal > self.endVal) ? self.endVal: self.frameVal
 }
 self.frameVal = Math.round(self.frameVal * self.dec) / self.dec;
 self.printValue(self.frameVal);
 if (progress < self.duration) {
  self.rAF = requestAnimationFrame(self.count)
 } else {
  if (self.callback) {
  self.callback()
  }
 }
 };
 self.start = function(callback) {
 if (!self.initialize()) {
  return
 }
 self.callback = callback;
 self.rAF = requestAnimationFrame(self.count)
 };
 self.pauseResume = function() {
 if (!self.paused) {
  self.paused = true;
  cancelAnimationFrame(self.rAF)
 } else {
  self.paused = false;
  delete self.startTime;
  self.duration = self.remaining;
  self.startVal = self.frameVal;
  requestAnimationFrame(self.count)
 }
 };
 self.reset = function() {
 self.paused = false;
 delete self.startTime;
 self.initialized = false;
 if (self.initialize()) {
  cancelAnimationFrame(self.rAF);
  self.printValue(self.startVal)
 }
 };
 self.update = function(newEndVal) {
 if (!self.initialize()) {
  return
 }
 newEndVal = Number(newEndVal);
 if (!ensureNumber(newEndVal)) {
  self.error = "[CountUp] update() - new endVal is not a number: " + newEndVal;
  return
 }
 self.error = "";
 if (newEndVal === self.frameVal) {
  return
 }
 cancelAnimationFrame(self.rAF);
 self.paused = false;
 delete self.startTime;
 self.startVal = self.frameVal;
 self.endVal = newEndVal;
 self.countDown = (self.startVal > self.endVal);
 self.rAF = requestAnimationFrame(self.count)
 };
 if (self.initialize()) {
 self.printValue(self.startVal)
 }
};

2.1 代码示例

<!-- 数字滚动 -->
<template>
 <div id="numScroll" style="width: 200px;height: 200px;font-size: 30px;font-weight: bold;"></div>
</template>

<script>
 import CountUp from "countup"
 export default {
 name: "numberScroll.vue",
 mounted() {
 this.numberScroll()
 },
 methods: {
 numberScroll() {
 let count = new CountUp("numScroll", 0, 56565, 0, 5, {duration: 5, useEasing: false})
 if (!count.error) {
  count.start()
 } else {
  console.log(count.error)
 }
 }
 }
 }
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery简单体验
Jan 10 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
Aug 07 Javascript
jquery左右滚动焦点图banner图片鼠标经过显示上下页按钮
Oct 11 Javascript
jquery 实现返回顶部功能
Nov 17 Javascript
jQuery增加与删除table列的方法
Mar 01 Javascript
JavaScript入门教程之引用类型
May 04 Javascript
node.js从数据库获取数据
May 08 Javascript
JS获取一个表单字段中多条数据并转化为json格式
Oct 17 Javascript
微信小程序实现animation动画
Jan 26 Javascript
vscode下vue项目中eslint的使用方法
Jan 13 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
Aug 20 Javascript
vue页面切换项目实现转场动画的方法
Nov 12 Javascript
Vue-cli3项目引入Typescript的实现方法
Oct 18 #Javascript
细述Javascript的加法运算符的具体使用
Oct 18 #Javascript
ElementUI之Message功能拓展详解
Oct 18 #Javascript
js实现简易计算器功能
Oct 18 #Javascript
JavaScript实现更换背景图片
Oct 18 #Javascript
jquery轻量级数字动画插件countUp.js使用详解
Oct 17 #jQuery
CountUp.js数字滚动插件使用方法详解
Oct 17 #Javascript
You might like
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
Windows下php+mysql5.7配置教程
2017/05/16 PHP
js Flash插入函数免激活代码
2009/03/31 Javascript
深入认识javascript中的eval函数
2009/11/02 Javascript
event.srcElement 用法笔记e.target
2009/12/18 Javascript
TypeScript 学习笔记之基本类型
2015/06/19 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
JavaScript 数据类型详解
2017/03/13 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
解决Vue-cli npm run build生产环境打包,本地不能打开的问题
2018/09/20 Javascript
微信小程序五子棋游戏的悔棋实现方法【附demo源码下载】
2019/02/20 Javascript
Node.js从字符串生成文件流的实现方法
2019/08/18 Javascript
JS中作用域以及变量范围分析
2020/07/18 Javascript
vue缓存之keep-alive的理解和应用详解
2020/11/02 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
使用python实现knn算法
2017/12/20 Python
Python类装饰器实现方法详解
2018/12/21 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
使用Python的networkx绘制精美网络图教程
2019/11/21 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
OpenCV 使用imread()函数读取图片的六种正确姿势
2020/07/09 Python
HTML5的Geolocation地理位置定位API使用教程
2016/05/12 HTML / CSS
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
如何填写个人简历自我评价
2013/12/10 职场文书
一份报关员的职业规划范文
2014/01/08 职场文书
单位接收函格式
2015/01/30 职场文书
优秀团员自我评价
2015/03/10 职场文书
2015年学校安全管理工作总结
2015/05/11 职场文书
教师考核鉴定意见
2015/06/05 职场文书
四十年同学聚会致辞
2015/07/28 职场文书
TV动画《政宗君的复仇》第二季制作决定PV公布
2022/04/02 日漫
深入理解pytorch库的dockerfile
2022/06/10 Python