浏览器的解析原理

作者: 古朋 | 来源:发表于2017-04-19 23:06 被阅读0次

浏览器工作流程

先来个流程图,让大家心里有个底:

webkitflowwebkitflow

从上图,我们能看到这几点:

  1. 浏览器会解析
    • HTML生成DOM Tree
    • CSS生成Style Rules
  2. 解析完成后,浏览器引擎会通过DOM Tree 和 CSS Rule Tree 来构造 Render Tree(渲染树)。注意:Render Tree 渲染树并不等于DOM树,因为head元素和一些display:none的元素没有放在渲染树中

浏览器解析

有下面的HTML示例如下:

<html> 
    <body> 
        <div class =“err” id =“div1”> 
            <p> 
              这是一个
              <span class =“big”>大错误</span> 
              这也是一个
              <span class =“big”>非常大的错误</span>错误
            </p> 
        </div> 
        <div class =“err” id =“div2”>另一个错误</div> 
    </body> 
</html>

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

/*1.*/ div {margin:5px; color:black} 
/*2.*/ .err {color:red} 
/*3.*/ .big {margin-top:3px} 
/*4.*/ div span {margin-bottom:4px} 
/*5.*/ #div1 {color:蓝色} 
/*6.*/ #div2 {color:green}

于是我们的CSS Rule Tree是这样:

image027image027

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

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

image029image029

这个时候就有必要说下这个CSS选择器特性了

选择器特性

CSS选择器由CSS2规范定义如下:

  • 如果声明来自是“样式”属性,则计数1,否(= a)
  • 计数选择器中的ID属性数(= b)
  • 计数选择器中其他属性和伪类的数量(= c)
  • 计数选择器中元素名称和伪元素的数量(= d)

连接四个数字abcd(在具有大基数的数字系统中)具有特异性。

这个四个数字保持的优先级是:a>b>c>d

您需要使用的数字基数由您在其中一个类别中的最高数量定义。
例如,如果a = 14,您可以使用十六进制基数。在不太可能的情况下,您将需要一个17位数的基数。后来的情况可能会发生在这样的选择器:html body div div p ...(你的选择器中的17个标签不太可能)。

一些例子:

* {} / * a = 0 b = 0 c = 0 d = 0  - > specificity = 0,0,0,0 * / 
li {} / * a = 0 b = 0 c = 0 d = 1  - >specificity= 0,0,0,1 * / 
li:first-line {} / * a = 0 b = 0 c = 0 d = 2  - > specificity = 0,0,0,2 * / 
ul li {} / * a = 0 b = 0 c = 0 d = 2  - > specificity = 0,0,0,2 * / 
ul ol + li {} / * a = 0 b = 0 c = 0 d = 3  - > specificity = 0 ,0,0,3 * / 
h1 + * [rel = up] {} / * a = 0 b = 0 c = 1 d = 1  - > specificity = 0,0,1,1 * / 
ul ol li.red {} / * a = 0 b = 0 c = 1 d = 3  - > specificity = 0,0,1,3 * / 
li.red.level {} / * a = 0 b = 0 c = 2 d = 1 - > specificity = 0,0,2,1 * / 
#test {} / * a = 0 b = 1 c = 0 d = 0  - > specificity = 0,1,0,0 * / 
style =“”/ * a = 1 b = 0 c = 0 d = 0  - > specificity = 1,0,0,0 * /

参考地址:

How browsers work

CSS2规范

相关文章

  • 经典面试题:浏览器是怎样解析CSS的?

    摘要: 理解浏览器原理。 原文:浏览器解析 CSS 样式的过程 作者:前端小智 解析 一旦 CSS 被浏览器下载,...

  • 浏览器原理相关视频课程

    大话浏览器渲染原理浏览器渲染原理和打开网页机制HTTPS 网络协议原理解析从零开始,彻底掌握浏览器渲染原理深入V8...

  • 浏览器

    浏览器 浏览器渲染原理 浏览器会将HTML解析成一个DOM树,将CSS解析成 CSS Rule Tree 。根据D...

  • 异步加载 js 文件

    浏览器加载 js 的原理 浏览器一边下载 HTML 网页,一边解析 在解析的过程中,如果遇到 标签,就暂停解析,把...

  • 2020-07-23 18课 CSS动画+浏览器渲染原理

    浏览器渲染原理 渲染机制 浏览器加载HTML代码后解析HTML代码来构建HTML树(DOM) 加载CSS代码后解析...

  • 前端项目工程化

    浏览器解析原理+websockt通信原理 webpack,webpack-server,数据传输,项目(开发模式)...

  • 《CSS 知识总结》

    一、.浏览器渲染原理 1.解析HTML→构建HTML树(DOM) 2.解析CSS→构建CSS树(CSSDOM) 3...

  • 《CSS 知识总结》

    一、.浏览器渲染原理 1.解析HTML→构建HTML树(DOM) 2.解析CSS→构建CSS树(CSSDOM) 3...

  • Font

    font-family(字体原理) 使用浏览器打开页面时,浏览器会读取 HTML 文件进行解析渲染。当读到文字时会...

  • 图片的懒加载

    背景和原理   浏览器在解析网页时会解析整个HTML代码,一般情况下,浏览器会请求其中所有的图片并把它们都下载下来...

网友评论

    本文标题:浏览器的解析原理

    本文链接:https://www.haomeiwen.com/subject/hvckzttx.html