今天教你做**数字变化效果  手把手教你完成数字动态变化显示效果

访客4年前黑客文章466

1.目标

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

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

2.基本原理

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

577842-20190718072804917-1649327667.png

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

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@sin *** 
    *
    * @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);

效果如下:
577842-20190718074056070-1155752829.gif

5.源码下载:

关注时间维度公众号,回复"动态数字"即可获得。

相关文章

苹果手机怎么设置动态壁纸?iPhone 怎么自制动态壁纸

苹果手机怎么设置动态壁纸?iPhone 怎么自制动态壁纸

很多小伙伴都在哎妹每周五发壁纸的时候,求一些动态壁纸,那哎妹今天就来教你们怎么自己制作动态壁纸吧! intoLive 动态墙纸 在苹果商店中搜索 intoLive ,点击下载, 下载完成后打开...

全国疫情实时动态最新 2月19日全国新冠肺炎确诊病例死亡人数通报

2月18日0—24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增确诊病例1749例,新增重症病例236例,新增死亡病例136例(湖北132例,黑龙江、山东、广东、贵州各1例),新增疑似病例1...

,动态全面小康之年 中国小康扶贫星耀计划启动!

,动态全面小康之年 中国小康扶贫星耀计划启动!

中国小康网6月6日电6月6日,在直播电商之都的先行示范区-广州花都区创美金谷直播产业园,全国第一个以城市为平台的直播带货节——“首届直播节(中国·广州)”开幕。在直播节创美金谷分会场启动仪式上, “中...

舒兰市委书记免职怎么回事?吉林舒兰疫情最新消息动态

舒兰市委书记免职怎么回事?吉林舒兰疫情最新消息动态

据吉林日报消息,吉林省委决定,吉林市副市长张静辉兼任舒兰市委书记;免去李鹏飞同志舒兰市委书记职务。目前舒兰是全国唯一的疫情高风险地区。 两省超过8000人被隔离 14日,31省区市和新疆生产建...

获取用户,你需要一个合适且动态的获取计划

获取用户,你需要一个合适且动态的获取计划

只有把每一个环节都做好,才气够让你的初创企业实现大幅康健增长,得到竞争优势,打败其他初创企业。 “你规划通过什么要领来获取用户?” 作为一位市场营销人员,我曾经不止一次从别人口中听到过这个问题。假如你...

2月20日全国疫情地图分布实时查询 2月20日各省疫情图最新数据动态

2月19日0—24时,31个省(自治区、直辖市)和新疆生产建设兵团报告新增确诊病例394例,新增死亡病例114例(湖北108例,河北、上海、福建、山东、云南、陕西各1例),新增疑似病例1277例。...