用队列模拟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 类与静态类的实现(续)
Apr 02 Javascript
AeroWindow 基于JQuery的弹出窗口插件
Jun 27 Javascript
jQuery获取上传文件的名称的正则表达式
May 21 Javascript
canvas绘制的直线动画
Jan 23 Javascript
ES6数组的扩展详解
Apr 25 Javascript
Js实现京东无延迟菜单效果实例(demo)
Jun 02 Javascript
对存在JavaScript隐式类型转换的四种情况的总结(必看篇)
Aug 31 Javascript
vue axios同步请求解决方案
Sep 29 Javascript
微信小程序录音与播放录音功能
Dec 25 Javascript
vue项目中将element-ui table表格写成组件的实现代码
Jun 12 Javascript
详解django模板与vue.js冲突问题
Jul 07 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
Jul 17 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批量上传图片的具体实现方法介绍.
2014/02/26 PHP
[原创]php获取数组中键值最大数组项的索引值
2015/03/17 PHP
Laravel 5框架学习之用户认证
2015/04/09 PHP
WordPress伪静态规则设置代码实例
2020/12/10 PHP
找到一点可怜的关于dojo资料,谢谢作者!
2006/12/06 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
jquery 弹出登录窗口实现代码
2009/12/24 Javascript
动态加载图片路径 保持JavaScript控件的相对独立性
2010/09/03 Javascript
利用jQuery操作对象数组的实现代码
2011/04/27 Javascript
js传中文参数controller里获取参数乱码问题解决方法
2014/01/03 Javascript
javascript学习笔记(八)正则表达式
2014/10/08 Javascript
使用Javascript实现选择下拉菜单互移并排序
2016/02/23 Javascript
拥有一个属于自己的javascript表单验证插件
2016/03/24 Javascript
在Html中使用Requirejs进行模块化开发实例详解
2016/04/15 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
js弹性势能动画之抛物线运动实例详解
2017/07/27 Javascript
JS 中使用Promise 实现红绿灯实例代码(demo)
2017/10/20 Javascript
ajax前台后台跨域请求处理方式
2018/02/08 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
JS中实现隐藏部分姓名或者电话号码的代码
2018/07/17 Javascript
Python实现的微信好友数据分析功能示例
2018/06/21 Python
浅谈Python中的全局锁(GIL)问题
2019/01/11 Python
用Python解决x的n次方问题
2019/02/08 Python
Python安装selenium包详细过程
2019/07/23 Python
python之yield和Generator深入解析
2019/09/18 Python
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
售后服务经理岗位职责
2014/02/25 职场文书
年终奖发放方案
2014/06/02 职场文书
职工小家建设活动方案
2014/08/25 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
初中成绩单评语
2014/12/29 职场文书
挂职个人工作总结
2015/03/05 职场文书
新员工试用期自我评价
2015/03/10 职场文书
新郎新娘致辞
2015/07/31 职场文书
浅谈Node的内存泄露问题
2022/05/06 NodeJs
CSS的calc函数用法小结
2022/06/25 HTML / CSS