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 相关文章推荐
Javascript中获取出错代码所在文件及行数的代码
Sep 23 Javascript
jQuery Jcrop插件实现图片选取功能
Nov 23 Javascript
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
Jan 15 Javascript
JS添加删除一组文本框并对输入信息加以验证判断其正确性
Apr 11 Javascript
一款基jquery超炫的动画导航菜单可响应单击事件
Nov 02 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
Apr 07 Javascript
基于jQuery实现响应式圆形图片轮播特效
Nov 25 Javascript
详解Vue.js入门环境搭建
Mar 17 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
Jul 31 Javascript
es6数值的扩展方法
Mar 11 Javascript
微信小程序 slot踩坑的解决
Apr 01 Javascript
vue如何清除浏览器历史栈
May 25 Vue.js
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
星际争霸教主Flash的ID由来:你永远不会知道他之前的ID是www!
2019/01/18 星际争霸
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
阿里对象存储OSS在laravel框架中的使用方法
2019/10/13 PHP
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
详解WordPress开发中get_current_screen()函数的使用
2016/01/11 Javascript
jQuery插件datatables使用教程
2016/04/21 Javascript
js获取Get值的方法
2016/09/29 Javascript
js判断浏览器是否支持严格模式的方法
2016/10/04 Javascript
angularjs 表单密码验证自定义指令实现代码
2016/10/27 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
angularjs点击图片放大实现上传图片预览
2017/02/24 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
使用cropper.js裁剪头像的实例代码
2017/09/29 Javascript
微信小程序使用input组件实现密码框功能【附源码下载】
2017/12/11 Javascript
vue element-ui 绑定@keyup事件无效的解决方法
2018/03/09 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
python中pygame模块用法实例
2014/10/09 Python
Python查找函数f(x)=0根的解决方法
2015/05/07 Python
Python while 循环使用的简单实例
2016/06/08 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
pandas读取CSV文件时查看修改各列的数据类型格式
2019/07/07 Python
django框架cookie和session用法实例详解
2019/12/10 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
猫途鹰:全球领先的旅游点评社区
2017/04/07 全球购物
物流司机岗位职责
2013/12/28 职场文书
保护环境的标语
2014/06/09 职场文书
我的中国梦演讲稿300字
2014/08/19 职场文书
端午节活动总结
2014/08/26 职场文书
导游词之凤凰古城
2019/10/22 职场文书
详解python的内存分配机制
2021/05/10 Python