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 相关文章推荐
SpringMVC返回json数据的三种方式
Dec 10 Javascript
JS结合bootstrap实现基本的增删改查功能
Jul 22 Javascript
canvas滤镜效果实现代码
Feb 06 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
深入理解Javascript中的观察者模式
Feb 20 Javascript
集成vue到jquery/bootstrap项目的方法
Feb 10 jQuery
JS 数组随机洗牌的实例代码
Sep 12 Javascript
原生js实现公告滚动效果
Jan 10 Javascript
Vuex 模块化使用详解
Jul 31 Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
Vue简单封装axios之解决post请求后端接收不到参数问题
Feb 16 Javascript
Jquery Fade用法详解
Nov 06 jQuery
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和javascript之间变量的传递实现代码
2012/12/19 PHP
PHP Global定义全局变量使用说明
2013/08/15 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
php双层循环(九九乘法表)
2017/10/23 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
js 新浪的一个图片播放图片轮换效果代码
2008/07/15 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
javascript转换静态图片,增加粒子动画效果
2015/05/28 Javascript
Javascript生成带参数的二维码示例
2016/10/10 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
jquery实现折叠菜单效果【推荐】
2017/03/08 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
JS实现的图片选择顺序切换和循环切换功能示例【测试可用】
2018/12/28 Javascript
JavaScript实现简单计算器
2020/03/19 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
python实现下载指定网址所有图片的方法
2015/08/08 Python
tensorflow 输出权重到csv或txt的实例
2018/06/14 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
2019/02/14 Python
Django中多种重定向方法使用详解
2019/07/17 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
Python: glob匹配文件的操作
2020/12/11 Python
Expedia爱尔兰:酒店、机票、租车及廉价假期
2017/01/02 全球购物
W Concept美国:精选全球独立设计师
2017/02/22 全球购物
iHerb香港:维生素、补充剂和天然保健品
2017/08/01 全球购物
澳大利亚Mocha官方网站:包、钱包、珠宝和配饰
2019/07/18 全球购物
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
森林防火工作方案
2014/02/14 职场文书
谢师宴答谢词
2015/01/05 职场文书
煤矿安全保证书
2015/02/27 职场文书
党支部培养考察意见
2015/06/02 职场文书
出生证明格式
2015/06/15 职场文书
分享:关于学习的励志名言赏析
2019/08/16 职场文书
新手必备Python开发环境搭建教程
2021/05/28 Python
Vue+Flask实现图片传输功能
2022/04/01 Vue.js