用队列模拟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 相关文章推荐
js模拟实现Array的sort方法
Dec 11 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
Aug 28 Javascript
javascript setTimeout和setInterval计时的区别详解
Jun 21 Javascript
js匿名函数的调用示例(形式多种多样)
Aug 20 Javascript
jQuery-1.9.1源码分析系列(十一)DOM操作续之克隆节点
Dec 01 Javascript
学习JavaScript设计模式(代理模式)
Dec 03 Javascript
jQuery Mobile 和 Kendo UI 的比较
May 05 Javascript
JavaScript导航脚本判断当前导航
Jul 12 Javascript
AngularJS  $on、$emit和$broadcast的使用
Sep 05 Javascript
Angular2 之 路由与导航详细介绍
May 26 Javascript
AngularJS实时获取并显示密码的方法
Feb 06 Javascript
JS操作字符串转数字的常见方法示例
Oct 29 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
全国FM电台频率大全 - 20 广西省
2020/03/11 无线电
DC动画电影《黑暗正义联盟》曝预告 5月5日上线数字平台
2020/04/09 欧美动漫
php导出excel格式数据问题
2014/03/11 PHP
PHP利用hash冲突漏洞进行DDoS攻击的方法分析
2015/03/26 PHP
WordPress自定义时间显示格式
2015/03/27 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
eclipse如何忽略js文件报错(附图)
2013/10/30 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
jQuery实现的背景动态变化导航菜单效果
2015/08/24 Javascript
JavaScript 闭包详细介绍
2016/09/28 Javascript
Vue2 使用 Echarts 创建图表实例代码
2017/05/18 Javascript
JS实现求数组起始项到终止项之和的方法【基于数组扩展函数】
2017/06/13 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
使用vue-cli创建项目的图文教程(新手入门篇)
2018/05/02 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
Vue 动态组件与 v-once 指令的实现
2019/02/12 Javascript
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
js JSON.stringify()基础详解
2019/06/19 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
[39:19]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第二场 11.26
2020/11/30 DOTA
详解python中list的使用
2019/03/15 Python
Python利用sqlacodegen自动生成ORM实体类示例
2019/06/04 Python
PyQt5实现简易电子词典
2019/06/25 Python
Python结合百度语音识别实现实时翻译软件的实现
2021/01/18 Python
python 使用openpyxl读取excel数据
2021/02/18 Python
HTML5 新表单类型示例代码
2018/03/20 HTML / CSS
美国精品地毯网站:Boutique Rugs
2020/03/04 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
村道德模范事迹材料
2014/08/28 职场文书
音乐之声音乐广播稿
2014/09/10 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
react antd实现动态增减表单
2021/06/03 Javascript