浏览器解析

一个是HTML/SVG/XHTML,事实上,Webkit有三个C++的类对应这三类文档。解析这三种文件会产生一个DOM Tree。

CSS,解析CSS会产生CSS规则树。
Javascript,脚本,主要是通过DOM API和CSSOM API来操作DOM Tree和CSS Rule Tree.

2)解析完成后,浏览器引擎会通过DOM Tree 和 CSS Rule Tree 来构造 Rendering Tree。注意:
Rendering Tree 渲染树并不等同于DOM树,因为一些像Header或display:none的东西就没必要放在渲染树中了。
CSS 的 Rule Tree主要是为了完成匹配并把CSS Rule附加上Rendering Tree上的每个Element。也就是DOM结点。也就是所谓的Frame。
然后,计算每个Frame(也就是每个Element)的位置,这又叫layout和reflow过程。

3)最后通过调用操作系统Native GUI的API绘制。

DOM解析

HTML的DOM Tree解析如下:

<html>
<html>
<head>
<title>Web page parsing</title>
</head>
<body>
<div>
<h1>Web page parsing</h1>
<p>This is an example Web page.</p>
</div>
</body>
</html>

上面这段HTML会解析成这样:

&amp;lt;img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3BpYzMuemhpbWcuY29tLzMyYTA4MzM3MWY2OWIwNDRjZWRmM2Y5M2ViODZkNTlhX2IuanBn.jpg" class="content_image"&amp;gt;下面是另一个有SVG标签的情况。下面是另一个有SVG标签的情况。

&amp;lt;img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3BpYzEuemhpbWcuY29tL2YxMTYyNTBkYzNiZjRjYmQzZWY3MDJmOWYxODg1YmU0X2IuanBn.jpg" class="content_image"&amp;gt;

CSS解析

CSS的解析大概是下面这个样子(下面主要说的是Gecko也就是Firefox的玩法),假设我们有下面的HTML文档:

<doc>
<title>A few quotes</title>
<para>
Franklin said that <quote>"A penny saved is a penny earned."</quote>
</para>
<para>
FDR said <quote>"We have nothing to fear but <span>fear itself.</span>"</quote>
</para>
</doc>

于是DOM Tree是这个样子:

&amp;lt;img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3BpYzQuemhpbWcuY29tLzQ1ODdkYzA3M2RmODU4ODgwOTNhZTc0NTdjZDViZGI3X2IuanBn.jpg" class="content_image"&amp;gt;

然后我们的CSS文档是这样的:

/* rule 1 */ doc { display: block; text-indent: 1em; }
/* rule 2 */ title { display: block; font-size: 3em; }
/* rule 3 */ para { display: block; }
/* rule 4 */ [class="emph"] { font-style: italic; }

于是我们的CSS Rule Tree会是这个样子:

&amp;lt;img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3BpYzIuemhpbWcuY29tLzlhYzBiNzI4YmM3MzNiZjFjNDBlOGU0ZGZmOWU0OGE5X2IuanBn.jpg" class="content_image"&amp;gt;

注意,图中的第4条规则出现了两次,一次是独立的,一次是在规则3的子结点。所以,我们可以知道,建立CSS Rule Tree是需要比照着DOM Tree来的。CSS匹配DOM Tree主要是从右到左解析CSS的Selector,好多人以为这个事会比较快,其实并不一定。关键还看我们的CSS的Selector怎么写了。

注意:CSS匹配HTML元素是一个相当复杂和有性能问题的事情。所以,你就会在N多地方看到很多人都告诉你,DOM树要小,CSS尽量用id和class,千万不要过渡层叠下去,……

通过这两个树,我们可以得到一个叫Style Context Tree,也就是下面这样(把CSS Rule结点Attach到DOM Tree上):

&amp;lt;img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3BpYzIuemhpbWcuY29tLzU5ODFiZDE2MDJkNmQ0MTFmMzY0ODA5MTZiZWNkNTY5X2IuanBn.jpg" class="content_image"&amp;gt;所以,Firefox基本上来说是通过CSS 解析 生成 CSS Rule Tree,然后,通过比对DOM生成Style Context Tree,然后Firefox通过把Style Context Tree和其Render Tree(Frame Tree)关联上,就完成了。注意:Render Tree会把一些不可见的结点去除掉。而Firefox中所谓的Frame就是一个DOM结点,不要被其名字所迷惑了。所以,Firefox基本上来说是通过CSS 解析 生成 CSS Rule Tree,然后,通过比对DOM生成Style Context Tree,然后Firefox通过把Style Context Tree和其Render Tree(Frame Tree)关联上,就完成了。注意:Render Tree会把一些不可见的结点去除掉。而Firefox中所谓的Frame就是一个DOM结点,不要被其名字所迷惑了。

&amp;lt;img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3BpYzIuemhpbWcuY29tLzM2NTc2NzUxNWZiZmJmY2RjNjU1MWQzM2RmYTA0NjU1X2IuanBn.jpg" class="content_image"&amp;gt;

注:Webkit不像Firefox要用两个树来干这个,Webkit也有Style对象,它直接把这个Style对象存在了相应的DOM结点上了。

渲染

渲染的流程基本上如下(黄色的四个步骤):
计算CSS样式
构建Render Tree
Layout – 定位坐标和大小,是否换行,各种position, overflow, z-index属性 ……
正式开画

&amp;lt;img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHBzL3BpYzEuemhpbWcuY29tL2JlZjZkNmE0YjU5MDE0MzY3YzEyNDYxM2Q1Nzc5YTEwX2IuanBn.jpg" class="content_image"&amp;gt;

注:

来源链接:http://www.zhihu.com/question/20117417/answer/22359160

时间: 2024-11-06 07:49:05

浏览器解析的相关文章

js里各浏览器解析XML,支持IE、火狐、Chrome等

js在chrome中加载XML,js加载XML支持ff,IE6+,Opera等浏览器 见代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>js里各浏览器解析XML,支持IE.火狐.Chrome等</title> </head> <body> <script> fu

浏览器解析原理

曾经有人说过,作为一个程序员搞前端不应该以美工的心态来对待,而是应该是一个程序按的常识去看待. 先前一开始学习web前端的时候,由于学得不怎么扎实,很多东西都是靠敲多了,也就自然记住了,很多原理性的东西都不懂,所以一旦生疏了, 很多前端的东西搞起来就非常耗时耗力,前段时间了解了一旦浏览器的制作原理之后,用一个程序员的心态来看待代码,就感觉轻松了很多. 浏览器的制作原理: 其实我们在浏览器中的每一个标签都可以理解为一个对象,经过浏览器解析器解析后变成一个对象,然后存储在内存堆中,例如下面标签 <i

浅谈浏览器解析 URL+DNS 域名解析+TCP 三次握手与四次挥手+浏览器渲染页面

(1)浏览器解析 URL 为了能让我们的知识层面看起来更有深度,我们应该考虑下面两个问题了: 从浏览器输入 URL 到渲染成功的过程中,究竟发生了什么? 浏览器渲染过程中,发生了什么,是不是也有重绘与回流? OK,兴致来了,我们就先从 浏览器解析 URL 看起,先来看看当用户输入 URL,到浏览器呈现给用户页面,经历了以下过程: 版本 A: 用户输入 URL 地址. 对 URL 地址进行 DNS 域名解析. 建立 TCP 连接(三次握手). 浏览器发起 HTTP 请求报文. 服务器返回 HTTP

JS作用域,浏览器解析原理

---恢复内容开始--- 浏览器: JS解析器:这儿理解为两步1)JS的预解析:“找一些东西”:var function 参数:   (1)所有的变量,在正式运行代码之前,都提前赋一个值:未定义   a=undefined:(2)所有的函数,在正式运行代码之前,都是整个函数块  fn1=function fn1(){alert(2);} 2)逐行解读代码(在第一步形成的仓库的基础上解读)表达式:= + - * / % !++ -- ......逐行读到表达式的时候会改变与预解析中变量的值 注:J

浏览器解析模式

DOCTYPE,或者称为 Document Type Declaration(文档类型声明,缩写 DTD).通常情况下,DOCTYPE 位于一个 HTML 文档的最前面的位置,根元素 html 的起始标签之前,前面没有任何内容,不区分大小写.因为浏览器必须在解析 HTML 文档正文之前就确定当前文档的类型,以决定其需要采用的渲染模式.不同的渲染模式会影响到浏览器对于 CSS 代码甚至 JavaScript 脚本的解析.尤其是在 IE 系列浏览器中,由 DOCTYPE 所决定的 HTML 页面的渲

谷歌浏览器,火狐浏览器,ie浏览器解析顺序

谷歌(版本 55.0.2883.87 m),火狐(48.0.2),ie(11.576.14393.0)对三个浏览器简单的进行了一下试验发现,谷歌浏览器是等到html全部解析完毕之后才开始渲染,而另外两款浏览器则是边解析边渲染. 测试代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" c

关于浏览器解析html全过程详解

本人web前端菜鸟一枚,第一次在这里发博客梳理知识,知识都是从各地方查阅引用以及自己的理解得来,有什么错误的地方欢迎指正. DOM文档通常加载的步骤: 1.解析HTML结构. 2.加载外部脚本和样式表文件 3.解析并执行脚本代码. 4.DOM树构建完成.//DOMContentLoaded 5.加载图片等外部资源. 6.页面加载完毕.//load 顺序是这样,但很多时候几个步骤是同时发生的. 在这里梳理一下完整流程下的各种细节: 由于浏览器采用至上而下的方式解析,所以会先解析html,直到遇到外

浏览器解析HTML文档的资源并下载

<img />,<style>这些资源是并行请求与加载. <script>脚本是同步请求与加载,阻塞加载.加载完成并执行后再继续解析HTML. 动态<script>是异步加载,就是说可以同时加载其他资源. 关于<script>的执行,分为立即执行和延迟执行. 对于浏览器来说,不管是<style>, <img />, <script>都是一视同仁,都是并行请求多个资源文件并加载,而不是一次只请求一个资源并加载.

HTML中head里的内容经浏览器解析后全到body里

我从linux服务器nginx上把一个网站迁移到windows的IIS上数据什么的都么有问题,配置好rewrite以后,访问网站,发现样式变动了,网站上方空出了一块我用chrome浏览器的审查元素一看,发现head里的内容全到Body里了,而且body的最开始出多出了一块带引号的空白! 但是如果右键查看源代码的话,代码是正确的,没有问题! 正常状态 错误状态 是include的问题,包含的文件是utf-8编码的,但是有BOM头,我用一个函数把网站目录里的所有文件的BOM头去掉以后就恢复正常了,希