javascript 流畅动画实现原理


Posted in Javascript onSeptember 08, 2009

当然考虑到浏览器(特别指IE)糟糕的js执行能力,动画效果又要受到影响。
浏览器中的动画效果主要依靠js来动态改变Dom元素外观来形成。不过据说css正在修炼这方面的能力哦。(拭目以待^_^)
我们需要周期性的改变dom元素的外观,这个周期性就要依靠setTimeout()和setInterval()来完成。
它们2个哪一个更好点呢 见这里 (是jquery的作者写的一个文章)
我个人比较偏向setInterval,setTimeout需要用递归调用而且在线程很忙的情况下会延时,这会影响流畅性。
通常我们会利用node.style的属性动态赋值,来更新页面表现,大家都知道每次的调用页面都会重绘。
还有一种同时改变多个属性的情况如下:
.......
node.style.height = 'value1',
node.style.width = 'value2',
node.style.top = value3"
......
这种情况下,
一个动画物体在每一格的运动中,页面会重绘3次,当属性越多每次重绘越多。
在ff,chrome中没有问题,但在ie中无可避免的出现闪烁现象。
如果可以把每一格动画,作为一次重绘就会好很多。
在ff下我们可以setAtrribute("style",objStyle);一次跟新多个属性。
但在ie下style是只读的,任何试图赋值都会让ie很生气并且,完全不鸟你。
这时候有个所有浏览器都支持的属性cssText就可以解决这个问题,
style.cssText接受内嵌格式的style的字符串,并且可以高效的同时重绘多个属性。
所以,我们可以把动画元素的多个属性利用cssText同时跟新,而不是用style.prop一个个的跟新。
如: node.cssText = "heigth:100px;width:100px;top:100px";
当然,动画的流畅还有以下注意点:
1.setInterval的实践证明,10是极限值,未来不一定,但现在一定不要设置小于10,不然浏览器会累死的。
2.把动画路径的所有值全部求出后,在用setInterval去定时更新,重绘元素的过程中不要有复杂计算。
3.还有就是完成一个动画一共有多少步,要和setInterval的时间参数,相互调节到最佳状态;
4.关于有多少步的算法,flash中有成熟的tween算法,google一下就有了,当然也可以自己实现。
最后,我觉得如果对js动画效果很感兴趣话,还犹豫什么,去动手一步步实现一个自己的"影片"吧,乐趣就在其中哦。
当遇到实现问题的时候,再去看看js流行框架是如何做到的。这就是生活嘛....

Javascript 相关文章推荐
可以文本显示的公告栏的js代码
Mar 11 Javascript
Javascript延迟执行实现方法(setTimeout)
Dec 30 Javascript
浅析XMLHttpRequest的缓存问题
Dec 13 Javascript
JS调用打印机功能简单示例
Nov 28 Javascript
js实现登录验证码
Dec 22 Javascript
flag和jq on 的绑定多个对象和方法(必看)
Feb 27 Javascript
bootstrap选项卡扩展功能详解
Jun 14 Javascript
lhgcalendar时间插件限制只能选择三个月的实现方法
Jul 03 Javascript
vue实现全选和反选功能
Aug 31 Javascript
JS中使用textPath实现线条上的文字
Dec 25 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
Sep 01 Javascript
vue-router之解决addRoutes使用遇到的坑
Jul 19 Javascript
javascript 定义初始化数组函数
Sep 07 #Javascript
javascript十个最常用的自定义函数(中文版)
Sep 07 #Javascript
javascript 获取select下拉列表值的代码
Sep 07 #Javascript
Javascript中的var_dump函数实现代码
Sep 07 #Javascript
jquery tools系列 expose 学习
Sep 06 #Javascript
jquery tools 系列 scrollable(2)
Sep 06 #Javascript
jquery tools 系列 scrollable学习
Sep 06 #Javascript
You might like
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
Laravel 批量更新多条数据的示例
2017/11/27 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
PHP filesize函数用法浅析
2019/02/15 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
Javascript 定时器调用传递参数的方法
2009/11/12 Javascript
jQuery timers计时器简单应用说明
2010/10/28 Javascript
关于jQuery $.isNumeric vs. $.isNaN vs. isNaN
2013/04/15 Javascript
JavaScript设置IFrame高度自适应(兼容各主流浏览器)
2013/06/05 Javascript
如何防止回车(enter)键提交表单
2014/05/11 Javascript
JavaScript中标识符提升问题
2015/06/11 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
浏览器事件循环与vue nextTicket的实现
2019/04/16 Javascript
微信小程序实现上传多张图片、删除图片
2020/07/29 Javascript
Python实现根据IP地址和子网掩码算出网段的方法
2015/07/30 Python
简单谈谈python中的语句和语法
2017/08/10 Python
Python字符串逆序的实现方法【一题多解】
2019/02/18 Python
python修改字典键(key)的方法
2019/08/05 Python
python selenium循环登陆网站的实现
2019/11/04 Python
Python实现搜索算法的实例代码
2020/01/02 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
装潢设计实习自我鉴定
2013/09/19 职场文书
物流专业大学的自我评价
2014/01/11 职场文书
车辆安全检查制度
2014/01/12 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
提拔干部考察材料
2014/05/26 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
平凡的世界读书笔记
2015/06/25 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
使用CSS实现小三角边框原理解析
2021/11/07 HTML / CSS
python实现手机推送 代码也就10行左右
2022/04/12 Python
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android