页面渲染过程分析

关于页面渲染,下面列出了很多相关的技术文章,这里再做一下总结和补充:

通过了解渲染过程来提高页面性能

Chrome 渲染优化 - 层模型

16毫秒的优化Web前端性能优化的微观分析

浏览器渲染Rendering那些事:repaint、reflow/relayout、restyle

浏览器内部工作原理

优化移动体验的HTML5技巧

页面渲染过程

1. 请求页面文档

2. 解析页面文档

2.1) 解析HTML,构建DOM树;

2.2) 遇到内联JS/CSS,阻塞页面文档的解析,并立即解析JS/CSS,JS/CSS解析完成后,再继续往下解析页面文档;

2.3) 遇到外部脚本,立即下载脚本,若下载的脚本为<script>或<link>,则会阻塞页面文档的解析,等脚本下载并解析完成后,再继续往下解析页面文档;

上面的解析流程还包括有下面几个场景:

i)   2.2和2.3阻塞页面文档解析,只是阻塞了DOM树的构建,并不阻塞页面预解析,预解析页面文档,会解析出页面其它的外部资源,然后并行下载这些外部资源,单次并行下载的外部资源数量与浏览器有关;

ii)  IE浏览器,当<script>标签包含defer属性时,脚本的下载不会阻塞页面其它任务,脚本下载完成后不会立即执行,等到页面解析完成后,再将全部以defer方式下载的脚本按发起请求的顺序执行;

iii) 现代浏览器(chrome,firfox,IE10+等),当<script>标签包含async属性时,脚本的下载不会阻塞页面其它任务,脚本下载完成会立即执行;

3. 构建render树

render树的每个节点为一个渲染对象,类似CSS的盒子概念,与DOM树的节点基本对应

4. 布局render树

4.1) 设置render树节点的大小位置等属性,根据样式属性构建渲染层(绝对定位/透明/transform/canvas/等);

4.2) 布局分同步布局(字体变化,窗口resize事件)和异步布局,同步布局会立即执行,异步布局则会将任务提交至一个队列,等需要获取节点样式属性时再执行;

5. 绘制render树

5.1) 设置render树节点的颜色背景等属性;

5.2) 将渲染层栅格化,并将纹理上传到GPU,然后将图层合成显示;

在整个页面的渲染过程,上面的步骤并不是只执行一次,通常是解析8K文档内容后,会执行一轮上面步骤,用户可以看到已渲染完成的页面内容,然后浏览器会继续开始下一轮渲染。

页面重排重绘

对应渲染完成的页面,当样式变化时,会重新计算样式,布局元素,绘制元素;页面元素大小位置等变化会重新布局元素,绘制元素;页面元素颜色背景等变化会重新绘制元素。布局元素时,同时会布局他的子元素,若还影响到了其它元素的大小位置等属性的变化,还会导致这些元素也重新布局。重新布局叫重排,重新绘制叫重绘。

重排重绘的优化方案:

1) DOM操作读写分离:对于页面元素的重排和重绘都会,若属于4.2提到的异步布局的范畴,则重排重绘不会立即执行,等到到读取页面元素的样式属性时,才会触发。因此DOM操作的读写分离可以减少重排重绘次数;

2) 先操作DocumentFragment,后插入DOM树;

3) 先复制DOM节点,修改后再替换到DOM树;

4) 通过修改一次style或class来修改DOM属性;

5) 通过requestAnimationFrame操作DOM属性:requestAnimationFrame会将参数中的回调函数延迟到下一帧渲染时执行;

6) CSS3动画替换绝对定位的位移:CSS3动画中元素的变化,都是在新图层在GPU里执行,而不需要重新布局。

时间: 2024-10-13 22:51:13

页面渲染过程分析的相关文章

高性能滚动 scroll 及页面渲染优化

本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,可以对照上面的知识点,选择性跳到相应地方阅读.    滚动优化的由来 滚动优化其实也不仅仅指滚动(scroll 事件),还包括了例如 resize 这类会频繁触发的事件.简单的看看: 1 2 3 4 var i = 0; window.addEventListener('scroll',function(){   

【前端性能】高性能滚动 scroll 及页面渲染优化

最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作. 本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,是我自己学习记录的一个过程,如果上面列出的知识点都了然于胸了,就可以不必往下看了.    滚动优化的由来 滚动优化其实也不仅仅指滚动(scroll 事件),还包括了例如 resize 这类会频繁触发的事件.简单的看

django数据库中的时间格式与页面渲染出来的时间格式不一致的处理

django数据库中的时间格式与页面渲染出来的时间格式不一致的处理. 在数据库里,时间是这样显示的: date: 2012-07-21 12:27:22 | date | datetime | NO | | NULL | | +-----------+-------------+------+-----+---------+----------------+ 在模板里用: <span>{{ post.date }}</span> 打印出来,时间格式是这样的: July 21, 20

【前端性能】高性能滚动 scroll 及页面渲染优化--转发

本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,可以对照上面的知识点,选择性跳到相应地方阅读.    滚动优化的由来 滚动优化其实也不仅仅指滚动(scroll 事件),还包括了例如 resize 这类会频繁触发的事件.简单的看看: 1 2 3 4 var i = 0; window.addEventListener('scroll',function(){   

CSS 异步加载技术 不影响页面渲染

本文展示了一种技术,它能通过异步下载样式表,以阻止它们的下载阻塞页面的渲染,从而尽可能快的让访问者获取到信息内容. 警告! 我发这篇帖子全是好意,但是它并不负责让读它的人意识到下面将会遇到的问题. 社区很快地给了我许多的反馈 (有些反馈我很感激) ,而越来越明显的是这项技术并不如我所希望的那样稳定. 不像我那样的成功地对它进行了测试和利用,许多开发者在 IE 和 Firefox 中都遇到了问题( F F测试版中直接崩溃) 而其他人则报告在 Chrome 和 Safari 中是成功的.我现在的建议

加载 CSS 时不影响页面渲染

转自:http://www.oschina.net/translate/loading-css-without-blocking-render 本文展示了一种技术,它能通过异步下载样式表,以阻止它们的下载阻塞页面的渲染,从而尽可能快的让访问者获取到信息内容. 警告! 我发这篇帖子全是好意,但是它并不负责让读它的人意识到下面将会遇到的问题. 社区很快地给了我许多的反馈 (有些反馈我很感激) ,而越来越明显的是这项技术并不如我所希望的那样稳定. 不像我那样的成功地对它进行了测试和利用,许多开发者在

页面渲染深入解析

基本渲染过程 用户请求的资源通过浏览器的网络层到达渲染引擎后,渲染工作开始.每次渲染文档通常不会超过8K的数据块,其中基础的渲染过程如下图所示: 第一步:渲染引擎首先解析HTML文档,转换为一棵DOM树: 第二步:接下来不管是内联式,外联式还是嵌入式引入的CSS样式也会被解析,渲染出另 外一棵用于渲染DOM树的树-渲染树(render tree) ,渲染树包含带有颜色,尺寸等显示属性的矩形,这些矩形的顺序与显示顺序一致: 第三步:然后就是对渲染树的每个节点进行布局处理,确定其在屏幕上的显示位置:

前端高性能滚动 scroll 及页面渲染优化

前言 最近在研究页面渲染及web动画的性能问题,以及拜读<CSS SECRET>(CSS揭秘)这本大作.本文主要想谈谈页面优化之滚动优化. 主要内容包括了为何需要优化滚动事件,滚动与页面渲染的关系,节流与防抖,pointer-events:none 优化滚动.因为本文涉及了很多很多基础,是我自己学习记录的一个过程,如果上面列出的知识点都了然于胸了,就可以不必往下看了. 滚动优化的由来 滚动优化其实也不仅仅指滚动(scroll 事件),还包括了例如 resize 这类会频繁触发的事件.简单的看看

页面 渲染 回流 测试 笔记

页面重绘(repaints),回流(reflow),网上已经有很多介绍了,以前也只是看看,并没有仔细理解,所以现在留点笔记 一些有用的连接 http://www.zhangxinxu.com/wordpress/2009/10/attention-reflow-to-make-web-faster/ http://www.zhangxinxu.com/wordpress/2010/01/%E5%9B%9E%E6%B5%81%E4%B8%8E%E9%87%8D%E7%BB%98%EF%BC%9Ac