为了账号安全,请及时绑定邮箱和手机立即绑定

咱一起来写一个卷轴控件吧

        我们先看一看这个卷轴控件实现了什么。

        它的功能呢很简单:

                1、能根据后台的数据实时的展示出来(我这里的话用了随机数代替,可自行替换)

                2、这里有5个卡片,每个卡片是独立的,当新的数据较原数据大时,卡片从下方顶起,当数据较小时,卡片从上方掉落。

                3、写完后自己看着还蛮像是抽奖的。

https://img3.sycdn.imooc.com/5bad0ba70001d64004810155.jpg

        要源码的请点击这里:github地址

        要看效果的去这里:演示地址

接下来呢,我大致说下实现这个的思路:其实需要注意的点不多,思路大概是这样:

        总思路:用5个原先藏好的标签填入新数据,再把原标签顶掉。

        上面看到了吧?而实际上是这样的:

https://img1.sycdn.imooc.com//5bad7c2c00017a9806770314.jpg

        把超出的隐藏掉,整个就达到我们的效果了。

        1、得有个数据处理器,或者说写一个函数,把一个数据转成一个个位数的数字,用来做卡片单元

https://img4.sycdn.imooc.com/5bad0fb70001485c07050597.jpg

        2、得有个机制用于比对新数每一位与旧数的大小关系,并做不同的输出,比如新比旧的大输出1,反之输出0,我这顺便做了点样式调整。

https://img1.sycdn.imooc.com/5bad0feb00018ac409260451.jpg

        3、有了上面的判断,还得有一个样式调整与归原,什么意思呢?首先我们一开始有个初始值,我们的卷轴是卡片这样划进划出的吧?那新数替换了旧数之后,实际上新数就变成了旧数,这时候呢,我们是不是又回到了起点(这时候的新数看成是初始值),但这时候的类名都变了,不怕,全部归原后,再重新开始下一个循环卷动。

https://img1.sycdn.imooc.com/5bad11190001a9e708660446.jpg

        4、最后的话呢再设置一个定时器,做循环就好了。

这里就贴一下js的代码吧:

/**
 *  卷轴控件
 *  @author:dorseyCh
 *  @date:2018-09-13
***/
(function(win){

    var Scroll = function(option){
        this.option = option;
    };

    Scroll.prototype = {
        //初始化
        init : function(){
            this.oldData = 900;
            this.newData = 800;
            this.arrOld = [0,0,9,0,0];
            this.arrNew = [0,0,8,0,0];
            this.direction = [];
            this.styleReturn();
        },
        //数据生成器 ———— 配合后台则需要异步接收到数据
        dataGet : function () {
            return Math.floor(Math.random() * 99999);
        },
        //数据处理
        dataSolve : function () {

            var num = this.option.num;
            var newData = this.dataGet(),
                oldData = this.newData;

            this.newData = newData;
            var arrOld = [],arrNew = [];
            for(var i = 0 ; i < num ; i ++) {
                arrOld[num - 1 - i] = (parseInt(oldData) % 10);
                // if(parseInt(newData) % 10 !== parseInt(oldData) % 10){
                arrNew[num - 1 - i] = (parseInt(newData) % 10);
                // }
                newData = Math.floor(newData / 10);
                oldData = Math.floor(oldData / 10);
            }
            this.arrOld = arrOld;
            this.arrNew = arrNew;
            this.oldData = this.newData;
            
        },
        //数据展示
        dataDisplay : function (){
            var _self = this;
            var $li = _self.option.dom.find("li");
            _self.direction = [];

            for(var i = 0 ; i < _self.option.num ; i ++){

                //新数据与旧数据对比,较大时,div-hide瞬移到div-on的下方,反之则上方,同时返回一个数组表示接下来li要移动的方向
                // if(_self.arrNew[i] !== '') {
                    _self.arrOld[i] > _self.arrNew[i] ? 
                    ($li.eq(i).find('.s-hide').attr("class","s-hide s-top"), _self.direction.push('bottom')) : 
                    ($li.eq(i).find('.s-hide').attr("class","s-hide s-bottom"), _self.direction.push('top'));
                // }
                // else{
                //     _self.direction.push('');
                // }
                $li.eq(i).find('.s-on').html(_self.arrOld[i]);
                $li.eq(i).find('.s-hide').html(_self.arrNew[i]);
            }

        },
        //添加动画
        animate : function () {
            var _self = this;           
            var $li = this.option.dom.find('li');
            
            $li.each(function(i){
                $li.eq(i).css("transition", 0.5 * ($li.length - i) + "s").attr("class","s-" + _self.direction[i]);
            });
        },
        //样式归原
        styleReturn : function () {
            var _self = this;
            var $li = _self.option.dom.find("li");
            
            for(var i = 0 ; i < _self.option.num ; i ++){
                $li.eq(i).find('.s-on').html(_self.arrNew[i]);
                $li.eq(i).find('.s-hide').html(_self.arrOld[i]);
            }

            $li.css("transition","").attr('class','');
            $li.find(".s-on").attr("class","s-on"),
            $li.find(".s-hide").attr("class","s-hide s-bottom");
            
        },
        run : function () {
            var _self = this;
            _self.init();
            
            setInterval(function(){
                //这里暂时想不到更好的办法,先勉强这样
                _self.styleReturn();    //数据还原
                setTimeout(function(){
                    _self.dataSolve();      //数据处理
                    _self.dataDisplay();    //数据展示
                    _self.animate();
                },100);
            },_self.option.delay);
        }
    }

    win.Scroll = Scroll;

})(window);






点击查看更多内容
5人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
1.3万
获赞与收藏
1519

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消