用队列模拟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的动画算法的更多相关文章
- jQuery使用(九):队列及实现原理、基于队列模拟实现animate()
开篇一张图之队列模型 queue()如何使用? queue()原理实现? 基于queue()模拟实现animate() 一.使用queuer方法.理解队列原理 queue() dequeue() cl ...
- 第73天:jQuery基本动画总结
一.DOM对象跟jQuery对象相互转换 jQuery对象转换成DOM对象: 方式一:$(“#btn”)[0] 方式二:$(“#btn”).get(0) DOM对象转换成jQuery对象: $(doc ...
- jquery animate 动画效果使用解析
animate的意思是:使有生气:驱动:使栩栩如生地动作:赋予…以生命作为形容词:有生命的:活的:有生气的:生气勃勃的 先看动画效果:http://keleyi.com/keleyi/phtml/jq ...
- jQuery的动画处理总结
最近一年多一直在做前端的东西,由于老板在追求一些年轻动感的效果,让页面元素不能仅仅是简单的隐藏显示,所以经常会使用一些动画效果,发现jQuery的动画真心好用啊,把常用的几个总结一下,希望不再每次使用 ...
- JavaScript基于时间的动画算法
转自:https://segmentfault.com/a/1190000002416071 前言 前段时间无聊或有聊地做了几个移动端的HTML5游戏.放在不同的移动端平台上进行测试后有了诡异的发现, ...
- jQuery 停止动画、jQuery Callback 函数、jQuery - Chaining
一.jQuery 停止动画 jQuery stop() 方法用于在动画或效果完成前对它们进行停止. stop() 方法适用于所有 jQuery 效果函数,包括滑动.淡入淡出和自定义动画. $(sele ...
- jQuery 停止动画
jQuery stop() 方法用于在动画或效果完成前对它们进行停止. 停止滑动 点击这里,向上/向下滑动面板 实例 jQuery stop() 滑动演示 jQuery stop() 方法. jQue ...
- JQuery常用动画实现函数
1.上拉.下拉和切换 slideup().slidedown().slideToggle() JQuery里面的切换太吊了,它自带判断当前显示状态,如果为显示就执行隐藏,如果为隐藏就执行显示. 2.淡 ...
- jquery的动画函数animate()讲解一
jquery animate 动画效果使用说明 animate( params, [duration], [easing], [callback] ) 用于创建自定义动画的函数. 这个函数的关键在于指 ...
随机推荐
- 不可变数组NSArray
//数组里面不允许存放基本数据类型,只能存放“对象” NSArray *array = [NSArray arrayWithObjects:@"周星星",@"尹天仇&qu ...
- Mariadb数据库设置及操作 一主多从 备份还原(实测笔记)
环境: 系统硬件:vmware vsphere (CPU:2*4核,内存2G,双网卡) 系统版本:CentOS-7-x86_64-Minimal-1611.iso 数据库版本信息 : 10.1.20- ...
- *CF2.D(哥德巴赫猜想)
D. Taxes time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- 安卓中的Model-View-Presenter模式介绍
转载自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0425/2782.html 英文原文:Introduction to M ...
- redis配置文件英译汉
# By default Redis asynchronously dumps the dataset on disk. This mode is # good enough in many appl ...
- 20145337 GDB调试汇编堆栈过程分析
20145337 GDB调试汇编堆栈过程分析 测试代码 #include<stdio.h> short addend1 = 1; static int addend2 = 2; const ...
- NLP常用工具
1.统计类工具:可参见[统计学习常用Python扩展包] 2.linux自带工具:可参见[[整理]Linux常用文本处理命令] 3.简繁转换工具:opencc Open Chinese Convert ...
- 看看Maple T.A.的详细作用
Maple T.A.是一个基于互联网的在线考试和智能评分系统,是Maplesoft公司 与美国数学协会(MAA)合作开发的成果,在全球拥有大量的院校用户.Maple T.A.提供了用户数据库.所见即所 ...
- 使用Word2013发布博客
步骤一.新建博客文章 打开Word软件,新建->博客文章(第一次在模板下面可能找不到,可以在搜索栏中搜索"博客",下次在首页就能直接找到). 步骤二.编辑博客文章 1.输入文 ...
- ABP理论学习之依赖注入
返回总目录 本篇目录 什么是依赖注入 传统方式产生的问题 解决办法 依赖注入框架 ABP中的依赖注入基础设施 注册 解析 其他 ASP.NET MVC和ASP.NET Web API集成 最后提示 什 ...