用队列模拟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 相关文章推荐
javascript模版引擎-tmpl的bug修复与性能优化分析
Oct 23 Javascript
浅析hasOwnProperty方法的应用
Nov 20 Javascript
node.js中的http.response.setHeader方法使用说明
Dec 14 Javascript
JavaScript与HTML的结合方法详解
Nov 23 Javascript
一个仿微博登陆邮箱提示框js开发案例
Jul 28 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
Dec 02 Javascript
jQuery插件FusionCharts绘制的2D双面积图效果示例【附demo源码】
Apr 11 jQuery
Angular中自定义Debounce Click指令防止重复点击
Jul 26 Javascript
react redux入门示例
Apr 19 Javascript
angularJs中跳转到指定的锚点实例($anchorScroll)
Aug 31 Javascript
JavaScript JMap类定义与使用方法示例
Jan 22 Javascript
JS获取动态添加元素的方法详解
Jul 31 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日期处理函数 整型日期格式
2011/01/12 PHP
php获得url参数中具有&amp;的值的方法
2014/03/05 PHP
ThinkPHP 3.2 版本升级了哪些内容
2015/03/05 PHP
php生成zip文件类实例
2015/04/07 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
List the Codec Files on a Computer
2007/06/18 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
JavaScript中的acos()方法使用详解
2015/06/14 Javascript
js显示动态时间的方法详解
2016/08/20 Javascript
关于Jquery中的事件绑定总结
2016/10/26 Javascript
原生Javascript插件开发实践
2017/01/09 Javascript
JavaScript的事件机制详解
2017/01/17 Javascript
react 父组件与子组件之间的值传递的方法
2017/09/14 Javascript
JavaScript代码执行的先后顺序问题
2017/10/29 Javascript
JS判断字符串是否为整数的方法--简单的正则判断
2018/07/23 Javascript
Python获取当前时间的方法
2014/01/14 Python
决策树的python实现方法
2014/11/18 Python
Python3字符串学习教程
2015/08/20 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
2017/02/16 Python
python 3.6 tkinter+urllib+json实现火车车次信息查询功能
2017/12/20 Python
python实现在pandas.DataFrame添加一行
2018/04/04 Python
python实现求特征选择的信息增益
2018/12/18 Python
Python多线程及其基本使用方法实例分析
2019/10/29 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
2019/12/27 Python
给实习单位的感谢信
2014/02/01 职场文书
行政副总岗位职责
2014/02/23 职场文书
小学运动会班级口号
2014/06/09 职场文书
《周恩来的四个昼夜》观后思想汇报范文两篇
2014/09/10 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
学生乘坐校车安全责任书
2015/05/11 职场文书
法制教育观后感
2015/06/17 职场文书
2016大一新生入学教育心得体会
2016/01/23 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
2022/03/03 Python
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python