css动画属性性能
2016-12-13 16:17
681 查看
性能主要表现:流量、功耗与流畅度在现有的前端动画体系中,通常有两种模式:JS动画与CSS3动画。JS动画是通过JS动态改写样式实现动画能力的一种方案,在PC端兼容低端浏览器中不失为一种推荐方案。而在移动端,我们选择性能更优浏览器原生实现方案:CSS3动画。然而,CSS3动画在移动多终端设备场景下,相比PC会面对更多的性能问题,主要体现在动画的卡顿与闪烁。1,webkit-transform:translateX(3em)使用优于leftCSS动画属性会触发整个页面的重排relayout、重绘repaint、重组recompositePaint通常是其中最花费性能的,尽可能避免使用触发paint的CSS动画属性,这也是为什么我们推荐在CSS动画中使用iOS与Android平台上问题列表
webkit-transform:translateX(3em)的方案代替使用
left:3em,因为
left会额外触发layout与paint,而
webkit-transform只触发整个页面composite
div{ -webkit-animation-duration:5s; -webkit-animation-name:move; -webkit-animation-iteration-count:infinite; -webkit-animation-direction:alternate; width:200px; height:200px; margin:100px; background-color:#808080; position:absolute; } @-webkit-keyframesmove{ from{ left:100px; } to{ left:200px; } } 使用left将持续触发页面重绘,有闪烁 @-webkit-keyframesmove{ from{ -webkit-transform:translateX(100px); } to{ -webkit-transform:translateX(200px); } } 使用-webkit-transform页面只发生重组,效果好很多 详情移步:https://github.com/AlloyTeam/Mars/blob/master/performance/css-property-animation-performance.md2,尽可能多的利用硬件能力,如使用3D变形来开启GPU加速
-webkit-transform:translate3d(0,0,0); -moz-transform:translate3d(0,0,0); -ms-transform:translate3d(0,0,0); transform:translate3d(0,0,0); 如动画过程有闪烁(通常发生在动画开始的时候),可以尝试下面的Hack: -webkit-backface-visibility:hidden; -moz-backface-visibility:hidden; -ms-backface-visibility:hidden; backface-visibility:hidden; -webkit-perspective:1000; -moz-perspective:1000; -ms-perspective:1000; perspective:1000; 如下面一个元素通过translate3d右移500px的动画流畅度会明显优于使用left属性: #ball-1{ transition:-webkit-transform.5sease; -webkit-transform:translate3d(0,0,0); } #ball-1.slidein{ -webkit-transform:translate3d(500px,0,0); } #ball-2{ transition:left.5sease; left:0; } #ball-2.slidein{ left:500px; } 注:3D变形会消耗更多的内存与功耗,应确实有性能问题时才去使用它,兼在权衡3,尽可能少的使用
box-shadows与
gradients
box-shadows与
gradients往往都是页面的性能杀手,尤其是在一个元素同时都使用了它们,所以拥抱扁平化设计吧。4,尽可能的让动画元素不在文档流中,以减少重排
position:fixed; position:absolute;5,优化DOMlayout性能,减少渲染次数,示例如下:
//触发两次layout varnewWidth=aDiv.offsetWidth+10;//Read aDiv.style.width=newWidth+'px';//Write varnewHeight=aDiv.offsetHeight+10;//Read aDiv.style.height=newHeight+'px';//Write //只触发一次layout varnewWidth=aDiv.offsetWidth+10;//Read varnewHeight=aDiv.offsetHeight+10;//Read aDiv.style.width=newWidth+'px';//Write aDiv.style.height=newHeight+'px';//Write详情移步:https://github.com/AlloyTeam/Mars/blob/master/performance/high-performance-css3-animation.md另外,附上腾讯移动Web前端知识库
https://github.com/AlloyTeam/Mars重点:
https://github.com/AlloyTeam/Mars/tree/master/issues
css3翻转动画实现
http://www.tuicool.com/articles/MV3UvuA 示例:左右翻转180度
<!DOCTYPEhtml> <htmllang="en"> <head> <metacharset="UTF-8"> <title>Title</title> <style> /*entirecontainer,keepsperspective*/ .flip-container{ perspective:1000; } /*flipthepanewhenhovered*/ .flip-container:hover.flipper,.flip-container.hover.flipper{ transform:rotateY(180deg); } .flip-container,.front,.back{ width:320px; height:480px; } /*flipspeedgoeshere*/ .flipper{ transition:5s; transform-style:preserve-3d; position:relative; } /*hidebackofpaneduringswap*/ .front,.back{ backface-visibility:hidden; position:absolute; top:0; left:0; } /*frontpane,placedaboveback*/ .front{ z-index:2; background-color:antiquewhite; -webkit-box-shadow:30px30px30pxaquamarine; } /*back,initiallyhiddenpane*/ .back{ transform:rotateY(180deg); background-color:aqua; } </style> </head> <body> <divclass="flip-container"ontouchstart="this.classList.toggle('hover');"> <divclass="flipper"> <divclass="front"> 1 <!--前面内容--> </div> <divclass="back"> 2 <!--背面内容--> </div> </div> </div> </body> </html>
相关文章推荐
- CSS动画属性性能
- css属性的选择对动画性能的影响
- CSS动画属性性能详细介绍
- CSS动画属性性能
- 深入理解css属性的选择对动画性能的影响
- Css的z-index属性与Flash动画层叠需注意
- CSS动画的性能优化
- 两张图解释CSS动画的性能
- Android性能优化(一)内存泄露优化(静态变量、单例模式、属性动画)
- CSS3d动画 animation 属性
- CSS动画属性1
- 使用浏览器的开发者工具来检查 CSS 的动画性能
- CSS动画中的Animation和Transition全属性实例
- Android 中关于属性动画的一些思考,或许能为你解决一定的性能问题
- 前端性能优化:尽可能使用CSS动画
- 影响页面浏览性能的css属性
- 两张图解释CSS动画的性能
- CSS3动画效果——js调用css动画属性并回调处理详解
- 前端性能优化:尽可能使用CSS动画
- [看书日记20151231]属性动画工作原理, 性能优化 & 对12月的感想