用队列模拟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 Cookie 直接浏览网站分网址
Dec 08 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
Jun 11 Javascript
jQuery实现切换页面布局使用介绍
Oct 09 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
Oct 24 Javascript
JQuery each打印JS对象的方法
Nov 13 Javascript
node.js中的fs.chmod方法使用说明
Dec 18 Javascript
AngularJS中的Promise详细介绍及实例代码
Dec 13 Javascript
bootstrap table 多选框分页保留示例代码
Mar 08 Javascript
angularjs 缓存的使用详解
Mar 19 Javascript
layer iframe 设置关闭按钮的方法
Sep 12 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
Sep 17 Javascript
js的Object.assign用法示例分析
Mar 05 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
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
php设计模式之单例模式用法经典示例分析
2019/09/20 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
javaScript 利用闭包模拟对象的私有属性
2011/12/29 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
从零学jquery之如何使用回调函数
2014/05/16 Javascript
Javascript基础教程之argument 详解
2015/01/18 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
懒加载实现的分页&amp;&amp;网站footer自适应
2016/12/21 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
JS Testing Properties 判断属性是否在对象里的方法
2017/10/01 Javascript
Angular搜索场景中使用rxjs的操作符处理思路
2018/05/30 Javascript
JavaScript 复制对象与Object.assign方法无法实现深复制
2018/11/02 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
vue实现codemirror代码编辑器中的SQL代码格式化功能
2019/08/27 Javascript
Vue-cli assets SubDirectory及PublicPath区别详解
2020/08/18 Javascript
javascript实现时钟动画
2020/12/03 Javascript
[04:19]DOTA2亚洲邀请赛 现场花絮
2015/03/11 DOTA
简单介绍Python中的JSON使用
2015/04/28 Python
Python统计文件中去重后uuid个数的方法
2015/07/30 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
2019/06/26 Python
Python 运行.py文件和交互式运行代码的区别详解
2019/07/02 Python
如何用python爬取微博热搜数据并保存
2021/02/20 Python
班主任班级寄语大全
2014/04/04 职场文书
股权转让协议书
2014/04/12 职场文书
考察现实表现材料
2014/05/19 职场文书
2014年党员自我评议对照检查材料
2014/09/20 职场文书
污水处理保证书
2015/05/09 职场文书
房贷工资证明范本
2015/06/12 职场文书
Django显示可视化图表的实践
2021/05/10 Python