web页面浏览器渲染过程

1.解析html文件,并构建DOM树:

  在DOM树中,每一个html标签都有一个对应的节点,并且每一个文本也有一个对应 的节点(js的textNode),DOM树的根节点就是documentElement,对应的是html标签。

例如:在chrome中,构建成的DOM树会被将页面划分为很多图层(注:图层并不是节点,一个图层可能包含一个或者多个节点)。

更深入的了解:参考http://www.html5rocks.com/zh/tutorials/speed/layers/

2.解析CSS代码,计算出各层的最终样式数据:

  在这个过程中,CSS代码中的非法语句会被浏览器忽略掉,在改变节点位置,尺寸时会触发这个过程的再次执行,这就是Recalculate style(样式重计算)。

3.根据DOM树以及计算出的各层最终样式构建渲染树:

  在这个过程中,渲染树会忽略掉不需要渲染的元素,如:head、display:none;

  这个过程中包括两部分,一是为每个节点生成图形和位置,这时就会触发我们所说的回流和重布局(layout),二是将每个节点绘制填充到图层位图中,这时会触发重绘(paint)。

4.图层作为纹理上传至GPU,复合多个图层到页面上生成最终图像(Composite Layers—图层重组)

  此过程原理较复杂,请自行查阅。http://www.html5rocks.com/zh/tutorials/speed/layers/,此文中有一些引子可供理解。

触发重布局的属性:

  1.改变盒模型相关的属性:width, height, margin, padding, display, border-width,border,min-height。

  2.改变定位属性及浮动:top,bottom,left,right,position,float,clear。

  3.改变节点内部文字的结构:text-align, overflow, font-weight,font-family,font-size,line-height, vertical-align, white-space。

  总结:其实看了这些属性,也许聪明的你已经猜到,触发重布局的主要原因就是 节点的大小尺寸或位置被改变了。

  触发重绘的属性:color,background,border-radius,border-style,visibility,outline,box-shadow……(background: gradient渐变 GPU杀手啊啊啊!)

  总结:这些属性没有改变节点的大小和位置,只是改变了节点内部的渲染效果,所以只重绘,不重布局。

针对浏览器的CSS性能优化

减少重绘和重排:

  1.不要一个一个地单独修改属性,最好通过一个选集(class)来定义这些修改;

  2.把对节点的大量修改操作放在页面之外:

    ①用documentFragment来修改;

    ②clone节点,做大量修改,然后替换掉之前的节点;

    ③通过display:none隐藏节点(一次重绘和重排),大量修改样式属性,在显   示节点(第二次重绘和重排),共两次重绘和重排。

  3.不要频繁获取计算后的样式。如果你需要使用计算后的样式,最好暂存起来而不            是直接从DOM上读取。

  4.绝对定位元素通常就不会影响其他大部分元素。

CSS选择器的使用:

  由于CSS selector选取元素是从右往左选取,所以在使用CSS selector时,嵌套的层数越深,selector性能会越差,后代选择器+元素选择器的组合性能非常差(比如:.foo p,这个选择器会首先选取页面上所有的p元素,然后再去它们的祖先里面找foo class)。不过这一理论随着现代浏览器的发展,对性能的影响已经越来越微不足道了。在现代浏览器里,甚至属性选择器之类性能都已得到优化,并不会产生明显的性能影响。

高性能CSS3动画注意事项

1.opacity是不会触发重绘的,当opacity值发生改变时,GPU只是通过改变图层的alpha值来达到效果,但前提是被改变opacity值的元素必须是一个图层。在动画制作中,opacity是个很好的选择。

2.在兼容性允许的情况下,transform变形绝对是开发页面动画的最佳选择,目前在很多CSS框架组件中使用的动画,都优选transform来实现。transform:translate3d(0, 0, 0)和transform: translateZ(0)可以强迫浏览器为其创建图层,这样就消除了在动画开始前图层的创建时间,使动画尽快开始。变形的还有一个重要优点是,transform平移、旋转、缩放都不会触发重布局,而以前使用的left、top均会触发重布局。

参考内容:http://www.html5rocks.com/en/tutorials/speed/high-performance-animations/

最新文章

  1. git命令查看远程分支
  2. android ImageView 中的ScaleType
  3. ASP.NET ZERO 学习 HangFire的使用
  4. Java中HashMap等的实现要点浅析
  5. xcode报错,svn : is not a workingCopy
  6. ThinkPHP5.0完全开发手册
  7. 数据仓库建模与ETL实践技巧
  8. SpingMVC ModelAttribute的用法
  9. [改善Java代码]不要随便设置随机种子
  10. JavaScript - 测试 jQuery
  11. 关于bootstrap--列表(ol、ul)
  12. java实现各种数据统计图(柱形图,饼图,折线图)
  13. 推荐15个月 Node.js 开发工具
  14. [原创] IAR7.10安装注册教程
  15. [Swift]LeetCode456. 132模式 | 132 Pattern
  16. 关于C语言内存的一些理解
  17. (等比数列)P1423 小玉在游泳 洛谷
  18. okhttp添加自定义cookie
  19. CMOS Sensor的调试经验分享【转】
  20. Linux shell 菜鸟学习笔记....

热门文章

  1. 1.1 Introduction中 Producers官网剖析(博主推荐)
  2. session 、cookie、token的区别及联系
  3. mycat 之datanode datahost writehost readhost 区别(转)
  4. 洛谷 P2646 数数zzy
  5. Oracle中暂时表空间的清理
  6. 使用docker 搭建基础的 mysql 应用
  7. Windows下安装Resin及配置具体解释与公布应用
  8. 为什么通过空指针(NULL)能够正确调用类的部分成员函数
  9. 内存、时间复杂度、CPU/GPU以及运行时间
  10. C++ Tricks(一)—— 判断字符串 string 对象的所有字符都相等