用队列模拟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] ) 用于创建自定义动画的函数. 这个函数的关键在于指 ...
随机推荐
- swiper的初步使用
1.引入文件,顺序引入(此处基于jquery,且版本至少1.7以上) <link rel="stylesheet" href="path/to/swiper-3.4 ...
- Java 用程序给出随便大小的10 个数,序号为1-10,按从小到大顺序输出,并输出相应的序号?
import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.uti ...
- socket通信
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
- Excel数据导入数据库的SQL快速生成
=CONCATENATE("insert into table_name(id, code, name, remark) values (uuid(),'",B2,"', ...
- C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
本人今天遇到的错误,C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误. 测试了很久,才发现,是安全协议问题,把安全协议加上就可以了
- BigDecimal用法详解
一.简介Java在java.math包中提供的API类BigDecimal,用来对超过16位有效 位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...
- 用C语言编写生成小学四则运算程序
使用软件——VS 2015 使用环境——C语言 早在上周我就开始使用C#语言做,由于最后一点问题而放弃,之后用C语言开始做,很顺利,但是也碰到了一些问题,但是通过了百度文库上的一些程序的借鉴和吴阿平同 ...
- CYQ.Data+EasyUI开发:几个相关的问题CheckBox、Tree、TreeGrid
前言: 话说到新的公司已经呆了三个星期了,从上班的第二天开始就一直在写项目文档和给开发人员培训,以至于我的QQ签名从"我不是来搞培训的“到最后直接换成”我是来搞培训的“. 虽然挂名开发经理, ...
- 混搭.NET技术
新闻 .NET技术+25台服务器怎样支撑世界第54大网站 再度燃起人们对.NET的技术热情.这篇新闻中透露了StackExchange 在技术方面的混搭,这也是我所崇尚的.因此我也在社区里极力推广Mo ...
- Web Audio介绍
Web Audio还是一个比较新的JavaScript API,它和HTML5中的<audio>是不同的,简单来说,<audio>标签是为了能在网页中嵌入音频文件,和播放器一样 ...