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代码格式化和语法着色V2
Oct 14 Javascript
为指定的元素添加遮罩层的示例代码
Jan 15 Javascript
javasciprt下jquery函数$.post执行无响应的解决方法
Mar 13 Javascript
js中for in语句的用法讲解
Apr 24 Javascript
jQuery视差滚动效果网页实现方法经验总结
Sep 29 Javascript
Nginx 配置多站点vhost 的方法
Jan 07 Javascript
详解ES6 Symbol 的用途
Oct 14 Javascript
微信小程序实现获取准确的腾讯定位地址功能示例
Mar 27 Javascript
微信小程序 slot踩坑的解决
Apr 01 Javascript
基于vue实现web端超大数据量表格的卡顿解决
Apr 02 Javascript
vue+webpack 更换主题N种方案优劣分析
Oct 28 Javascript
浅谈react useEffect闭包的坑
Jun 08 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
mysql 搜索之简单应用
2007/04/27 PHP
PHP中SESSION使用中的一点经验总结
2012/03/30 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
PHP的Socket网络编程入门指引
2015/08/11 PHP
Thinkphp5结合layer弹窗定制操作结果页面
2017/07/07 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
PHP堆栈调试操作简单示例
2018/06/15 PHP
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
瀑布流布局代码一例
2014/04/11 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
《JavaScript函数式编程》读后感
2015/08/07 Javascript
基于jquery实现一个滚动的分步注册向导-附源码
2015/08/26 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
JS实现瀑布流布局
2017/10/21 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
基于Vue开发数字输入框组件
2017/12/19 Javascript
Javascript的console['']常用输入方法汇总
2018/04/26 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
vue生成文件本地打开查看效果的实例
2018/09/06 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
Python算法之栈(stack)的实现
2014/08/18 Python
python安装以及IDE的配置教程
2015/04/29 Python
wxPython使用系统剪切板的方法
2015/06/16 Python
python elasticsearch环境搭建详解
2019/09/02 Python
django rest framework使用django-filter用法
2020/07/15 Python
python中time tzset()函数实例用法
2021/02/18 Python
马来西亚奢侈品牌购物商城:Valiram 247
2020/09/29 全球购物
GWT的应用有哪两种部署模式
2012/12/21 面试题
机械专业毕业生自荐信
2013/11/02 职场文书
企业员工薪酬方案
2014/06/04 职场文书
高中16字霸气押韵班级口号集锦!
2019/06/27 职场文书
简短的人生哲理(38句)
2019/08/13 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
深入理解python协程
2021/06/15 Python