javascript与css3动画结合使用小结


Posted in Javascript onMarch 11, 2015

当Html5,css3已渐渐成为主流的时候,我还非常习惯的用js去做一些简单的动画。因为在桌面浏览器上, 并非所有的都支持css3。用户也倒是很奇怪,用户习惯并不是每个用户都可以被培养。总有不少人会觉得win7.win8没xp好用。但手机方面就大不一样了,手机浏览器对html5和css3的支持还是很不错的。但手机硬件处理能力却又十分有限。在四核、八核手机横行的今天,依然有像我这样使用双核或单核手机的。js虽好,单奈何接触不多,调不好那种感觉。一个简单的页面滑动,在i7的pc上运行十分流畅,可是,在我的双核手机上就卡、顿、卡、顿。令人十分郁闷。为此,我也是寻找了很久很久,看了很多很多。终于在不就之前,找到了一种还算简单的方法:使用css3去执行动画。

在以前,对于动画除了Jquery的animate等动画函数外,更多的是使用setTimeout,setInterval,这样循环的去改变一个元素的margin、width、top等属性。也正是如此,才有了我的困惑。

首先,setTimeout,setInterval 这货并非你设置0ms它就能一直一直的去执行。曾经在iscroll里调试的时候无意中发现了这个秘密。原来Timer延时的计算依靠的是浏览器的内置时钟,而时钟的精确度又取决于时钟更新的频率。IE8及其之前的IE版本更新间隔为15.6毫秒。完了,我想它10ms执行1px位移,它还不能准时的干这事。

而卡又是怎么回事呢?卡,因为代码写的不好。毕竟js是单线程的,一旦有耗时的动作那么UI就可能不响应了。虽然我们使用了setTimeout,但正是因为setTimeout让我们看上去界面没死可动作却又不流畅了。因为这次setTimeout执行之后,在下次执行前,中间这个间隔里很可能遇到另一个耗时的动作,那么,setTimeout的执行就无限后延。然后呢?卡!然而,卡还能有下一个原因,改变原始属性时不小心触发浏览器Layout(即:重布局)。这个问题说它不耗时呢,却又耗时,说它耗时呢,很多时候却又可以忽略。但很多时候其实是不能忽略的。

除了上面这两段,还有一个问题,就是在很多手机上总感觉是一帧一帧的,而且还可能是一帧长一帧短。这真是能把人都搞废的节奏。为何会这样呢,依然和settimeout的推迟有一定的关系。丢帧。这个问题有涉及到显示器的刷新频率问题。实在太复杂了。

最后选择了CSS3,js动态的改变元素的属性,使用transition来控制动画执行时间。举个例子:

<div id="test" style="transition:all 1s ease; width:100px;" ></div>

js:

$("#test").width(200);

这样1秒之后这个div的宽度会变成200px。不是孙悟空变桃子一样瞬间变大,慢慢的赶脚,不卡不顿。而且使用css动画有个好处,它不受耗时js的影响。虽然浏览器中UI线程与js线程是互斥,但这一点对css动画不成立,并且很多浏览器还能启用硬件加速(比如:Chrome)。虽然浏览器重布局普通情况下感觉不是很明显,但还是应该尽量避免大面积的重布局。so在动画元素上加上-webkit-transform: translateZ(0);或者-webkit-transform: translate3d(0,0,0);这样浏览器会独立渲染这一层。即便是重布局无法避免,这样面积也小些。而使用translate取代margin也确实是一个十分明智的决定。

最后附上一些常用的改变时会触发重布局的属性: 
 

width 

 
height 

 
padding 

 
margin 

 
display 

 
border-width 

 
border 

 
min-height

以上就是本文所述的全部内容了,希望对大家学习javascript和CSS3能够有所帮助,同时不足之处烦请补充,谅解。

Javascript 相关文章推荐
javascript 写类方式之九
Jul 05 Javascript
javascript实现的距离现在多长时间后的一个格式化的日期
Oct 29 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
深入理解javascript中return的作用
Dec 30 Javascript
jquery实现保存已选用户
Jul 21 Javascript
js分页工具实例
Jan 28 Javascript
介绍JavaScript中Math.abs()方法的使用
Jun 14 Javascript
JavaScipt选取文档元素的方法(推荐)
Aug 05 Javascript
JS中用try catch对代码运行的性能影响分析
Dec 26 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
Jul 20 Javascript
使用JavaScript和MQTT开发物联网应用示例解析
Aug 07 Javascript
react的hooks的用法详解
Oct 12 Javascript
jquery实现textarea 高度自适应
Mar 11 #Javascript
jQuery简单实现禁用右键菜单
Mar 10 #Javascript
jQuery判断数组是否包含了指定的元素
Mar 10 #Javascript
js控制文本框只输入数字和小数点的方法
Mar 10 #Javascript
jQuery实现当前页面标签高亮显示的方法
Mar 10 #Javascript
jQuery简单几行代码实现tab切换
Mar 10 #Javascript
jQuery实现高亮显示的方法
Mar 10 #Javascript
You might like
php 智能404跳转代码,适合换域名没改变目录的网站
2010/06/04 PHP
PHP笔记之:基于面向对象设计的详解
2013/05/14 PHP
PHP中调用C/C++制作的动态链接库的教程
2016/03/10 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
php中输出json对象的值(实现方法)
2018/03/07 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
javascript URL锚点取值方法
2009/02/25 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
基于jQuery的AJAX和JSON实现纯html数据模板
2016/08/09 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
深究AngularJS之ui-router详解
2017/06/13 Javascript
深入浅析Vue中的 computed 和 watch
2018/06/06 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
JS如何获取地址栏的参数实例讲解
2018/10/06 Javascript
vue2中引用及使用 better-scroll的方法详解
2018/11/15 Javascript
JS实现继承的几种常用方式示例
2019/06/22 Javascript
微信小程序实现组件顶端固定或底端固定效果(不随滚动而滚动)
2020/04/09 Javascript
Nodejs + sequelize 实现增删改查操作
2020/11/07 NodeJs
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
python自动化报告的输出用例详解
2018/05/30 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
python批量下载网站马拉松照片的完整步骤
2018/12/05 Python
python中p-value的实现方式
2019/12/16 Python
Python程序慢的重要原因
2020/09/04 Python
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
法学毕业生自荐信
2013/11/13 职场文书
简历里的自我评价
2014/01/31 职场文书
优秀经理获奖感言
2014/03/04 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
应届生求职自荐信范文
2015/03/04 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
建国大业观后感600字
2015/06/01 职场文书
让子弹飞观后感
2015/06/11 职场文书
各类场合主持词开场白范文集锦
2019/08/16 职场文书