JS(12)——页面加载、解析和渲染流程

1. Javascript的加载和执行的特点

1、载入后马上执行。 

2执行时会阻塞页面后续的内容(包括页面的渲染、其它资源的下载)。原因:因为浏览器需要一个稳定的DOM树结构,而JS中很有可能有 代码直接改变了DOM树结构,比如使用 document.write appendChild,甚至是直接使用的location.href进行跳转,浏览器为了防止出现JS修 改DOM树,需要重新构建DOM树的情况,所以 就会阻塞其他的下载和呈现。


减少 JavaScript 对性能的影响的方法

1将所有的script标签放到页面底部,也就是body闭合标签之前,这能确保在脚本执行前页面已经完成了DOM树渲染。

2尽可能地合并脚本。页面中的script标签越少,加载也就越快,响应也越迅速。无论是外链脚本还是内嵌脚本都是如此。

3采用无阻塞下载 JavaScript 脚本的方法: 
1)使用script标签的 defer 属性(仅适用于 IE Firefox 3.5 以上版本); 

2)使用动态创建的script元素来下载并执行代码;


2. CSS匹配特点

CSS选择符是从右到左进行匹配的。例如:#nav li ,会去找所有的li,然后再去确定它的父元素是不是#nav。因此,写css的时候需要注意:

1dom深度尽量浅。

2减少inline javascriptcss的数量。

3使用现代合法的css属性。

4不要为id选择器指定类名或是标签,因为id可以唯一确定一个元素。

5避免后代选择符,尽量使用子选择符。原因:子元素匹配符的概率要大于后代元素匹配符。后代选择符:#tp p{} ,子选择符:#tp>p{}

6避免使用通配符,例如:.mod .hd *{font-size:14px;} 根据匹配顺序,将首先匹配通配符也就是说先匹配出通配符,然后匹配.hd(就是要对dom树上的所有节点进行遍历他的父级元素)然后匹配.mod,这样的性能耗费可想而知。


3. 页面解析及渲染

解析渲染流程图如下:



浏览器会解析三个东西: HTML/SVG/XHTML、 CSS和Javascript脚本。HTML/SVG/XHTML,解析这三种文件会产生一个 DOM Tree 解析CSS会产生CSS规则树。 解析Javascript脚本,主要是通过 DOM API CSSOM API 来操作 DOM Tree CSS Rule Tree.

当浏览器获得一个html文件时,会自上而下加载,并在加载过程中进行解析渲染: 
1、浏览器会将HTML解析成一个DOM树,DOM 树的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好后才会去构建当前节点的下一个兄弟节点。 
2、CSS解析成 CSS Rule Tree  
3、根据DOM树和CSSOM来构造 Rendering Tree。注意:Rendering Tree 渲染树并不等同于 DOM 树,因为一些像 Header display:none 的东西就没必要放在渲染树中了。

4、有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系。下一步操作称之为Layout,顾名思义就是计算出每个节点在屏幕中的位置。 
5、再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点。

 即,渲染引擎在取得内容之后的基本流程为:

解析html以构建dom->构建render-> 布局render-> 绘制render

注意为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。


4. Reflow(回流) Repaint(重绘)

1

Reflow(回流):浏览器要花时间去渲染,当它发现了某个部分发生了变化影响了布局,那就需要倒回去重新渲染。 
Repaint(重绘):如果只是改变了某个元素的背景颜色,文字颜色等,不影响元素周围或内部布局的属性,将只会引起浏览器的repaint,重画某一部分。 

Reflow要比Repaint更花费时间,也就更影响性能。所以在写代码的时候,要尽量避免过多的Reflow

2reflow的原因:

1)页面初始化的时候; 
2)操作DOM时; 
3)某些元素的尺寸变了; 
4)如果 CSS 的属性发生变化了。

3减少 reflow和repaint

1)不要一条一条地修改 DOM 的样式。与其这样,还不如预先定义好 css class,然后修改 DOM className 
2)不要把 DOM 结点的属性值放在一个循环里当成循环里的变量。 
3)为动画的 HTML 元件使用 fixed absoult position,那么修改他们的 CSS 是不会 reflow 的。 

4)千万不要使用 table 布局。因为可能很小的一个小改动会造成整个 table 的重新布局。


HTML页面加载和解析流程实例: 
1、 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件; 
2、浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件; 
3、浏览器又发出CSS文件的请求,服务器返回这个CSS文件; 
4、浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了; 
5、浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码; 
6、服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码; 
7、 浏览器发现了一个包含一行Javascript代码的<script>标签,立刻运行它; 
8、Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=none”)。突然少了这么一个元素,浏览器不得不重新渲染这部分代码; 
9、终于等到了</html>的到来,浏览器泪流满面…… 
10、等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径; 
11、浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。


猜你喜欢

转载自blog.csdn.net/u013789656/article/details/80943573
今日推荐