深入理解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 相关文章推荐
a标签的css样式四个状态
Mar 09 HTML / CSS
移动Web—CSS为Retina屏幕替换更高质量的图片
Dec 24 HTML / CSS
详解CSS3的box-shadow属性制作边框阴影效果的方法
May 10 HTML / CSS
总结30个CSS3选择器
Apr 13 HTML / CSS
使用phonegap检测网络状态的方法
Mar 30 HTML / CSS
Bootstrap 学习分享
Nov 12 HTML / CSS
编写html5时调试发现脚本php等网页js、css等失效
Dec 31 HTML / CSS
html5+css3气泡组件的实现
Nov 21 HTML / CSS
html5实现输入框fixed定位在屏幕最底部兼容性
Jul 03 HTML / CSS
html5小程序飞入购物车(抛物线绘制运动轨迹点)
Oct 19 HTML / CSS
原生CSS实现文字无限轮播的通用方法
Mar 30 HTML / CSS
HTML页面滚动时部分内容位置固定不滚动的实现
Apr 14 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版
2012/04/20 PHP
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
PHP模拟post提交数据方法汇总
2016/02/16 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
div模拟选择框示例代码
2013/11/03 Javascript
扩展IE中一些不兼容的方法如contains、startWith等等
2014/01/09 Javascript
基于jquery实现简单的手风琴特效
2015/11/24 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
2016/02/17 Javascript
jQuery fancybox在ie浏览器下无法显示关闭按钮的解决办法
2016/02/19 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
Bootstrap学习笔记之环境配置(1)
2016/12/07 Javascript
微信小程序商城项目之购物数量加减(3)
2017/04/17 Javascript
jQuery Masonry瀑布流布局神器使用详解
2017/05/25 jQuery
深究AngularJS中$sce的使用
2017/06/12 Javascript
Vue插件之滑动验证码用法详解
2020/04/05 Javascript
JavaScript直接调用函数与call调用的区别实例分析
2020/05/22 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
python实现ftp客户端示例分享
2014/02/17 Python
python中将函数赋值给变量时需要注意的一些问题
2017/08/18 Python
Python爬虫的两套解析方法和四种爬虫实现过程
2018/07/20 Python
意大利专业化妆品品牌:KIKO MILANO
2017/02/01 全球购物
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
Ejb技术面试题
2015/04/29 面试题
企业行政文员岗位职责
2013/12/03 职场文书
温馨提示标语
2014/06/26 职场文书
收入证明申请书
2015/06/12 职场文书
严以用权学习心得体会
2016/01/12 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
python unittest单元测试的步骤分析
2021/08/02 Python