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 相关文章推荐
Jquery AutoComplete自动完成 的使用方法实例
Mar 19 Javascript
JavaScript Memoization 让函数也有记忆功能
Oct 27 Javascript
Jquery图片滚动与幻灯片的实例代码
Apr 08 Javascript
jQuery向后台传入json格式数据的方法
Feb 13 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
JSP防止网页刷新重复提交数据的几种方法
Nov 19 Javascript
详解js前端代码异常监控
Jan 11 Javascript
SpringMVC+bootstrap table实例详解
Jun 02 Javascript
javascript  数组排序与对象排序的实例
Jul 17 Javascript
详细教你微信公众号正文页SVG交互开发技巧
Jul 25 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
Sep 05 Javascript
vuex页面刷新导致数据丢失的解决方案
Dec 10 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+MySQL的聊天室设计
2006/10/09 PHP
PHP 多进程 解决难题
2009/06/22 PHP
PHP查找与搜索数组元素方法总结
2015/06/12 PHP
WordPress中用于获取搜索表单的PHP函数使用解析
2016/01/05 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
javascript Firefox与IE 替换节点的方法
2010/02/24 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
jquery 页面滚动到底部自动加载插件集合
2014/01/31 Javascript
jquery自动将form表单封装成json的具体实现
2014/03/17 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
Jquery数字上下滚动动态切换插件
2015/08/08 Javascript
用户代理字符串userAgent可实现的四个识别
2015/09/20 Javascript
基于jquery实现瀑布流布局
2020/06/28 Javascript
jquery获取文档高度和窗口高度汇总
2016/01/25 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
JavaScript评论点赞功能的实现方法
2017/03/13 Javascript
BootStrap daterangepicker 双日历控件
2017/06/02 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
Windows上node.js的多版本管理工具用法实例分析
2019/11/06 Javascript
[00:32]2018DOTA2亚洲邀请赛Liquid出场
2018/04/03 DOTA
[01:01:36]Optic vs paiN 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python实现简单的TCP代理服务器
2014/10/08 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
python读取word 中指定位置的表格及表格数据
2019/10/23 Python
python使用smtplib模块发送邮件
2020/12/17 Python
养殖人员的创业计划书范文
2013/12/26 职场文书
给国外客户的邀请函
2014/01/30 职场文书
进步之星获奖感言
2014/02/22 职场文书
父亲节活动总结
2015/02/12 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
Pytest之测试命名规则的使用
2021/04/16 Python
Redis入门基础常用操作命令整理
2022/06/01 Redis