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 相关文章推荐
JS中==与===操作符的比较
Mar 21 Javascript
javascript操作referer详细解析
Mar 10 Javascript
node.js超时timeout详解
Nov 26 Javascript
js对象继承之原型链继承实例
Jan 10 Javascript
PHPExcel中的一些常用方法汇总
Jan 23 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
Mar 06 Javascript
深入浅析JS的数组遍历方法(推荐)
Jun 15 Javascript
Angular实现表单验证功能
Nov 13 Javascript
webpack构建的详细流程探底
Jan 08 Javascript
jQuery中each方法的使用详解
Mar 18 jQuery
React 使用browserHistory项目访问404问题解决
Jun 01 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学习笔记之三 数据库基本操作
2011/01/17 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
PHP里的中文变量说明
2011/07/23 PHP
php后退一页表单内容保存实现方法
2012/06/17 PHP
Laravel日志用法详解
2016/10/09 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
php实现网页上一页下一页翻页过程详解
2019/06/28 PHP
用JavaScript脚本实现Web页面信息交互
2006/12/21 Javascript
js tab 选项卡
2009/04/26 Javascript
关于删除时的提示处理(确定删除吗)
2013/11/03 Javascript
常用jQuery选择器总结
2014/07/11 Javascript
浅析Node.js 中 Stream API 的使用
2015/10/23 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
Javascript的表单验证-初识正则表达式
2016/03/18 Javascript
js基于setTimeout与setInterval实现多线程
2016/06/17 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
vue环形进度条组件实例应用
2018/10/10 Javascript
js实现一个简易计算器
2020/03/30 Javascript
在Django的模型中添加自定义方法的示例
2015/07/21 Python
基于Python 装饰器装饰类中的方法实例
2018/04/21 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python3 实现一行输入,空格隔开的示例
2018/11/14 Python
python 获取字典键值对的实现
2020/11/12 Python
CSS3实现鼠标悬停显示扩展内容
2016/08/24 HTML / CSS
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
阿迪达斯香港官网:adidas香港
2019/11/09 全球购物
linux面试题参考答案(11)
2016/11/26 面试题
大学生简历中个人的自我评价
2013/10/06 职场文书
领导接待方案
2014/03/13 职场文书
2014年工程部工作总结
2014/11/25 职场文书
2015年健康教育工作总结
2015/04/10 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android