jQuery1.5.1 animate方法源码阅读


Posted in Javascript onApril 05, 2011
/*7536-7646*/ 
animate: function( prop, speed, easing, callback ) { 
if ( jQuery.isEmptyObject( prop ) ) { 
return this.each( optall.complete ); 
} 
//#7864行this.options.complete.call( this.elem )使得其可以不断的连续执行动画,比如$(‘selector').animate({prop1},speed1).animate({prop2},speed2)这样的动画队列; 
return this[ optall.queue === false ? "each" : "queue" ](function() { 
// XXX 'this' does not always have a nodeName when running the 
// test suite 
var opt = jQuery.extend({}, optall), p, 
isElement = this.nodeType === 1, 
hidden = isElement && jQuery(this).is(":hidden"), 
self = this; 
//要执行动画的prop,prop一般是一个plainObj,形如{key1:value1,key2:value2}; 
for ( p in prop ) { 
//驼峰改写,有些比如magrin-top需要变成驼峰的属性即变成marginTop;见cameCase方法; 
var name = jQuery.camelCase( p ); 
//fix属性;主要是前面camelcase的属性; 
if ( p !== name ) { 
prop[ name ] = prop[ p ]; 
delete prop[ p ]; 
p = name; 
} 
//如果执行$(..).show||$(..).hide;如果这个元素本身是hidden,而动画里面又写hide,直接运行callbacks就可以了; 
if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) { 
return opt.complete.call(this); 
} 
//如果prop[key]==(height||width)并且是一个dom元素;需要有些特殊的处理; 
if ( isElement && ( p === "height" || p === "width" ) ) { 
// Make sure that nothing sneaks out 
// Record all 3 overflow attributes because IE does not 
// change the overflow attribute when overflowX and 
// overflowY are set to the same value 
opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ]; // Set display property to inline-block for height/width 
// animations on inline elements that are having width/height 
// animated 
if ( jQuery.css( this, "display" ) === "inline" && 
jQuery.css( this, "float" ) === "none" ) { 
if ( !jQuery.support.inlineBlockNeedsLayout ) { 
this.style.display = "inline-block"; 
} else { 
var display = defaultDisplay(this.nodeName); 
// inline-level elements accept inline-block; 
// block-level elements need to be inline with layout 
if ( display === "inline" ) { 
this.style.display = "inline-block"; 
} else { 
this.style.display = "inline"; 
this.style.zoom = 1; 
} 
} 
} 
} 
//如果prop[key]是一个数组;只用第一个值prop[p][0]; 
if ( jQuery.isArray( prop[p] ) ) { 
// Create (if needed) and add to specialEasing 
(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1]; 
prop[p] = prop[p][0]; 
} 
} 
if ( opt.overflow != null ) { 
//如果动画元素的overflow已经被设置的情况下,把它暂时为hidden; 
this.style.overflow = "hidden"; 
} 
//当前动画键值对,其实就是prop; 
opt.curAnim = jQuery.extend({}, prop); 
//这里便是动画的核心了,对每一个prop[key]进行处理; 
jQuery.each( prop, function( name, val ) { 
//获取一个Fx对象;传入的每一个参数都被设置成为这个对象的属性;其中self是指动画元素自身;opt是前面产生的对象; 
var e = new jQuery.fx( self, opt, name ); 
//当执行show||hide操作的时候prop==fxAttrs(参见show||hide方法) 
if ( rfxtypes.test(val) ) { 
e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop ); 
} else { 
var parts = rfxnum.exec(val), 
//start保存了初始值,它可能在style,也可能在css中,如果该值==null,undefiend,auto,0等将被设置为0; 
start = e.cur(); 
if ( parts ) { 
//end是指变化量的大小,比如:{left:-=66px},那么end=66; 
var end = parseFloat( parts[2] ), 
//单元运算符,就是px,%;如果是一些不能带单位的,比如z-index,设置为空,否则就设置为px; 
unit = parts[3] || ( jQuery.cssNumber[ name ] ? "" : "px" ); 
// We need to compute starting value 
//如果不是px,比如%,em等等; 
if ( unit !== "px" ) { 
//设置该属性值name为(end || 1) + unit,如果end=0;设置为1;开始值被设置为start = ((end || 1) / e.cur()) * start; 
jQuery.style( self, name, (end || 1) + unit); 
//这里e.cur()和前面的start = e.cur();是不一样的,因为jQuery.style( self, name, (end || 1) + unit)的执行使得start被改变;用于处理end=0的情况;因为e.cur()作为除数,不能为0; 
start = ((end || 1) / e.cur()) * start; 
jQuery.style( self, name, start + unit); 
} 
// If a +=/-= token was provided, we're doing a relative animation 
if ( parts[1] ) { 
//end相应的被设置为运算后的变量值; 
end = ((parts[1] === "-=" ? -1 : 1) * end) + start; 
} 
e.custom( start, end, unit ); 
//如果没有数字化的运算;那么没传入的只能是''; 
} else { 
e.custom( start, val, "" ); 
} 
} 
}); 
// For JS strict compliance 
return true; 
}); 
},
Javascript 相关文章推荐
JQury slideToggle闪烁问题及解决办法
Jul 05 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
Apr 18 Javascript
js简单实现用户注册信息的校验代码
Nov 15 Javascript
纯js写的分页表格数据为json串
Feb 18 Javascript
JS+CSS实现的蓝色table选项卡效果
Oct 08 Javascript
vue.js表格分页示例
Oct 18 Javascript
实例解析jQuery中如何取消后续执行内容
Dec 01 Javascript
vue2.0中click点击当前li实现动态切换class
Jun 21 Javascript
React-Native左右联动List的示例代码
Sep 21 Javascript
基于vue组件实现猜数字游戏
May 28 Javascript
微信小程序日历/日期选择插件使用方法详解
Dec 28 Javascript
JS实现网页时钟特效
Mar 25 Javascript
jQuery的运行机制和设计理念分析
Apr 05 #Javascript
jQuery JSON的解析方式分享
Apr 05 #Javascript
jQuery 1.5 源码解读 面向中高阶JSER
Apr 05 #Javascript
基于jquery的动态创建表格的插件
Apr 05 #Javascript
基于jquery的合并table相同单元格的插件(精简版)
Apr 05 #Javascript
新鲜出炉的js tips提示效果
Apr 03 #Javascript
使用Firebug对js进行断点调试的图文方法
Apr 02 #Javascript
You might like
兼容firefox,chrome的网页灰度效果
2011/08/08 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
捕获关闭窗口的脚本
2009/01/10 Javascript
如何使用jquery控制CSS样式,并且取消Css样式(如背景色,有实例)
2013/07/09 Javascript
JavaScript实现的日期控件具体代码
2013/11/18 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
JS Array创建及concat()split()slice()的使用方法
2016/06/03 Javascript
JS表格组件BootstrapTable行内编辑解决方案x-editable
2016/09/01 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
Vue.JS实现垂直方向展开、收缩不定高度模块的JS组件
2018/06/19 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
从零到一详聊创建Vue工程及遇到的常见问题
2019/04/25 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
es6数组的flat(),flatMap()函数用法实例分析
2020/04/18 Javascript
详解react组件通讯方式(多种)
2020/05/06 Javascript
python抓取网页中的图片示例
2014/02/28 Python
Python实现批量转换文件编码的方法
2015/07/28 Python
Python实现周期性抓取网页内容的方法
2015/11/04 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
在cmd中运行.py文件: python的操作步骤
2018/05/12 Python
详解Django解决ajax跨域访问问题
2018/08/24 Python
Python实现简单的用户交互方法详解
2018/09/25 Python
python实时获取外部程序输出结果的方法
2019/01/12 Python
python实现KNN分类算法
2019/10/16 Python
使用python+whoosh实现全文检索
2019/12/09 Python
浅谈keras 的抽象后端(from keras import backend as K)
2020/06/16 Python
python使用建议技巧分享(三)
2020/08/18 Python
兰蔻美国官网:Lancome美国
2017/04/25 全球购物
大学英语专业求职信
2014/06/21 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
小学生毕业评语
2014/12/26 职场文书
学校实习推荐信
2015/03/27 职场文书
葬礼主持词
2015/07/02 职场文书
golang interface判断为空nil的实现代码
2021/04/24 Golang
Node.js实现断点续传
2021/06/23 Javascript