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扩展分享
Mar 10 Javascript
使用jQuery和Bootstrap实现多层、自适应模态窗口
Dec 22 Javascript
javascript求日期差的方法
Mar 02 Javascript
前端js文件合并的三种方式推荐
May 19 Javascript
Angular 应用技巧总结
Sep 14 Javascript
JavaScript之DOM插入更新删除_动力节点Java学院整理
Jul 03 Javascript
原生JS实现ajax与ajax的跨域请求实例
Dec 01 Javascript
JS实现获取毫秒值及转换成年月日时分秒的方法
Aug 15 Javascript
mpvue 单文件页面配置详解
Dec 02 Javascript
Webpack4 使用Babel处理ES6语法的方法示例
Mar 07 Javascript
fastadmin中调用js的方法
May 14 Javascript
vue从零实现一个消息通知组件的方法详解
Mar 16 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连接Access数据库的方法小结
2013/06/20 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
php格式化时间戳
2016/12/17 PHP
PHP 图片处理
2020/09/16 PHP
PHP7 新增功能
2021/03/09 PHP
彻底搞懂JS无缝滚动代码
2007/01/03 Javascript
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
jquery ui dialog实现弹窗特效的思路及代码
2013/08/03 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
JS 使用for循环遍历子节点查找元素
2014/09/06 Javascript
jquery获取当前元素索引值用法实例
2015/06/10 Javascript
jQuery解析Json实例详解
2015/11/24 Javascript
jQuery展示表格点击变色、全选、删除
2017/01/05 Javascript
javascript中json对象json数组json字符串互转及取值方法
2017/04/19 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
详解Webpack如何引入CDN链接来优化编译后的体积
2019/06/21 Javascript
JS实现瀑布流效果
2020/03/07 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
vue实现PC端分辨率适配操作
2020/08/03 Javascript
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
python装饰器原理与用法深入详解
2019/12/19 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
HTML如何让IMG自动适应DIV容器大小的实现方法
2020/02/25 HTML / CSS
品管员岗位职责
2013/11/10 职场文书
乡镇民主生活会发言材料
2014/10/20 职场文书
后备干部推荐材料
2014/12/24 职场文书
早上好问候语大全
2015/11/10 职场文书
2016三严三实专题教育活动心得体会
2016/01/06 职场文书
优秀范文:《但愿人长久》教学反思3篇
2019/10/24 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
jQuery实现影院选座订座效果
2021/04/13 jQuery
MySQL空间数据存储及函数
2021/09/25 MySQL