用队列模拟jquery的动画算法实例


Posted in Javascript onJanuary 20, 2015

本文实例讲述了用队列模拟jquery的动画算法。分享给大家供大家参考。具体分析如下:

Aaron最近疯狂的爱上了算法研究,估计又要死伤不少脑细胞了,我喜欢捡现成的,可以省些力气。发现他写的一段源码,运行一下,还蛮好玩的,于是拿来分析一下,一来吸收下里边的营养,二来加深一下源码学习的功力。话说这源码还真是提高js内功的一大秘决,不信,就和我一起来品味一下吧。

//立即执行函数,没有什么好说的。看下面演示

/**

(function($){

    //此处的$会由后面紧跟的立即执行函数的返回值提供

})(function(){

    //这个函数运行的结果就是$啦

    return aQuery

}())   
*/

(function($) {

    window.$ = $;

})(function() {
    //用来匹配ID字符串

    //(?:表示这里不分组) ,参考正则的内容

    //不过我个人认为把*改成+号会更好,因为#后至少要一个字符吧

    var rquickExpr = /^(?:#([\w-]*))$/;

    //一看便是jquery的重度患者

    function aQuery(selector) {

        return new aQuery.fn.init(selector);

    }
    /**

     * 动画 

     * @return {[type]} [description]

     */

    var animation = function() {
        var self = {};

        var Queue = []; //动画队列

        var fireing = false //动画锁

        var first = true; //通过add接口触发
        var getStyle = function(obj, attr) {

            return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle(obj, false)[attr];

        }

        //这里边都是具体的动画效果,没有什么难懂的

        var makeAnim = function(element, options, func) {

            var width = options.width

                //包装了具体的执行算法

                //css3

                //setTimeout

            element.style.webkitTransitionDuration = '2000ms';

            element.style.webkitTransform = 'translate3d(' + width + 'px,0,0)';
            //监听动画完结

            element.addEventListener('webkitTransitionEnd', function() {

                func()

            });

        }
        var _fire = function() {

            //加入动画正在触发

            if (!fireing) {

                var onceRun = Queue.shift();

                if (onceRun) {

                    //防止重复触发

                    fireing = true;

                    //next

                    onceRun(function() {

                        fireing = false;

                        //这里很巧妙的产生了连环调用的效果

                        _fire();

                    });

                } else {

                    fireing = true;

                }

            }

        }
        return self = {

            //增加队列

            add: function(element, options) {

                //这里是整个算法的关键

                //相当于往数组中添加一个函数

                //[function(func){},...]

                //也就是_fire中的onceRun方法,func也就是在那时传进去的。

                //在Aaron的编程中很喜欢用这种技巧,比如预编译什么的。

                Queue.push(function(func) {

                    makeAnim(element, options, func);

                });
                //如果有一个队列立刻触发动画

                if (first && Queue.length) {

                    //这个开关很好的起到了控制后面添加的元素进行排队的作用

                    first = false;

                    //这里等价于直接运行_fire();

                    //Aaron喜欢装A,故意添加一个self.fire出来,或许他是深谋远虑

                    self.fire();

                }

            },

            //触发

            fire: function() {

                _fire();

            }

        }

    }();
    aQuery.fn = aQuery.prototype = {

        run: function(options) {

            animation.add(this.element, options);

            return this;

        }

    }
    var init = aQuery.fn.init = function(selector) {

        var match = rquickExpr.exec(selector);

        var element = document.getElementById(match[1])

        this.element = element;

        return this;

    }

    //差点小看了这一行代码

    //jquery的样子学的不错

    //直接aQuery.fn.init = aQuery.fn不是更好?

    //多一个init变量无非是想减少查询罢了,优化的思想无处不在。

    init.prototype = aQuery.fn;

    return aQuery;

}());
//dom

var oDiv = document.getElementById('div1');

 

//调用

oDiv.onclick = function() {
    $('#div1').run({

        'width': '500'

    }).run({

        'width': '300'

    }).run({

        'width': '1000'

    });

};

附上html就可以自己调式了。要记得用chrome浏览哦。

<div id="div1" style="width:100px;height:50px;background:red;cursor:pointer;color:#fff;text-align:center;line-height:50px;" data-mce-style="width: 100px; height: 50px; background: red; cursor: pointer; color: #fff; text-align: center; line-height: 50px;">点击</div>

希望本文所述对大家的jQuery程序设计有所帮助。

Javascript 相关文章推荐
jQuery UI Dialog控件中的表单无法正常提交的解决方法
Dec 19 Javascript
基于jquery实现状态限定编辑的代码
Feb 11 Javascript
图片上传判断及预览脚本的效果实例
Aug 07 Javascript
jquery固定底网站底部菜单效果
Aug 13 Javascript
详解js闭包
Sep 02 Javascript
jquery实现的判断倒计时是否结束代码
Feb 05 Javascript
js表单验证实例讲解
Mar 31 Javascript
AngularJS equal比较对象实例详解
Sep 14 Javascript
老生常谈angularjs中的$state.go
Apr 24 Javascript
Vue.js弹出模态框组件开发的示例代码
Jul 26 Javascript
vue 弹窗时 监听手机返回键关闭弹窗功能(页面不跳转)
May 10 Javascript
Node实现搜索框进行模糊查询
Jun 28 Javascript
jQuery 处理页面的事件详解
Jan 20 #Javascript
DOM 事件流详解
Jan 20 #Javascript
jQuery链使用指南
Jan 20 #Javascript
使用jQuery管理选择结果
Jan 20 #Javascript
javascript动态修改Li节点值的方法
Jan 20 #Javascript
js+css实现tab菜单切换效果的方法
Jan 20 #Javascript
jQuery中Ajax的get、post等方法详解
Jan 20 #Javascript
You might like
提升PHP执行速度全攻略
2006/10/09 PHP
php 特殊字符处理函数
2008/09/05 PHP
分享PHP header函数使用教程
2013/09/05 PHP
phpmailer发送邮件之后,返回收件人是否阅读了邮件的方法
2014/07/19 PHP
php计算到指定日期还有多少天的方法
2015/04/14 PHP
PHP基于phpqrcode类生成二维码的方法详解
2018/03/14 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
javascript应用:Iframe自适应其加载的内容高度
2007/04/10 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
jQuery+CSS 实现随滚动条增减的汽水瓶中的液体效果
2011/09/26 Javascript
表头固定(利用jquery实现原理介绍)
2012/11/08 Javascript
javascript 文件的同步加载与异步加载实现原理
2012/12/13 Javascript
Yii2使用Bootbox插件实现自定义弹窗
2015/04/02 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
JS获取文件大小方法小结
2015/12/08 Javascript
理解javascript中的MVC模式
2016/01/28 Javascript
使用Curl命令查看请求响应时间方法
2016/11/04 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
jQuery实现滚动条滚动到子元素位置(方便定位)
2017/01/08 Javascript
jquery仿京东侧边栏导航效果
2017/03/02 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
详解js删除数组中的指定元素
2018/10/31 Javascript
p5.js绘制创意自画像
2019/11/04 Javascript
Python中用post、get方式提交数据的方法示例
2017/09/22 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
在pycharm下设置自己的个性模版方法
2019/07/15 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
html5跳转小程序wx-open-launch-weapp踩坑
2020/12/02 HTML / CSS
百度吧主申请感言
2014/01/12 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
2015年安全生产责任书
2015/01/30 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
简单的辞职信模板
2015/05/12 职场文书