深入理解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滤镜的filter:blur属性制作毛玻璃模糊效果的方法
Jul 08 HTML / CSS
浅谈css3中的渐进增强和优雅降级
Dec 01 HTML / CSS
简单几步用纯CSS3实现3D翻转效果
Jan 17 HTML / CSS
HTML5 微格式和相关的属性名称
Feb 10 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
Apr 14 HTML / CSS
使用HTML5在网页中嵌入音频和视频播放的基本方法
Feb 22 HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
Mar 22 HTML / CSS
HTML5无刷新改变当前url的代码
Mar 15 HTML / CSS
HTML5中的拖放实现详解
Aug 23 HTML / CSS
AmazeUI 单选框和多选框的实现示例
Aug 18 HTML / CSS
详解HTML5中CSS外观属性
Sep 10 HTML / CSS
table不让td文字溢出操作方法
Dec 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
德生H-501的评价与改造
2021/03/02 无线电
中英文字符串翻转函数
2008/12/09 PHP
Yii框架参数化查询中IN查询只能查询一个的解决方法
2017/05/20 PHP
php获取文章内容第一张图片的方法示例
2017/07/03 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
Jquery easyui 实现动态树
2015/11/17 Javascript
JS实现密码框根据焦点的获取与失去控制文字的消失与显示效果
2015/11/26 Javascript
利用Node.js制作爬取大众点评的爬虫
2016/09/22 Javascript
jquery删除数组中重复元素
2016/12/05 Javascript
详谈for循环里面的break和continue语句
2017/07/20 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
微信小程序实现tab页面切换功能
2018/07/13 Javascript
jQuery实现动态添加和删除input框代码实例
2019/03/29 jQuery
Python下的subprocess模块的入门指引
2015/04/16 Python
目前最全的python的就业方向
2018/06/05 Python
python实现多进程代码示例
2018/10/31 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
Django REST Framework序列化外键获取外键的值方法
2019/07/26 Python
使用pandas读取文件的实现
2019/07/31 Python
python编写简单端口扫描器
2019/09/04 Python
用python打开摄像头并把图像传回qq邮箱(Pyinstaller打包)
2020/05/17 Python
python报错: 'list' object has no attribute 'shape'的解决
2020/07/15 Python
澳大利亚领先的运动鞋商店:Hype DC
2018/03/31 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
公司年会晚宴演讲稿
2014/01/06 职场文书
公司任命书模板
2014/06/06 职场文书
学校党的群众路线教育实践活动对照检查材料
2014/09/24 职场文书
优秀班组事迹材料
2014/12/24 职场文书
法院答辩状格式
2015/05/22 职场文书
学习经验交流会总结
2015/11/02 职场文书
小学生法制教育心得体会
2016/01/14 职场文书
Python 如何将integer转化为罗马数(3999以内)
2021/06/05 Python
MYSQL 运算符总结
2021/11/11 MySQL