那些H5用到的技术(6)——数字滚动特效
前言
会有这么一种情况,H5页面需要进行数字统计展示,以此来强调产品or工作的成果。如果只是静态显示一个数字,总是感觉生硬。对比如下: 

 
是不是瞬间高大上了呢? 
这个效果我是在开源中国上找到的 
https://www.oschina.net/code/snippet_2380148_52928 
感谢馒头同学。
原理


1、如上图可知,代码将每个数字生成了一竖0-9和小数点的队列。如果需要滚动999,那么就会生成3竖 
2、由于有height的限制,所以通过overflow: hidden;隐藏了其他已经滚动过的元素。 
3、通过transition、transform实现了从0滑动至设置数字动画效果,其中translateY的值是根据高度计算出来的
transform: translateY(-120px);
transition: 4s;
源码
css样式,数字的大小,高度,都需要手动设置
    /*数字滚动插件的CSS可调整样式*/
    .mt-number-animate {
        font-family: '微软雅黑';
        line-height: 40px;
        height: 40px;
        /*设置数字显示高度*/
        font-size: 25px;
        /*设置数字大小*/
        overflow: hidden;
        display: inline-block;
        position: relative;
    }
    .mt-number-animate .mt-number-animate-dot {
        width: 15px;
        /*设置分割符宽度*/
        line-height: 40px;
        float: left;
        text-align: center;
    }
    .mt-number-animate .mt-number-animate-dom {
        width: 20px;
        /*设置单个数字宽度*/
        text-align: center;
        float: left;
        position: relative;
        top: 0;
    }
    .mt-number-animate .mt-number-animate-dom .mt-number-animate-span {
        width: 100%;
        float: left;
    }
    .number-area {
        position: relative;
        top: 30%;
        line-height: 20px;
        color: white;
        width: 300px;
        margin: auto
    }
    @media max-width: .number-area .number {
        position: relative;
        width: 100%;
        /*height: 45px*/
    }
    .number-area .number div {
        float: left;
        margin-top: 5px;
    }
    .number-area .number p {
        float: left;
        line-height: 40px;
    }
JS
    /**
    *  by Mantou qq:676015863
    *  数字滚动插件 v1.0
    */
    ;
    (function($) {
        $.fn.numberAnimate = function(setting) {
            var defaults = {
                speed: 1000, //动画速度
                num: "", //初始化值
                iniAnimate: true, //是否要初始化动画效果
                symbol: '', //默认的分割符号,千,万,千万
                dot: 0 //保留几位小数点
            }
            //如果setting为空,就取default的值
            var setting = $.extend(defaults, setting);
            //如果对象有多个,提示出错
            if ($(this).length > 1) {
                alert("just only one obj!");
                return;
            }
            //如果未设置初始化值。提示出错
            if (setting.num == "") {
                alert("must set a num!");
                return;
            }
            var nHtml = '<div class="mt-number-animate-dom" data-num="{{num}}">\
            <span class="mt-number-animate-span">0</span>\
            <span class="mt-number-animate-span">1</span>\
            <span class="mt-number-animate-span">2</span>\
            <span class="mt-number-animate-span">3</span>\
            <span class="mt-number-animate-span">4</span>\
            <span class="mt-number-animate-span">5</span>\
            <span class="mt-number-animate-span">6</span>\
            <span class="mt-number-animate-span">7</span>\
            <span class="mt-number-animate-span">8</span>\
            <span class="mt-number-animate-span">9</span>\
            <span class="mt-number-animate-span">.</span>\
          </div>';
            //数字处理
            var numToArr = function(num) {
                num = parseFloat(num).toFixed(setting.dot);
                if (typeof(num) == 'number') {
                    var arrStr = num.toString().split("");
                } else {
                    var arrStr = num.split("");
                }
                //console.log(arrStr);
                return arrStr;
            }
            //设置DOM symbol:分割符号
            var setNumDom = function(arrStr) {
                var shtml = '<div class="mt-number-animate">';
                for (var i = 0, len = arrStr.length; i < len; i++) {
                    if (i != 0 && (len - i) % 3 == 0 && setting.symbol != "" && arrStr[i] != ".") {
                        shtml += '<div class="mt-number-animate-dot">' + setting.symbol + '</div>' + nHtml.replace("{{num}}", arrStr[i]);
                    } else {
                        shtml += nHtml.replace("{{num}}", arrStr[i]);
                    }
                }
                shtml += '</div>';
                return shtml;
            }
            //执行动画
            var runAnimate = function($parent) {
                $parent.find(".mt-number-animate-dom").each(function() {
                    var num = $(this).attr("data-num");
                    num = (num == "." ? 10 : num);
                    var spanHei = $(this).height() / 11; //11为元素个数
                    var thisTop = -num * spanHei + "px";
                    if (thisTop != $(this).css("top")) {
                        if (setting.iniAnimate) {
                            //HTML5不支持
                            if (!window.applicationCache) {
                                $(this).animate({
                                    top: thisTop
                                }, setting.speed);
                            } else {
                                $(this).css({
                                    'transform': 'translateY(' + thisTop + ')',
                                    '-ms-transform': 'translateY(' + thisTop + ')',
                                    /* IE 9 */
                                    '-moz-transform': 'translateY(' + thisTop + ')',
                                    /* Firefox */
                                    '-webkit-transform': 'translateY(' + thisTop + ')',
                                    /* Safari 和 Chrome */
                                    '-o-transform': 'translateY(' + thisTop + ')',
                                    '-ms-transition': setting.speed / 1000 + 's',
                                    '-moz-transition': setting.speed / 1000 + 's',
                                    '-webkit-transition': setting.speed / 1000 + 's',
                                    '-o-transition': setting.speed / 1000 + 's',
                                    'transition': setting.speed / 1000 + 's'
                                });
                            }
                        } else {
                            setting.iniAnimate = true;
                            $(this).css({
                                top: thisTop
                            });
                        }
                    }
                });
            }
            //初始化
            var init = function($parent) {
                //初始化
                $parent.html(setNumDom(numToArr(setting.num)));
                runAnimate($parent);
            };
            //重置参数
            this.resetData = function(num) {
                var newArr = numToArr(num);
                var $dom = $(this).find(".mt-number-animate-dom");
                if ($dom.length < newArr.length) {
                    $(this).html(setNumDom(numToArr(num)));
                } else {
                    $dom.each(function(index, el) {
                        $(this).attr("data-num", newArr[index]);
                    });
                }
                runAnimate($(this));
            }
            //init
            init($(this));
            return this;
        }
    })(jQuery);
使用方式
例如div的样式设为numberRun1
    $(".numberRun1").numberAnimate({
        num: '118368',
        speed: 2000,
        symbol: ","
    });
补充
CountUp.js
此方案只能定长的每个数字从0滑动到指定的数字,而不能直接从0滚动,如果这样动画就没法播了(除非播放完之后又从头开始,这样效率极低)。那么有没有方案实现从0滚动的滚动呢? 
 
见http://inorganik.github.io/countUp.js/ 
源码也只有200行 
https://github.com/inorganik/countUp.js/blob/master/countUp.js 
简单讲述一下原理 
1、通过递归requestAnimationFrame来计算增值 
2、通过toFixed精确小数点 
3、通过算法实现缓动效果 
4、通过正则/[0-9]/g实现了数字替换(可以改成别的字)
demo: 
https://leestar54.github.io/h5-demo/number_roll.html
那些H5用到的技术(6)——数字滚动特效的更多相关文章
- 数字滚动特效 NumScroll
		
1.使用前先引入jquery2.前端学习群:814798690 下载地址 https://github.com/chaorenzeng/jquery.numscroll.js.git 快速使用 1.引 ...
 - H5的本地存储技术及其与Cookie的比较
		
第一部分: H5的本地存储技术 HTML5 提供了两种在客户端存储数据的新方法.先看下面的例子: 例1:var mySelection = {name:"car", amount: ...
 - 那些H5用到的技术(1)——素材加载
		
编码环境前言什么时候用到素材加载?loading提示,让用户等待图片的加载音频的加载利用神器PreloadJS总结 编码环境 Sublime Text 3 插件包括: Autoprefixer 自动补 ...
 - Vue.js大屏数字滚动翻转效果
		
================================ 大屏数字滚动翻转效果来源于最近工作中element后台管理页面一张大屏的UI图,该UI图上有一个模块需要有数字往上翻动的效果,以下是最 ...
 - 让数字变化炫酷起来,数字滚动Text组件[Unity]
		
让数字滚动起来 上周我的策划又提了样需求,当玩家评分发生变动时,屏幕出现人物评分浮层UI,播放评分数字滚动动画.这类数字滚动需求非常常见,我就按一般思路,将startvalue与endvalue每隔一 ...
 - jQuery数字滚动(模拟网站人气、访问量递增)原创
		
插件描述:实现数字上下滚动,模拟网站人气.访问量递增的动画效果,兼容性如下: 使用方法 $(el).runNum(val,params); 参数详解 val:数值型(默认70225800): pa ...
 - #Plugin 数字滚动累加动画插件
		
数字滚动累加动画插件 NumScroll 1.使用前先引入jquery2.前端学习群:814798690 下载地址 https://github.com/chaorenzeng/jquery.num ...
 - WPF数字滚动效果
		
和WPF数字滚动抽奖有区别,WPF数字滚动抽奖是随机的,而这里是确定的. 为了系统演示,这个效果通宵加班写了整整6个小时,中间就上了次厕所. 代码: RollingNumberItemCtrl.xam ...
 - jQuery 数字滚动插件
		
这几天闲来没事写的,有不对的地方还请多多指点 CSS: ; padding:0 2px;} .digital-beating i {;; background:url(../images/icon_0 ...
 
随机推荐
- BZOJ 4326 NOIP2015 运输计划 (二分+树上差分)
			
4326: NOIP2015 运输计划 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 1930 Solved: 1231[Submit][Statu ...
 - curl:get,post 以及SoapClien访问webservice数据
			
一.curl get模式 public function close_order(){ $url="http://192.168.2.50:7777/U8API.asmx?op=Insert ...
 - 团体程序设计天梯赛L2-001 紧急救援                                                                                            2017-03-22 17:25             93人阅读              评论(0)              收藏
			
L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...
 - ASP.net 居中
			
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...
 - js实现window.open不被拦截的解决方法汇总
			
一.问题: 今天在处理页面ajax请求过程中,想实现请求后打开新页面,就想到通过 js window.open 来实现,但是最终都被浏览器拦截了. 二.分析: 在谷歌搜索有没有解决方法,有些说可以通过 ...
 - String,Json,Map之间的转化
			
前提条件: 1)String的格式是map或json类型的 ; 2)在JAVA中使用JSON需要引入 org.json 包 String >>Json JSONObject jsonObj ...
 - C语言--第0次作业;
			
第零次作业 1.你对网络专业或者计算机专业了解是怎样? 在高考之前,我就确定了自己的大学专业将会选择计算机方面.我认为计算机专业就业前景比较好,计算机行业发展也非常快,学科实践与创新能力也比较强,在当 ...
 - Stacking方法详解
			
集成学习方法主要分成三种:bagging,boosting 和 Stacking.这里主要介绍Stacking. stacking严格来说并不是一种算法,而是精美而又复杂的,对模型集成的一种策略. 首 ...
 - Problem I: GJJ的日常之玩游戏(GDC)
			
Contest - 河南省多校连萌(四) Problem I: GJJ的日常之玩游戏 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 107 Solve ...
 - 【OCP-12c】CUUG 071题库考试原题及答案解析(16)
			
16.(7-5) choose the best answerThe PRODUCTS table has the following structure:Evaluate the following ...