用队列模拟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 相关文章推荐
Extjs Ajax 乱码问题解决方案
Apr 15 Javascript
三级下拉菜单的js实现代码
May 23 Javascript
JS 实现Table相同行的单元格自动合并示例代码
Aug 27 Javascript
JavaScript数据结构与算法之栈与队列
Jan 29 Javascript
详解javascript实现瀑布流列式布局
Jan 29 Javascript
Javascript实现前端简单的路由实例
Sep 11 Javascript
javascript添加前置0(补零)的几种方法
Jan 05 Javascript
手把手搭建安装基于windows的Vue.js运行环境
Jun 12 Javascript
JS实现div模块的截图并下载功能
Oct 17 Javascript
解决angular双向绑定无效果,ng-model不能正常显示的问题
Oct 02 Javascript
浅谈express.js框架中间件(middleware)
Apr 07 Javascript
Vue清除定时器setInterval优化方案分享
Jul 21 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.ini中文版
2006/10/09 PHP
jQuery插件MixItUp实现动画过滤和排序
2015/04/12 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
关于ES6的六个小特性(二)
2017/02/20 Javascript
JavaScript中 this 指向问题深度解析
2017/02/21 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
Mui使用jquery并且使用点击跳转新窗口的实例
2017/08/19 jQuery
JavaScript面试出现频繁的一些易错点整理
2018/03/29 Javascript
JS的函数调用栈stack size的计算方法
2018/06/24 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
详解React 的几种条件渲染以及选择
2018/10/23 Javascript
django js 实现表格动态标序号的实例代码
2019/07/12 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
Python引用模块和查找模块路径
2016/03/17 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
Django中多种重定向方法使用详解
2019/07/17 Python
python银行系统实现源码
2019/10/25 Python
python中的Elasticsearch操作汇总
2019/10/30 Python
wxpython+pymysql实现用户登陆功能
2019/11/19 Python
python默认参数调用方法解析
2020/02/09 Python
使用python处理题库表格并转化为word形式的实现
2020/04/14 Python
Jupyter Notebook添加代码自动补全功能的实现
2021/01/07 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
造型师求职自荐信
2013/09/27 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
《美丽的丹顶鹤》教学反思
2014/04/22 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
社会发展项目建议书
2014/08/25 职场文书
住宿生擅自离校检讨书
2014/09/22 职场文书
医院志愿者活动总结
2015/05/06 职场文书
行政诉讼答辩状
2015/05/21 职场文书
春节随笔
2015/08/15 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python
Mysql案例刨析事务隔离级别
2021/09/25 MySQL