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 相关文章推荐
js 实现菜单上下显示附效果图
Nov 21 Javascript
Javascript基础教程之定义和调用函数
Jan 18 Javascript
JavaScript学习笔记之基础语法
Jan 22 Javascript
jQuery实现左右切换焦点图
Apr 03 Javascript
location.hash保存页面状态的技巧
Apr 28 Javascript
JavaScript代码性能优化总结篇
May 15 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
Nov 07 Javascript
JavaScript字符串对象
Jan 14 Javascript
JS实现点击表头表格自动排序(含数字、字符串、日期)
Jan 22 Javascript
Vue.Draggable实现拖拽效果
Jul 29 Javascript
EXTJS7实现点击拖拉选择文本
Dec 17 Javascript
vue组件冲突之引用另一个组件出现组件不显示的问题
Apr 13 Vue.js
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
php实现可以设置中奖概率的抽奖程序代码分享
2014/01/19 PHP
twig模板获取全局变量的方法
2016/02/05 PHP
redirect_uri参数错误的解决方法(必看)
2017/02/16 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
filemanage功能中用到的common.js
2007/04/08 Javascript
javascript随机将第一个dom中的图片添加到第二个div中示例
2013/10/08 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
windows8.1+iis8.5下安装node.js开发环境
2014/12/12 Javascript
JavaScript Math.ceil 方法(对数值向上取整)
2015/01/09 Javascript
使用JavaScript开发IE浏览器本地插件实例
2015/02/18 Javascript
JavaScript中实现map功能代码分享
2015/06/11 Javascript
基于JS实现省市联动效果代码分享
2016/06/06 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
JAVA中截取字符串substring用法详解
2017/04/14 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
JavaScript之实现一个简单的Vue示例
2019/01/17 Javascript
微信小程序实现的一键拨号功能示例
2019/04/24 Javascript
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
2020/01/08 Javascript
vue 解决在微信内置浏览器中调用支付宝支付的情况
2020/11/09 Javascript
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python对字符串实现去重操作的方法示例
2017/08/11 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
使用pandas的DataFrame的plot方法绘制图像的实例
2018/05/24 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
python实现UDP协议下的文件传输
2020/03/20 Python
利用Python自动化操作AutoCAD的实现
2020/04/01 Python
python 实用工具状态机transitions
2020/11/21 Python
Html5上传图片 移动端、PC端通用代码
2016/06/08 HTML / CSS
中国领先的专业家电网购平台:国美在线
2016/12/25 全球购物
如何在Oracle中查看各个表、表空间占用空间的大小
2015/10/31 面试题
竞选班干部演讲稿
2014/04/24 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
node.js使用express-fileupload中间件实现文件上传
2021/07/16 Javascript