浏览器的渲染流程

html-css024

浏览器的渲染流程,第1张

1、使用html解析器将html页面转化成浏览器能够理解的dom树 (ParseHTML)

2、将css解析成浏览器能够理解的css树( 通过link标签引入的css才会走这一步,如果css是写到html里的话在第一步就解析了 )

3、样式计算(Relcalculate Style)

4、dom树和css树生成布局树(Layout)

5、根据布局树生成图层树 —— 重排. (pre-paint)     (Update Layer Tree). 

6、绘制(背景颜色、边框等)(按照图层去一个个绘制) —— 重绘(paint)

7、组合图层 —— 合成(Composite Layers)

图层树的几种情况:

    1、css3D

    2、position:fixed

    3、video

    4、canvas

    5、css3动画加载的时候作为一个单独的图层

浏览器每次可以接收64kb的数据,例如一个图片是120kb大小,那么浏览器将分成2次才能接收完数据

1、css解析的时候,浏览器会开一个线程去解析html,去开一个线程去解析css,这样会阻塞浏览器的渲染,但是不会阻塞dom的解析。

2、js解析的时候,会阻塞浏览器的渲染,会阻塞dom的解析,会阻塞js的执行

重排和重绘都是以图层为单位去操作,所以如果是一些变化的元素,最好将它单独作为一个图层隔离起来进行操作

1、重排:计算元素在窗口的几何位置

2、重绘:计算元素在窗口具体的呈现

1、元素位置移动尽量使用transform代替top、left

    1.1、直接使用transform会触发重排和重绘

    1.2、结合position:relative使用时只触发重绘

    1.3、作为单独图层时,不触发重排和重绘(会交给GPU进程去处理)

2、使用opacity代替visibility

    2.1、使用visibility会触发重绘

    2.2、使用opacity既触发重排,也触发重绘ß

    2.3、配合图层使用,opacity不触发重排和重绘

3、多次改变样式的操作合并成一次

4、利用文档碎片(documentFragment)

5、不要把某些dom节点的属性值放到循环里当成循环的变量

查询属性值的时候会触发重排、重绘!!

6、为动画元素新建图层

这个需要html、css、js三者结合才能实现。下面是个示例:

<body id="body" style="height:100%background:url() no-repeat center / cover" onload="body.style.backgroundImage='url('+parseInt(Math.random()*10)+'.jpg)'">

</body>

需要预先准备10张图片,分别命名为 0.jpg、1.jpg、2.jpg …… 9.jpg ,并放到当前html文件的同一目录中。