CSS animations 和 transitions 的性能:浏览器到底做了什么?(译)

    原文地址:http://blogs.adobe.com/webplatform/2014/03/18/css-animations-and-transitions-performance/

  你或许有在项目中使用CSS Animations 或者 CSS Transitions的经历(没有使用过的朋友,可以在CSS-Trick's查看使用方法)。一些动画表现的较为平滑流畅,有些则表现的起伏不定。why?

  本文我们要研究浏览器是如何处理CSS Animations和 CSS Transitions 。在写码前,你可以对一个动画能否运行平滑建立直觉,基于此,你就能设计出在浏览器中运行良好并且展现舒适流畅的用户体验。

  浏览器内部

  让我们打开浏览器神秘的面纱,了解它是如何运作的。这样才能完美的驾驭它。

  现代浏览器通常有两个非常重要的执行线程。他们一起配合执行来渲染一个页面:

  •   主线程
  •   排版线程

  通常,主线程负责:

  •   运行javascript代码
  •   计算html元素的css样式
  •   渲染页面
  •   将元素绘制成一个或多个位图
  •   将这些位图交给排版线程

  而排版线程则负责下面的事情:

  •   通过GPU绘制位图到屏幕上
  •   通知主线程更新页面中可见位图或即将可见的位图
  •   计算出页面中哪些部分是可见的
  •   当页面滚动时计算出页面中哪些部分是即将可见的
  •   当页面滚动时移动页面

  主线程可以长时间运行你的javascript程序或者绘制较大元素,在此期间不会响应用户行为.

  同时,排版进程会试图保持对用户行为的有效响应。当页面内容有所变化的时候,排版进程每秒60次重绘一次页面,包括页面没有渲染完的时候。

  例如:当用户滚动页面时,排版线程通知主线程更新最近可见的页面。当然了,如果主线程不应答,排版线程也不会等待,它会绘制页面中已有的部分并将其他部分绘成白屏。

  GPU

  上文中提到排版线程通过显卡把位图绘制到显示器屏幕。让我们快速了解一下GPU。

  GPU是手机、平板电脑、计算机中的一个芯片。它非常专业的完成一些自身的职责,并不擅长其它领域。

  GPU 最擅长的事情:

    1.   绘制位图到屏幕上
    2.   重复绘制同一位图
    3.   从不同位置、不同角度、不同比例绘制同一位图

  GPU 处理较慢的事情:

    1.   将位图加载到自己的内存

  transition:height

  现在我们已经对硬件和软件如何在页面中运行有了初步的了解,下面我们来看看主线程和排版线程是怎么完成下面css动画的。

  假设我们要将一个元素的高度从100px变化到200px,如下:

  

div {
height: 100px;
transition: height 1s linear;
} div:hover {
height: 200px;
}

  主线程和排版线程将按照下面的时间线进行操作。注意:橙色方框内的耗时较多,而蓝色方框内的则运行很快。

  

  

  就像你看到的一样,这里有很多黄色方块,意味着浏览器运行的相当艰难!也就是说这个动画十分不连贯。

  在动画的每一帧,浏览器都得执行布局,绘制,更新位图到GPU.上文中已经说过,加载新位图到GPU是相对较慢的操作。

  浏览器运行每一帧都很困难的原因是元素的内容一直在改变。改变一个元素的高度会引起他的子元素大小改变,浏览器就得执行布局。布局完成后主线程必须再次为元素生成位图。

  transition:transform

  我们看到,执行高度的动画代价是高昂的。有没有一些低廉的动画呢?

  假设我们要将一个元素从比例从一般大小缩放到完整大小。同时假设我们使用 CSS transform 属性完成缩放,css transform 完成元素缩放的代码如下:

  

div {
transform: scale(0.5);
transition: transform 1s linear;
} div:hover {
transform: scale(1.0);
}

  我们来看看这种情况下的时间线:

  

  我们看到少了很多黄色的块,意味着动画执行将要平滑很多!然而,使用transform运行动画和改变高度运行动画的区别是什么?

  按照定义,css的transform属性不会改变元素本身的布局和周围元素的布局。它对元素的影响是整体作用——他整体缩放元素、整体旋转元素或者整体移动元素。

  这对于浏览器来说是一个好消息!浏览器只需要在动画开始的时候生成元素的位图并更新到GPU。之后,浏览器不需要做任何渲染、绘制或位图更新。相反浏览器可以利用GPU的特殊能力将相同的位图在不同的位置快速渲染,旋转,缩放。

  结论

  这意味着我们不能动画改变元素的高度?并非如此,有时候这是你设计的保证,只要动画足够快。或许你的元素是孤立的,并不会引起页面其他部分的重新渲染。或者你的元素重排起来很简单,浏览器可以快速完成。或许你的元素足够小,浏览器只需要将少量位图加载进GPU。

  当然了,如果你可以采用css transfrom 这样"低廉"的属性代替更加昂贵的类似于height这类属性,对你的设计毫无影响。那么尽管用吧,少年!例如,假设你的设计中涉及当切换按钮时改变菜单,不应使用改变css属性的height和top属性显示菜单,你应该试着通过改变css的transform属实现相近或者相同的效果。

  CSS属性中动画执行效率高的属性包括:

  这个列表是今天的数据,但是随着浏览器的发展,我们会看到更多的css属性在浏览器中越来越快的运行。当然,不要忘记这个列表。你也许会对这些列表中的属性组合出来的丰富效果感到惊讶~。发挥你的创造力吧!

  转载请注明出处: http://www.cnblogs.com/wisdomoon/p/css-animation-in-brower.html

    

     

CSS-animations和transitions性能:浏览器到底做了什么?的更多相关文章

  1. 【翻译】CSS Animations VS the Web Animations API:案例学习

    原文地址:CSS Animations vs the Web Animations API: A Case Study May 03, 2017 css, javascript 上周我写了我如何使用C ...

  2. 常用CSS优化总结——网络性能与语法性能建议

    在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时多少会用到一些,但突然问我,很难把自己知道的都说出来.页面优化明显不是一两句能够说完的,这两天总结了一下 ...

  3. (转)常用CSS优化总结——网络性能与语法性能建议

    原文地址:http://www.cnblogs.com/dolphinX/p/3508657.html 在前端面试中最常见的问题就是页面优化和缓存(貌似也是页面优化),被问了几次后心虚的不行,平然平时 ...

  4. Animations and transitions

    在交互式可视化中,有一个词叫reactive,指的是以可视化的方式来响应用户的行为,帮助用户进行可视化并理解其结果.这个很有用.那如何来实现这种交互呢?通过动画. 如果处理得当,动画可以展现出不错的可 ...

  5. css写作建议和性能优化小结

    1.前言 还有几天就到国庆中秋了,快要放假了,先祝大家节日快乐!之前写过js的写作建议和技巧,那么今天就来聊聊css吧!说到css,每一个网页都离不开css,但是对于css,很多开发者的想法就是,cs ...

  6. AFNetworking到底做了什么?(二)

      接着上一篇的内容往下讲,如果没看过上一篇内容可以点这: AFNetworking到底做了什么? 之前我们讲到NSUrlSession代理这一块: 代理8: /* task完成之后的回调,成功和失败 ...

  7. 基于JavaScript判断浏览器到底是关闭还是刷新(超准确)

    这篇文章主要介绍了基于JavaScript判断浏览器到底是关闭还是刷新(超准确)的相关资料,需要的朋友可以参考下 本文是小编总结的一些核心内容,个人感觉对大家有所帮助,具体内容请看下文: 页面加载时只 ...

  8. volatile关键字到底做了什么?

    话不多说,直接贴代码 class Singleton { private static volatile Singleton instance; private Singleton(){} //双重判 ...

  9. MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

    原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...

随机推荐

  1. 【PowerOJ1739】 魔术球问题

    https://www.oj.swust.edu.cn/problem/show/1739 (题目链接) 题意 n个柱子上放小球,每根柱子上相邻两个小球的数字之和必须是完全平方数,只有放了x号小球才可 ...

  2. BZOJ1057 [ZJOI2007]棋盘制作

    Description 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源 于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应 ...

  3. css后代选择器(div.class中间不带空格)

    如果我要查找<div>上用了.class的元素,查找方法:div.class:中间是不空格的. 以上这种形式为css后代选择器 参考:http://www.w3school.com.cn/ ...

  4. web开发 虚拟目录映射

    A 当服务器和 web应用不在一个目录下 $CATALINA_BASE/conf/catalina/localhost/ 文件夹下创建一个xml文件,任意文件名都可以,但是此文件名是web应用发布后的 ...

  5. HTML5学习总结-03 地理定位

    一 地理定位 HTML5 Geolocation(地理定位)用于定位用户的位置. 1 地理定位 地理位置 经度  :   南北极的连接线 纬度  :   东西连接的线 位置信息从何而来: IP地址 G ...

  6. iOS - libc++abi.dylib: terminate_handler unexpectedly threw an exception

    代码出现crash,报错:libc++abi.dylib: terminate_handler unexpectedly threw an exception 当我们很明确是某一块代码执行导致了错误, ...

  7. RBAC权限设计

    http://blog.csdn.net/ms_x0828/article/details/7035956 RBAC 模型作为目前最为广泛接受的权限模型 角色访问控制(RBAC)引入了Role的概念, ...

  8. Yocto开发笔记之《驱动调试-华为3G模块》(QQ交流群:519230208)

    QQ群:519230208,为避免广告骚扰,申请时请注明 “开发者” 字样 ======================================================== 参考:ht ...

  9. 9.13 JS循环

    循环:循环操作某一个功能(执行某段代码) 四要素: 循环初始值 循环条件 状态改变 循环体       for  穷举     迭代            i++;等价于i=i+1;  ++I;等价于 ...

  10. Apache+php+mysql+SQLyog在windows7下的安装与配置图解

    先准备好软件: Apache官方下载地址:httpd-2.2.25-win32-x86-openssl-0.9.8y.msi,更多版本在这里: php官方下载地址:php-5.4.37-Win32-V ...