深入理解css属性的选择对动画性能的影响


Posted in HTML / CSS onApril 20, 2016

现在手机的占比越来越高,各种酷炫页面层出不穷,这些特效都离不开css动画。说到css动画,主流的情况也就无非这两大类:位移和形变。而我们在写一个动画特效的过程中,如何去提升它的性能呢?当然首先我们需要去了解一下基本的概念,比如浏览器渲染的工作原理等,这些我也在读了几位大牛写的相关文章后才有了一定的了解,这边我也不细说了,有兴趣的同学可以去了解一下。本次的目的简单粗暴地讲,其实就是我们应该使用什么css属性去进行动画的绘制时,能够有效的提高浏览器在渲染和绘制过程中的性能。

分别使用了left和transform在2秒内向右平移了500px的位移。代码如下:

JavaScript Code复制内容到剪贴板
  1. <style>   
  2. .box-ps,.box-tf{position:absolute;top:0;left:0;width:100px;height:100px;background-color:red;}   
  3. .box-ps{-webkit-animation:box-ps 2s linear;}   
  4. .box-tf{-webkit-animation:box-tf 2s linear;}   
  5.   
  6. @-webkit-keyframes box-ps{   
  7. 0%{   
  8. left:0;   
  9. }100%{   
  10. left:500px;   
  11. }   
  12. }   
  13.   
  14. @-webkit-keyframes box-tf{   
  15. 0%{   
  16. -webkit-transform:translate(0,0);   
  17. }100%{   
  18. -webkit-transform:translate(500px,0);   
  19. }   
  20. }   
  21. </style>   
  22.   
  23. <body>   
  24. <div class="box-ps"></div>   
  25. <div class="box-tf"></div>   
  26. </body>  

然后在chrome下得到了如下的结果,第一张为使用left的截图,第二张为使用transform的截图:

深入理解css属性的选择对动画性能的影响

transform的截图

深入理解css属性的选择对动画性能的影响

 

显而易见,我们在帧模式这里可以看到left比transform帧数要低,而且在渲染和绘制这边的耗时,left要远远的大于transform。看到这里,相信大家心里已经有结论了。
我们再利用chrome的show paint rectangles来观察一下两者在动画过程中,渲染和绘制的区域有何差异,第一张为使用left的截图,第二张为使用transform的截图:

深入理解css属性的选择对动画性能的影响

transform的截图

深入理解css属性的选择对动画性能的影响

我们可以看到,使用left写的整个动画过程中,浏览器一直在进行绘制处理。而相对而言,使用transform时,仅仅是在动画开始和结束是进行了绘制。因此,对于动画的性能上,transform要更为出色。至于原因,这里就要引入一个触发重新布局的概念:

我们在改变一些属性时,如果是跟layout相关的属性,则会触发重新布局,导致渲染和绘制所需要的时间将会更长。因此,我们在写动画的时候因该规避这些属性:width, height, margin, padding, border, display, top, right, bottom ,left, position, float, overflow等。
不会出发重新布局的属性有:transform(其中的translate, rotate, scale), color, background等。

所以,我们平时在写css动画时,应该优先使用不触发重新布局的属性,这样可以使我们所展示动画效果的更加流畅。

以上这篇深入理解css属性的选择对动画性能的影响就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

原文地址:http://www.cnblogs.com/dehua-chen/archive/2016/04/20/5411728.html

HTML / CSS 相关文章推荐
CSS3 3D立方体效果示例-transform也不过如此
Dec 05 HTML / CSS
纯CSS3发光分享按钮的实现教程
Sep 06 HTML / CSS
推荐一些比较有用的css3新属性
Nov 11 HTML / CSS
利用CSS3的transition属性实现滑动效果
Aug 05 HTML / CSS
用CSS3实现无限循环的无缝滚动的实例代码
Jul 04 HTML / CSS
HTML5之SVG 2D入门2—图形绘制(基本形状)介绍及使用
Jan 30 HTML / CSS
利用HTML5实现使用按钮控制背景音乐开关
Sep 21 HTML / CSS
如何避免常见的6种HTML5错误用法
Nov 06 HTML / CSS
Html5 video标签视频的最佳实践
Feb 26 HTML / CSS
HTML5 背景的显示区域实现
Jul 09 HTML / CSS
完美实现CSS垂直居中的11种方法
Mar 27 HTML / CSS
html,css,javascript是怎样变成页面的
May 07 HTML / CSS
CSS中越界问题的经典解决方案【推荐】
Apr 19 #HTML / CSS
css3 中的新特性加强记忆详解
Apr 16 #HTML / CSS
前端隐藏出边界内容的实现方法
Apr 14 #HTML / CSS
使用CSS3编写类似iOS中的复选框及带开关的按钮
Apr 11 #HTML / CSS
基础的CSS3弹性盒Flexbox布局使用实例
Apr 08 #HTML / CSS
CSS3的Flexbox布局的简明入门指南
Apr 08 #HTML / CSS
使用CSS3设计地图上的雷达定位提示效果
Apr 05 #HTML / CSS
You might like
PHP新手上路(二)
2006/10/09 PHP
MySQL连接数超过限制的解决方法
2011/07/17 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
yii gridview实现时间段筛选功能
2017/08/15 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
JS打印gridview实现原理及代码
2013/02/05 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
使用AngularJS 应用访问 Android 手机的图片库
2015/03/24 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
nodejs+express搭建多人聊天室步骤
2018/02/12 NodeJs
JavaScript常用内置对象用法分析
2019/07/09 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
解决vue自定义全局消息框组件问题
2019/11/22 Javascript
python pickle 和 shelve模块的用法
2013/09/16 Python
Python 中的 else详解
2016/04/23 Python
Python星号*与**用法分析
2018/02/02 Python
Python异常处理操作实例详解
2018/05/10 Python
CentOS下Python3的安装及创建虚拟环境的方法
2018/11/28 Python
解决PyCharm控制台输出乱码的问题
2019/01/16 Python
对Python协程之异步同步的区别详解
2019/02/19 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
python实现输出一个序列的所有子序列示例
2019/11/18 Python
pymysql 插入数据 转义处理方式
2020/03/02 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
丹麦优惠购物网站:PLUSSHOP
2019/03/24 全球购物
分公司经理岗位职责
2013/11/11 职场文书
工程业务员工作职责
2013/12/07 职场文书
社会实践心得体会
2014/01/03 职场文书
生日寿宴答谢词
2014/01/19 职场文书
宝宝周岁宴答谢词
2014/01/26 职场文书
2014年社区植树节活动方案
2014/02/28 职场文书
中介公司区域经理岗位职责范本
2014/03/02 职场文书
毕业生党员个人总结
2015/02/14 职场文书
九不准学习心得体会
2016/01/23 职场文书
css3 选择器
2022/05/11 HTML / CSS