深入理解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闪亮进度条效果实现思路及代码
Apr 17 HTML / CSS
CSS3网格的三个新特性详解
Apr 04 HTML / CSS
CSS3中使用RGBa来调节透明度的教程
May 09 HTML / CSS
利用CSS3实现开门效果实例源码
Aug 22 HTML / CSS
HTML5之HTML元素扩展(下)—增强的Form表单元素值得关注
Jan 31 HTML / CSS
HTML5实现经典坦克大战坦克乱走还能发出一个子弹
Sep 02 HTML / CSS
html5 css3网站菜单实现代码
Dec 23 HTML / CSS
HTML5不支持标签和新增标签详解
Jun 27 HTML / CSS
Html5页面中的返回实现的方法
Feb 26 HTML / CSS
使用css样式设计一个简单的html登陆界面的实现
Mar 30 HTML / CSS
详解CSS不定宽溢出文本适配滚动
May 24 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游戏编程25个脚本代码
2011/02/08 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
2014/06/25 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
thinkPHP框架动态配置用法实例分析
2018/06/14 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
ASP.NET jQuery 实例13 原创jQuery文本框字符限制插件-TextArea Counter
2012/02/03 Javascript
jQuery队列操作方法实例
2014/06/11 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
Angular.js中window.onload(),$(document).ready()的写法浅析
2017/09/28 Javascript
vue组件传递对象中实现单向绑定的示例
2018/02/28 Javascript
JS封装的模仿qq右下角消息弹窗功能示例
2018/08/22 Javascript
vue单页应用的内存泄露定位和修复问题小结
2019/08/02 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
在python中利用最小二乘拟合二次抛物线函数的方法
2018/12/29 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
python 实现图像快速替换某种颜色
2020/06/04 Python
python中如何写类
2020/06/29 Python
Python descriptor(描述符)的实现
2020/11/15 Python
Python实现京东抢秒杀功能
2021/01/25 Python
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
优秀实习自我鉴定
2013/12/04 职场文书
银行求职信个人范文
2013/12/16 职场文书
贸易跟单员英文求职信
2014/04/19 职场文书
工作粗心大意检讨书
2014/09/18 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
原料仓管员岗位职责
2015/04/01 职场文书
2015年妇幼卫生工作总结
2015/05/23 职场文书
React中的Context应用场景分析
2021/06/11 Javascript
MySQL深度分页(千万级数据量如何快速分页)
2021/07/25 MySQL
如何Python使用re模块实现okenizer
2022/04/30 Python