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相册效果代码(点击创建即可)
Apr 16 Javascript
js 日期比较相关天数代码
Apr 02 Javascript
JavaScript匿名函数与委托使用示例
Jul 22 Javascript
jQuery实现新消息闪烁标题提示的方法
Mar 11 Javascript
javascript动态添加删除tabs标签的方法
Jul 06 Javascript
详解AngularJS Filter(过滤器)用法
Dec 28 Javascript
7个jQuery最佳实践
Jan 12 Javascript
ajax分页效果(bootstrap模态框)
Jan 23 Javascript
React教程之Props验证的具体用法(Props Validation)
Sep 04 Javascript
React + webpack 环境配置的方法步骤
Sep 07 Javascript
vue keep-alive请求数据的方法示例
May 16 Javascript
JavaScript构造函数原理及实现流程解析
Nov 19 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 最大运行时间 max_execution_time修改方法
2010/03/08 PHP
php 截取字符串并以零补齐str_pad() 函数
2011/05/07 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
使用PHP编写发红包程序
2015/07/22 PHP
完美解决在ThinkPHP控制器中命名空间的问题
2017/05/05 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
javascript prototype,executing,context,closure
2008/12/24 Javascript
让页面上两个div中的滚动条(滑块)同步运动示例
2013/08/07 Javascript
js jq 单击和双击区分示例介绍
2013/11/05 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
激动人心的 Angular HttpClient的源码解析
2017/07/10 Javascript
记一次vue去除#问题处理经过小结
2019/01/24 Javascript
vue 实现小程序或商品秒杀倒计时
2019/04/14 Javascript
通过循环优化 JavaScript 程序
2019/06/24 Javascript
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
vue 获取url里参数的两种方法小结
2020/11/12 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
利用Python读取文件的四种不同方法比对
2017/05/18 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
pytorch 转换矩阵的维数位置方法
2018/12/08 Python
TensorFlow自定义损失函数来预测商品销售量
2020/02/05 Python
html5 canvas 实现光线沿不规则路径运动
2020/04/20 HTML / CSS
丝芙兰波兰:Sephora.pl
2018/03/25 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
中学生自我评价范文
2014/02/08 职场文书
餐厅筹备计划书
2014/04/25 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
教师考核评语大全
2014/12/31 职场文书
神龙架导游词
2015/02/11 职场文书
科技活动总结范文
2015/05/11 职场文书
2015年毕业实习工作总结
2015/05/29 职场文书
美丽的大脚观后感
2015/06/03 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书