基于JS实现数字动态变化显示效果附源码


Posted in Javascript onJuly 18, 2019

先给大家展示下效果,感觉不错,可以参考实现代码,文末附有源码哦。

基于JS实现数字动态变化显示效果附源码

1.目标

以液晶电子表样式,动态变化的在指定元素内显示数字。

目标关键词:动态变化(定时器),指定元素(DOM元素ID),数字(number)
效果:多个页面元素中,均以动态效果显示不同的数字,可正可负。并动态改变至少一个元素内的数据。

2.基本原理

(1) 液晶电子表样式,找一种液晶电子表字体即可,无须使用别的绘制技巧。
 (2) 动态变化则通过使用定时器任务来完成,动态显示要确保变化足够的时长,因此,步长需要根据变化量来进行计算,本文默认变化频率为 50 毫秒一次,动态过程 2 秒(即 2000 毫秒),则变化次数为 40 次,因此步长为变化量除以 40 得到。

基于JS实现数字动态变化显示效果附源码

其余则均为规则约束与控制,如支持多元素隔离,动态变化的结束条件,步长计算的方向与时长控制等。

3.步步实现

3.1下载字体定义字体名称

最后提供的源码会包含字体文件。在css中定义字体名称以便样式引用。

@font-face {
 font-family: LEDFont;
 src: url("./UnidreamLED.ttf"); 
}

接下来定义显示数字的元素样式,其中便使用到刚定义的字体名称 LEDFont。

.dynanum{
 font-family: LEDFont;
 font-size: 48px;
 color:red;
 padding:10px;
 margin:10px;
 display:inline-block;
 width:200px;
 text-align:right;
 border:1px solid #bbbbff;
}

3.2接口定义

使用者能提供的就是有显示的 DOM元素ID,和要显示的数值,那这里向外提供的接口方法就出来了,形如:function (elementId, number)。

3.3支持多元素操作

为了支持多元素的简易操作,这里定义DOM元素ID与对象的映射变量。

var DynamicNumber = {};
DynamicNumber.NumberList = {};

3.4绘制的实现

直接代码说话。嗯,这里说明一下重点。对于实际绘制的对象,接口中以匿名函数的方式创建,在首次涉及到某DOM元素ID时进行创建。如果已经创建,则直接调用 render 方法,调用之前,除了设置新的目标数值,还会清除步长 step,表示需要重新计算步长,当然这些都是封装在接口内部,调用者不需要关心。

对于绘制方法 render,它所完成的是一步变化的绘制,期间进行结束条件的判断,并在 step 为 0 时进行步长的首次计算工作,最后再使用 setTimeout 启动下一步的定时任务。

详细代码及注释如下,欢迎留言交流。

/**
 * 在指定的 DOM 元素中动态显示数值
 * 作者:triplestudio@sina.com
 *
 * @param elementId :  DOM 元素ID
 * @param number  :  数值
 */
DynamicNumber.show = function (elementId, number) {
 // 1. 已建立过对象直接调用
 var dynaNum = this.NumberList[elementId];
 if (dynaNum) {
  dynaNum.step = 0;
  dynaNum.desNumber = number;
  dynaNum.render();
  return;
 }
 // 2. 创建动态数字绘制对象
 dynaNum = new function (_elementId) {
  this.elementId = _elementId;
  this.preNumber = 0; // 变化过程值
  this.desNumber = 0; // 目标数值,最终显示值
  this.step = 0;  // 变化步长,支持正向反向
  // 绘制过程
  this.render = function () {
   // (1)结束条件
   if (this.preNumber == this.desNumber) {
    this.step = 0;
    return;
   }
   // (2)步长设置(计划 2 秒完成 40*50=2000)
   if (this.step == 0) {
    this.step = Math.round((this.desNumber - this.preNumber) / 40);
    if (this.step == 0) this.step = (this.desNumber - this.preNumber > 0) ? 1 : -1;
   }
   // (3)走一步
   this.preNumber += this.step;
   if (this.step < 0) {
    if (this.preNumber < this.desNumber) this.preNumber = this.desNumber;
   } else {
    if (this.preNumber > this.desNumber) this.preNumber = this.desNumber;
   }
   // (4)显示
   document.getElementById(this.elementId).innerHTML = this.preNumber;
   // (5)每秒绘制 20 次(非精确值)
   var _this = this;
   setTimeout(function () { _this.render(); }, 50);
  };
 } (elementId);
 // 3. 登记绑定元素ID 
 DynamicNumber.NumberList[elementId] = dynaNum;
 // 4. 调用绘制
 dynaNum.step = 0;
 dynaNum.desNumber = number;
 dynaNum.render();
};

4.使用方式

如接口所定义,使用者只需要关心DOM元素ID与数值即可。这里,我们再用一个定时器,每5秒钟改变一个数值来看看值变化时的动态效果。

DynamicNumber.show("num1", 128);
DynamicNumber.show("num2", 12345);
DynamicNumber.show("num3", -8769);
DynamicNumber.show("num4", 987102);
DynamicNumber.show("num5", -30);
// 每 5 秒把 num1 中的数值改变
setInterval(function () { 
 DynamicNumber.show("num1", DynamicNumber.NumberList["num1"].desNumber + 300);
}, 5000);

源码下载:

https://github.com/triplestudio/helloworld/tree/master/dynamic_number?from=singlemessage&isappinstalled=0

总结

以上所述是小编给大家介绍的基于JS实现数字动态变化显示效果 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
文本加密解密
Jun 23 Javascript
jquery tablesorter.js 支持中文表格排序改进
Dec 09 Javascript
js中Math之random,round,ceil,floor的用法总结
Dec 26 Javascript
js设置cookie过期当前时间减去一秒相当于立即过期
Sep 04 Javascript
基于JavaScript实现移除(删除)数组中指定元素
Jan 04 Javascript
AngularJS 最常用的功能汇总
Feb 17 Javascript
AngularJS动态生成div的ID源码解析
Aug 29 Javascript
JS瀑布流实现方法实例分析
Dec 19 Javascript
原生JS实现 MUI导航栏透明渐变效果
Nov 07 Javascript
clipboard.js在移动端复制失败的解决方法
Jun 13 Javascript
vue使用nprogress加载路由进度条的方法
Jun 04 Javascript
处理JavaScript值为undefined的7个小技巧
Jul 28 Javascript
微信小程序实现拍照画布指定区域生成图片
Jul 18 #Javascript
vue使用video.js进行视频播放功能
Jul 18 #Javascript
百度小程序之间的页面通信过程详解
Jul 18 #Javascript
微信小程序如何获取群聊的openGid以及名称详解
Jul 17 #Javascript
vue+django实现一对一聊天功能的实例代码
Jul 17 #Javascript
微信小程序从注册账号到上架(图文详解)
Jul 17 #Javascript
js设置默认时间跨度过程详解
Jul 17 #Javascript
You might like
php递归遍历多维数组的方法
2015/04/18 PHP
php中switch语句用法详解
2015/08/17 PHP
PHP常用的三种设计模式
2017/02/17 PHP
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
如何让页面在打开时自动刷新一次让图片全部显示
2012/12/17 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
基于jQuery实现的图片切换焦点图整理
2014/12/07 Javascript
jQuery编程中的一些核心方法简介
2015/08/14 Javascript
Node.js静态文件服务器改进版
2016/01/10 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
JS实现旋转木马式图片轮播效果
2017/01/18 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
angularjs实现简单的购物车功能
2017/09/21 Javascript
JS实现获取word文档内容并输出显示到html页面示例
2018/06/23 Javascript
微信小程序适配iphoneX的实现方法
2018/09/18 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
js实现简单放大镜效果
2020/03/07 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
JS判断浏览器类型与操作系统的方法分析
2020/04/30 Javascript
解决vue初始化项目一直停在downloading template的问题
2020/11/09 Javascript
[01:23]2014DOTA2国际邀请赛 球迷无处不在Ti现场世界杯受关注
2014/07/10 DOTA
[05:13]2018DOTA2亚洲邀请赛主赛事第二日战况回顾 LGD、VG双雄携手晋级
2018/04/05 DOTA
[01:19:33]DOTA2-DPC中国联赛 正赛 iG vs VG BO3 第一场 2月2日
2021/03/11 DOTA
在Python中实现贪婪排名算法的教程
2015/04/17 Python
Python实现的redis分布式锁功能示例
2018/05/29 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python dict 相同key 合并value的实例
2019/01/21 Python
如何让Java程序执行效率更高
2014/06/25 面试题
C#公司笔试题
2014/03/28 面试题
群众路线领导对照材料
2014/08/23 职场文书
信用卡工资证明格式
2014/09/13 职场文书
故意伤害人身损害赔偿协议书
2014/11/19 职场文书
汽车销售员岗位职责
2015/04/11 职场文书
2016年6.5世界环境日宣传活动总结
2016/04/01 职场文书