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 类型转换方法
Oct 24 Javascript
jQuery.each()用法分享
Jul 31 Javascript
javascript自定义startWith()和endWith()的两种方法
Nov 11 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
Feb 24 Javascript
js怎么判断flash swf文件是否加载完毕
Aug 14 Javascript
微信JS接口大全
Aug 25 Javascript
JavaScript实现格式化字符串函数String.format
Dec 16 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
Mar 28 Javascript
微信小程序 slot踩坑的解决
Apr 01 Javascript
vue指令之表单控件绑定v-model v-model与v-bind结合使用
Apr 17 Javascript
javascript设计模式 ? 适配器模式原理与应用实例分析
Apr 13 Javascript
vue数据字典取键值项目的字典问题
Apr 12 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
php牛逼的面试题分享
2013/01/18 PHP
php中创建和调用webservice接口示例
2014/07/25 PHP
PHP实现即时输出、实时输出内容方法
2015/05/27 PHP
CL vs ForZe BO5 第五场 2.13
2021/03/10 DOTA
js的延迟执行问题分析
2014/06/23 Javascript
js监听鼠标点击和键盘点击事件并自动跳转页面
2014/09/24 Javascript
node.js超时timeout详解
2014/11/26 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
Vue 项目代理设置的优化
2018/04/17 Javascript
vue操作下拉选择器获取选择的数据的id方法
2018/08/24 Javascript
vue2.0 路由模式mode="history"的作用
2018/10/18 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
jQuery 选择器用法实例分析【prev + next】
2020/05/22 jQuery
Windows下安装python MySQLdb遇到的问题及解决方法
2017/03/16 Python
Python自动化开发学习之三级菜单制作
2017/07/14 Python
python爬虫获取百度首页内容教学
2018/12/23 Python
Python一行代码实现快速排序的方法
2019/04/30 Python
python3模拟实现xshell远程执行liunx命令的方法
2019/07/12 Python
利用python实现短信和电话提醒功能的例子
2019/08/08 Python
python实现简单学生信息管理系统
2020/04/09 Python
keras中模型训练class_weight,sample_weight区别说明
2020/05/23 Python
使用Python Tkinter实现剪刀石头布小游戏功能
2020/10/23 Python
英国在线自行车商店:Evans Cycles
2016/09/26 全球购物
瑰珀翠美国官网:Crabtree & Evelyn美国
2016/11/29 全球购物
为什么Runtime.exec(“ls”)没有任何输出?
2014/10/03 面试题
转党组织关系介绍信
2014/01/08 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
火车来了教学反思
2014/02/11 职场文书
《沉香救母》教学反思
2014/04/19 职场文书
学校教师安全责任书
2014/07/23 职场文书
2014年小学班主任工作总结
2014/11/08 职场文书
先进党员事迹材料
2014/12/24 职场文书
Java中使用Filter过滤器的方法
2021/06/28 Java/Android
Maven学习----Maven安装与环境变量配置教程
2021/06/29 Java/Android
Golang表示枚举类型的详细讲解
2021/09/04 Golang