性能主要表现:流量、功耗与流畅度

在现有的前端动画体系中,通常有两种模式:JS动画与CSS3动画。 JS动画是通过JS动态改写样式实现动画能力的一种方案,在PC端兼容低端浏览器中不失为一种推荐方案。 而在移动端,我们选择性能更优浏览器原生实现方案:CSS3动画。

然而,CSS3动画在移动多终端设备场景下,相比PC会面对更多的性能问题,主要体现在动画的卡顿与闪烁。

1,webkit-transform: translateX(3em) 使用优于left

  • CSS动画属性会触发整个页面的重排relayout、重绘repaint、重组recomposite
  • Paint通常是其中最花费性能的,尽可能避免使用触发paint的CSS动画属性,这也是为什么我们推荐在CSS动画中使用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: #;
    position: absolute;
    }
    @-webkit-keyframes move{
    from {
    left: 100px;
    }
    to {
    left: 200px;
    }
    } 使用left将持续触发页面重绘,有闪烁
    @-webkit-keyframes move{
    from {
    -webkit-transform: translateX(100px);
    }
    to {
    -webkit-transform: translateX(200px);
    }
    } 使用-webkit-transform页面只发生重组,效果好很多
    详情移步:https://github.com/AlloyTeam/Mars/blob/master/performance/css-property-animation-performance.md

    2,尽可能多的利用硬件能力,如使用3D变形来开启GPU加速

    -webkit-transform: translate3d(, , );
    -moz-transform: translate3d(, , );
    -ms-transform: translate3d(, , );
    transform: translate3d(, , );
    如动画过程有闪烁(通常发生在动画开始的时候),可以尝试下面的Hack: -webkit-backface-visibility: hidden;
    -moz-backface-visibility: hidden;
    -ms-backface-visibility: hidden;
    backface-visibility: hidden; -webkit-perspective: ;
    -moz-perspective: ;
    -ms-perspective: ;
    perspective: ;
    如下面一个元素通过translate3d右移500px的动画流畅度会明显优于使用left属性: #ball- {
    transition: -webkit-transform .5s ease;
    -webkit-transform: translate3d(, , );
    }
    #ball-.slidein {
    -webkit-transform: translate3d(500px, , );
    } #ball- {
    transition: left .5s ease;
    left: ;
    }
    #ball-.slidein {
    left: 500px;
    }
    注:3D变形会消耗更多的内存与功耗,应确实有性能问题时才去使用它,兼在权衡

    3,尽可能少的使用box-shadowsgradients

    box-shadowsgradients往往都是页面的性能杀手,尤其是在一个元素同时都使用了它们,所以拥抱扁平化设计吧。

    4,尽可能的让动画元素不在文档流中,以减少重排

    position: fixed;
    position: absolute;

    5,优化 DOM layout 性能,减少渲染次数,示例如下:

    // 触发两次 layout
    var newWidth = aDiv.offsetWidth + ; // Read
    aDiv.style.width = newWidth + 'px'; // Write
    var newHeight = aDiv.offsetHeight + ; // Read
    aDiv.style.height = newHeight + 'px'; // Write // 只触发一次 layout
    var newWidth = aDiv.offsetWidth + ; // Read
    var newHeight = aDiv.offsetHeight + ; // 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

    重点:iOS与Android平台上问题列表

    https://github.com/AlloyTeam/Mars/tree/master/issues
    css3翻转动画实现
    http://www.tuicool.com/articles/MV3UvuA
    
    示例:左右翻转180度
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
    /* entire container, keeps perspective */
    .flip-container {
    perspective: ;
    }
    /* flip the pane when hovered */
    .flip-container:hover .flipper, .flip-container.hover .flipper {
    transform: rotateY(180deg);
    } .flip-container, .front, .back {
    width: 320px;
    height: 480px;
    } /* flip speed goes here */
    .flipper {
    transition: 5s;
    transform-style: preserve-3d; position: relative;
    } /* hide back of pane during swap */
    .front, .back {
    backface-visibility: hidden;
    position: absolute;
    top: ;
    left: ;
    } /* front pane, placed above back */
    .front {
    z-index: ;
    background-color: antiquewhite;
    -webkit-box-shadow:30px 30px 30px aquamarine;
    } /* back, initially hidden pane */
    .back {
    transform: rotateY(180deg);
    background-color: aqua;
    }
    </style>
    </head>
    <body>
    <div class="flip-container" ontouchstart="this.classList.toggle('hover');">
    <div class="flipper">
    <div class="front"> <!-- 前面内容 -->
    </div>
    <div class="back"> <!-- 背面内容 -->
    </div>
    </div>
    </div>
    </body>
    </html>
    
    
     
    
    

css动画属性性能的更多相关文章

  1. CSS动画属性性能详细介绍

    CSS动画属性会触发整个页面的重排relayout.重绘repaint.重组recomposite Paint通常是其中最花费性能的,尽可能避免使用触发paint的CSS动画属性,这也是为什么我们推荐 ...

  2. CSS动画的性能分析和浏览器GPU加速

    此文已由作者袁申授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 有数的数据大屏可以在一块屏幕上展示若干张不同的图表,以炫酷的方式展示各种业务数据.其中有些图表使用CSS实现了 ...

  3. css动画属性--轮播图效果

    通过css的动画属性实现轮播图的显示效果 代码如下: 主体部分: <div id="move"> <ul> <li><img src=&q ...

  4. js监听指定元素的css动画属性

    MDN 监听css动画,开始,迭代次数,结束,中断 回调函数返回 animationEvent属性 <!DOCTYPE html> <html> <head> &l ...

  5. CSS3动画效果——js调用css动画属性并回调处理详解

    http://www.jb51.net/css/258407.html 这篇文章主要详细介绍了CSS3动画效果回调处理,需要的朋友可以参考下 我们在做js动画的时候,很多时候都需要做回调处理,如在一个 ...

  6. css动画属性--小球移动

    主体只有一个div <body> <div></div> </body> 样式部分(测试:目前的浏览器还是需要加前缀才能兼容) <style> ...

  7. 盒子端 CSS 动画性能提升研究

    不同于传统的 PC Web 或者是移动 WEB,在腾讯视频客厅盒子端,接大屏显示器(电视)下,许多能流畅运行于 PC 端.移动端的 Web 动画,受限于硬件水平,在盒子端的表现的往往不尽如人意. 基于 ...

  8. CSS3动画(性能篇)

    写在前面 高性能移动Web相较PC的场景需要考虑的因素也相对更多更复杂,我们总结为以下几点: 流量.功耗与流畅度. 在PC时代我们更多的是考虑体验上的流畅度,而在Mobile端本身丰富的场景下,需要额 ...

  9. css3动画的性能优化

    目前对提升移动端CSS3动画体验的主要方法有几点:尽可能多的利用硬件能力,如使用3D变形来开启GPU加速 -webkit-transform: translate3d(0, 0, 0); -moz-t ...

随机推荐

  1. SQL语句总结

    SQL UNION 操作符合并两个或多个 SELECT 语句的结果. 语法: SELECT column_name(s) FROM table1        UNION        SELECT ...

  2. jquery cdn/////////////////zzz

    jquery-2.1.1 注:jquery-2.0以上版本不再支持IE 6/7/8)百度引用地址 (推荐目前最稳定的,不会出现延时打不开情况) 百度压缩版引用地址:<script src=&qu ...

  3. Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)

    1,其实早就想把这些东西给封装封装的,一直没有时间,今天刚好项目进入到测试阶段了,Bug同事在哪儿测试的飞起,但发现提bug的尽然是我(得意脸),然后上午把ios的包测试了一下,顺便把服务器给测挂了( ...

  4. 我的第一个开源项目-logger4Net

    学会学习,学会分享,学会创造. 这我的第一个开源项目.以前总觉得开源离自己很远,但通过不断学习发现,其实自己已经走在这条路上.思想就在那,只要懂得学习,懂得分享,就会懂享受创造的快乐感与殷实感. 没做 ...

  5. ssh免密码认证

    举例:有机器PC_A(172.0.246),PC_B(172.0.1.140).现想A通过ssh免密码登录到B. 1.在PC_A主机下生成公钥/私钥对 [comodo@PC_A ~]$ ssh-key ...

  6. Node判断文件是否链接

    通过fs.stat(), fs.lstate() and fs.fstate()都可以得到fs.Stats对象, 其中stats.isSymbolicLink()方法用来判断是否链接, 然而一直都不成 ...

  7. C++多级指针与多维数组详细介绍

    多级指针的概念 多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下:    int val=10;    int *ptr=&val;    int **pptr= ...

  8. IISExpress 调试使用学习,使用附加到进程进行快速调试

    IIS8.0 Express已经推出了,大家可以通过Microsoft Web Platform Installer 进行安装.(VS2012,VS2013已经内置了,不需安装了) 1.IIS Exp ...

  9. post上传文件

    - (BOOL)sendPhotoToTumblr:(NSString *)photo withCaption:(NSString *)caption; {         //get image d ...

  10. tomcat部署https+TLS 1.2+Apple ATS支持

    因为苹果ATS的要求, tomcat服务器要求上https+TLS1.2, 前面搞定了https,但是tls一直是1.0, 甚至把跑了一年的服务器重启了, 不解决问题. 思路如下: 1. 将openJ ...