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 相关文章推荐
用javascript实现的激活输入框后隐藏初始内容
Jun 29 Javascript
jQuery 使用手册(六)
Sep 23 Javascript
使用js在页面中绘制表格核心代码
Sep 16 Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
js重写alert控件(适合学习js的新手朋友)
Aug 24 Javascript
JavaScript监听和禁用浏览器回车事件实例
Jan 31 Javascript
在Javascript中处理数组之toSource()方法的使用
Jun 09 Javascript
javascript iframe跨域详解
Oct 26 Javascript
js/jq仿window文件夹框选操作插件
Mar 08 Javascript
Angular Excel 导入与导出的实现代码
Apr 17 Javascript
extjs图形绘制之饼图实现方法分析
Mar 06 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
PHP 面向对象 final类与final方法
2010/05/05 PHP
Jquery选择器 $实现原理
2009/12/02 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
jQuery简单实现图片预加载
2015/04/20 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
js插件dropload上拉下滑加载数据实例解析
2016/07/27 Javascript
微信小程序基于本地缓存实现点赞功能的方法
2017/12/18 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
[03:39]2015国际邀请赛主赛事首日精彩回顾
2015/08/05 DOTA
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
python使用socket向客户端发送数据的方法
2015/04/29 Python
Python实现建立SSH连接的方法
2015/06/03 Python
Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】
2017/09/28 Python
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
python批量修改图片大小的方法
2018/07/24 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
python爬虫之爬取百度音乐的实现方法
2019/08/24 Python
Python 导入文件过程图解
2019/10/15 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
美国珠宝精品店:Opulent Jewelers
2019/08/20 全球购物
应届毕业生应聘自荐信
2013/12/07 职场文书
班风口号
2014/06/18 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
公司领导班子对照材料
2014/08/18 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
2015大学生党员自我评价范文
2015/03/03 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
2015年高校图书馆工作总结
2015/04/30 职场文书
Python类方法总结讲解
2021/07/26 Python