jQuery的animate函数学习记录


Posted in Javascript onAugust 08, 2014

很久之前就对jQuery animate的实现非常感兴趣,不过前段时间很忙,直到前几天端午假期才有时间去研究。

jQuery.animate的每种动画过渡效果都是通过easing函数实现的。jQuery1.4.2中就预置了两个这样的函数:

easing: {
linear: function( p, n, firstNum, diff ) {
return firstNum + diff * p;
},
swing: function( p, n, firstNum, diff ) {
return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
}
}

从参数名隐约可以推测出firstNum是初始值。要是你的数学学得比较好,你可以发现linear函数是直线方程;要是你的物理学得比较好,你可以发现它是匀速运动的位移方程(我数学和物理都没学好,是别人提醒我的……)。那么diff和p就是速度和时间了。

再看看jQuery.animate的原型:

animate: function( prop, speed, easing, callback )

各参数的说明如下:

prop:一组包含作为动画属性和终值的样式属性和及其值的集合。
speed:动画时长。
easing:要使用的擦除效果的名称。
callback:动画完成时执行的函数。

元素的当前样式值(firstNum)可以获取,动画时长(p)就是duration,最终样式值是prop。理论上说,动画速度(diff)是可以算出来的。但是这又必然需要另一个函数进行运算。这样做明显是不明智的。再看看调用easing函数的相关代码(位于jQuery.fx.prototype.step中):

var t = now();
...
var n = t - this.startTime;
this.state = n / this.options.duration;
...
this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);

可以发现,p参数的值也就是this.state的值,从上下文得知它实际上是动画的时间进度。而firstNum和diff的参数值都是写死的,分别是0和1。这下easing函数的秘密完全被解开,p、firstNum、diff都是百分率而非实际数值,easing函数的返回值也就是位移的进度。diff的值是1,也就是以1倍的速度运行动画。算出位移进度后,通过“初始值+(最终值-初始值)×进度”就可以算出当前位移值:

this.now = this.start + ((this.end - this.start) * this.pos);

通过setInterval每隔一定时间(jQuery中是13ms)进行一次位移运算,直到当前时间与初始时间的差值大于动画时长,这就是jQuery.animate的执行过程。

按照常规思路,动画的实现方式是这样的:通过setInterval每隔一定时间给某个值增加特定数值,直到这个值达到限制值。这样做的主要问题是,不同浏览器的运行速度不同,从而导致动画速度有差异,一般是IE下比较慢,Firefox下比较快。而jQuery.animate是以当前时间来决定位移值,某个时刻的位移值总是固定的,因而动画速度不会有差异。

Javascript 相关文章推荐
window.showModalDialog使用手册
Jan 11 Javascript
zepto.js中tap事件阻止冒泡的实现方法
Feb 12 Javascript
javascript实现输出指定行数正方形图案的方法
Aug 03 Javascript
AngularJS中使用HTML5手机摄像头拍照
Feb 22 Javascript
实现JavaScript的组成----BOM和DOM详解
May 18 Javascript
AngularJS 单选框及多选框的双向动态绑定
Apr 20 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
May 07 Javascript
微信小程序实现折叠面板
Jan 31 Javascript
vue中使用better-scroll实现滑动效果及注意事项
Nov 15 Javascript
vue列表单项展开收缩功能之this.$refs的详解
May 05 Javascript
Layui Form 自定义验证的实例代码
Sep 14 Javascript
工作中常用js功能汇总
Nov 07 Javascript
jQuery中get和post方法传值测试及注意事项
Aug 08 #Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
Aug 08 #Javascript
js事件监听机制(事件捕获)总结
Aug 08 #Javascript
使用jquery.qrcode生成彩色二维码实例
Aug 08 #Javascript
兼容最新firefox、chrome和IE的javascript图片预览实现代码
Aug 08 #Javascript
js调试工具console.log()方法查看js代码的执行情况
Aug 08 #Javascript
JS创建类和对象的两种不同方式
Aug 08 #Javascript
You might like
使用PHP获取网络文件的实现代码
2010/01/01 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
php构造方法中析构方法在继承中的表现
2016/04/12 PHP
PHP实现自动识别原编码并对字符串进行编码转换的方法
2016/07/13 PHP
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
jquery 图片上传按比例预览插件集合
2011/05/28 Javascript
javascript 循环调用示例介绍
2013/11/20 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
vue2.0开发实践总结之入门篇
2016/12/06 Javascript
AngularJS中的缓存使用
2017/01/11 Javascript
js实现楼层导航功能
2017/02/23 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
JS/HTML5游戏常用算法之碰撞检测 包围盒检测算法详解【矩形情况】
2018/12/13 Javascript
微信小程序返回箭头跳转到指定页面实例解析
2019/10/08 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
利用Python的Twisted框架实现webshell密码扫描器的教程
2015/04/16 Python
python文件写入write()的操作
2019/05/14 Python
Python空间数据处理之GDAL读写遥感图像
2019/08/01 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
德国狗狗用品在线商店:Schecker
2017/03/17 全球购物
怎样自定义一个异常类
2016/09/27 面试题
历史专业个人求职信分享
2013/12/20 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
法律系毕业生自荐信范文
2014/03/27 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
地方白酒代理协议书
2014/10/25 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
同学聚会邀请函
2015/01/30 职场文书
大学生就业意向书
2015/05/11 职场文书
祝福语集锦:给百岁老人祝寿贺词
2019/11/19 职场文书