css属性的选择对动画性能的影响

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

快速进入主题,大家先来看个demo。我分别使用了left和transform在2秒内向右平移了500px的位移。代码如下:

<style>
.box-ps,.box-tf{position:absolute;top:0;left:0;width:100px;height:100px;background-color:red;}
.box-ps{-webkit-animation:box-ps 2s linear;}
.box-tf{-webkit-animation:box-tf 2s linear;}

@-webkit-keyframes box-ps{
0%{
left:0;
}100%{
left:500px;
}
}

@-webkit-keyframes box-tf{
0%{
-webkit-transform:translate(0,0);
}100%{
-webkit-transform:translate(500px,0);
}
}
</style>

<body>
<div class="box-ps"></div>
<div class="box-tf"></div>
</body>

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

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

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

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

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

--摘自携程 http://ued.ctrip.com/blog/css-properties-selection-influence-on-performance-of-animation.html

时间: 2024-10-15 03:13:24

css属性的选择对动画性能的影响的相关文章

jquery学习 - jquery选择孩子元素和个数/获取css属性

选择器 选择孩子元素和css属性 获得孩子元素的个数 选择器 jquery的选择器很强大,可以的话,能用jquery的时候,真的是非常方便. 选择孩子元素和css属性 先看下面的代码: SelectColor = $(ColorId).children('svg').children('rect').css('fill'); 这个代码很容易懂.首先: ColorId = $("#id"); svg是一个子元素的标签. rect是svg下的子元素 fill是rect的一个css属性 可以

容易忘记的css属性和动画属性

动画属性 @keyframes 关键帧 --> animation 活泼 (配合使用) transform 变换 --> transition 过渡 (配合使用) 1.animation animation : name,完成时间,速度曲线,延迟时间,播放次数,轮流反向播放动画 animation : name,5s,linear,infinite 属性作用介绍 animation-name 规定需要绑定到选择器的 keyframe 名称. animation-duration 规定完成动画所

CSS属性简表(伸缩盒、变换、过渡、动画)

CSS属性简表(伸缩盒.变换.过渡.动画) 伸缩盒 ====================================== 应用于flex容器 flex-direction(排列方向): row row-reverse column column-reverse; flex-wrap(是否换行): nowrap wrap wrap-reverse; flex-flow justify-content(子项在横轴上的对齐方式): flex-start/end center space-bet

jquery动画控制非css属性

JQuery的animate()方法可以通过渐变的更改CSS属性来实现简单的动画效果, 比如 1 $("#box").animate({height:"300px"},3000); 可以控制id为box的标签在3秒内将高度更改到300px.那么如果想要控制非CSS属性呢,比如说针对一些WebGl中的动画控制,如果使用setInterval倒是可以实现效果,但是太过麻烦.这个时候就可以使用animate方法,生成递进的值,自己获取值来控制一些非CSS属性,比如: //

关于CSS3动画性能

前天我去面试了...好吧,对于自己6年6份工作的悲催经历,我自己也是醉了. 但没办法,我这种当时上学没好好学习,临毕业才出家写代码的半吊子码农,起步没起好,以至于一直没能找到真正让自己满意的工作. 通过了几年的努力和累积,总算是把信心给拿回来了. 这不,又踏上我的追求之路了.我真心是希望这是我最后一次换工作了. 阿门,愿主保佑我... 那个...好像废话说得有点多了.OK,正题时间. 是这样,面试的时候,技术官问了我一个问题,引发了我的深思~那就是CSS动画的效率问题. 这个...因为之前接触移

3、CSS属性组成和作用

* { margin: 0; padding: 0 } body { background: #F5F6EB; color: #333; font-size: 16px } .boxs { width: 1000px; margin: 0 auto } h1,h2 { padding: 20px 0 } h3 { background: #199475; color: #fff; padding: 15px; margin: 20px 0px; font-size: 16px } p { lin

css属性分类介绍

css属性分类介绍 CSS分类目录 文本/字体/颜色 文本相关 字体相关 颜色相关 背景相关 大小/布局 大小属性 margin 外边距 padding 内边距 border 边框 position 定位 列表/表格 多列属性 可伸缩框属性 列表属性 Grid属性 Table属性 动画属性 Animation 动画属性 Transition 过渡属性 CSS属性分类 文本/字体/颜色/背景 字体类 font-family:指定字体 需要考虑客户端机器上是否装有字体 可以排列多个字体,用逗号分隔,

css属性详解和浮动

一.CSS属性组成和作用 属性:属性值 1)每个css样式都必须由两部分组成:选择符和声明 注:声明又包括属性和属性值 2)css属性:属性是指定选择符具有的属性,他是css的核心,css2共有150多个属性: 3)css属性值:属性值包括法定属性值和常规的数值加单位或颜色值(colorValue):如(25px) 字体属性 1.font-family: 字体类型; {font-family:字体1,字体2,字体3:}       例:font-family:"微软雅黑","

CSS属性选择器

属性选择器 1 <!DOCTYPE html> 2 <html lang="zh-cn"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <link rel="stylesheet" type="text/css" href="./css/属性选择器.css&qu