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对象是否拥有某一个属性的js代码
Aug 16 Javascript
jquery实现盒子下拉效果示例代码
Sep 12 Javascript
jquery+正则实现统一的表单验证
Sep 20 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 Javascript
Canvas + JavaScript 制作图片粒子效果
Feb 08 Javascript
Vue 2.X的状态管理vuex记录详解
Mar 23 Javascript
JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)
Mar 29 Javascript
使用原生js写ajax实例(推荐)
May 31 Javascript
Vue实现移动端左右滑动效果的方法
Nov 27 Javascript
Javascript迭代、递推、穷举、递归常用算法实例讲解
Feb 01 Javascript
在Uni中使用Vue的EventBus总线机制操作
Jul 31 Javascript
vue 获取到数据但却渲染不到页面上的解决方法
Nov 19 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
Laravel框架自定义公共函数的引入操作示例
2019/04/16 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
javascript 二分法(数组array)
2010/04/24 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
JS中把字符转成ASCII值的函数示例代码
2013/11/21 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
一个仿微博登陆邮箱提示框js开发案例
2016/07/28 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
element el-input directive数字进行控制
2018/10/11 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
2019/03/27 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python BeautifulSoup中文乱码问题的2种解决方法
2014/04/22 Python
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
详解flask入门模板引擎
2018/07/18 Python
python多进程实现文件下载传输功能
2018/07/28 Python
selenium+python自动化测试之鼠标和键盘事件
2019/01/23 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
Python3+selenium配置常见报错解决方案
2020/08/28 Python
python中uuid模块实例浅析
2020/12/29 Python
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
构造方法和其他方法的区别
2016/04/26 面试题
承办会议欢迎词
2014/01/17 职场文书
2014年公司植树节活动方案
2014/03/04 职场文书
什么是就业协议书
2014/04/17 职场文书
学习十八大宣传标语
2014/10/09 职场文书
Java 数据结构七大排序使用分析
2022/04/02 Java/Android
MySQL的prepare使用以及遇到的bug
2022/05/11 MySQL