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 相关文章推荐
parseInt parseFloat js字符串转换数字
Aug 01 Javascript
input 和 textarea 输入框最大文字限制的jquery插件
Oct 27 Javascript
Javascript根据指定下标或对象删除数组元素
Dec 21 Javascript
Javascript实现鼠标右键特色菜单
Aug 04 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
Dec 07 Javascript
JavaScript事件代理和委托详解
Apr 08 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
May 05 Javascript
JS未跨域操作iframe里的DOM
Jun 01 Javascript
BootStrap tooltip提示框使用小结
Oct 26 Javascript
使用express搭建一个简单的查询服务器的方法
Feb 09 Javascript
详解element上传组件before-remove钩子问题解决
Apr 08 Javascript
聊聊JS ES6中的解构
Apr 29 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高级对象构建 多个构造函数的使用
2012/02/05 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
比较详细的关于javascript中void(0)的具体含义解释
2007/08/02 Javascript
javascript获取鼠标点击元素对象(示例代码)
2013/12/20 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
Javascript基础回顾之(三) js面向对象
2017/01/31 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
nodejs中使用archive压缩文件的实现代码
2019/11/26 NodeJs
用Python实现QQ游戏大家来找茬辅助工具
2014/09/14 Python
使用python实现正则匹配检索远端FTP目录下的文件
2015/03/25 Python
Django中的“惰性翻译”方法的相关使用
2015/07/27 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
python字典的常用操作方法小结
2016/05/16 Python
Python中functools模块函数解析
2017/03/12 Python
python清理子进程机制剖析
2017/11/23 Python
pyshp创建shp点文件的方法
2018/12/31 Python
在PyCharm中批量查找及替换的方法
2019/01/20 Python
详解将Pandas中的DataFrame类型转换成Numpy中array类型的三种方法
2019/07/06 Python
Python 元组操作总结
2019/09/18 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
Python 删除List元素的三种方法remove、pop、del
2020/11/16 Python
python爬虫判断招聘信息是否存在的实例代码
2020/11/20 Python
html5 标签
2009/07/16 HTML / CSS
html5 拖拽上传图片实例演示
2013/04/01 HTML / CSS
元旦活动感言
2014/03/08 职场文书
高中学校对照检查材料
2014/08/31 职场文书
初级党校心得体会
2014/09/11 职场文书
2014乡镇领导班子四风对照检查材料思想汇报
2014/10/05 职场文书
2014年学生会主席工作总结
2014/11/07 职场文书
2019年汽车租赁合同范本!
2019/08/12 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
Spring Data JPA框架自定义Repository接口
2022/04/28 Java/Android