网页渲染机制

如题,本文将简介一下 浏览器对页面的渲染的过程

一个网页里面主要包含三大块东西,Html/CSS/JavaScript。

一.先说几个概念:

1.DOM:Document Object Model DOM:浏览器将HTML解析成树形的数据结构,简称DOM。

2.CSSOM:CSS Object Model,浏览器将CSS代码解析成树形的数据结构。

3.Render Tree:DOM树和CSSOM树连接在一起形成(称之为)Render Tree(渲染树)。

3.Layout:计算出Render Tree每个节点的具体位置。

4.Painting:通过显卡,将Layout后的节点内容分别呈现到屏幕上。

二.浏览器渲染过程

1.Create/Update DOM And request css/image/js:浏览器请求到HTML代码后,在生成DOM的最开始阶段(应该是 Bytes → characters 后),并行发起css、图片、js的请求,无论他们是否在HEAD里。

2.Create/Update Render CSSOM:CSS文件下载完成,开始构建CSSOM。

3.Create/Update Render Tree:所有CSS文件下载完成,CSSOM构建结束后,和 DOM 一起生成 Render Tree,Render Tree用来描述所有可见的DOM内容,并且将CSSOM样式信息附加到节点上。

为了形成渲染树,浏览器大致做的事情有:

(1)从DOM树根节点开始,遍历每一个可见的节点

  • 一些节点是完全不可见的(比如 script标签,meta标签等),这些节点 会被忽略,因为他们不会影响渲染的输出
  • 一些节点是通过CSS样式隐藏了,这些节点同样被忽略——例如某个元素的样式指定为display:none;将被忽略。
  • 注意:“visibility:hidden”和“display:none”之间的不同:“visibility:hidden”将元素设置为不可见,但是同样在布局上占领一定空间(例如,它会被渲染成为空盒子),“display:none”的元素是将节点从整个Render Tree中移除,所以不是布局中的一部分 。

(2)对每一个可见的节点,找到合适的匹配的CSSOM规则,并且应用样式

(3)显示可见节点(节点包括内容和被计算的样式)

4.Layout:有了Render Tree,浏览器已经能知道网页中有哪些节点、各个节点的CSS定义以及他们的从属关系。Layout,顾名思义就是计算出每个节点在屏幕中的位置。

5.Painting:Layout后,浏览器已经知道了哪些节点要显示(which nodes are visible),每个节点的CSS属性是什么(their computed styles),每个节点在屏幕中的位置是哪里(geometry)。就进入了最后一步:Painting,按照算出来的规则,通过显卡,把内容画到屏幕上。

  • 以上五个步骤前3个步骤之所有使用 “Create/Update” 是因为DOM、CSSOM、Render Tree都可能在第一次Painting后又被更新多次,比如JS修改了DOM或者CSS属性。

  • Layout 和 Painting 也会被重复执行,除了DOM、CSSOM更新的原因外,图片下载完成后也需要调用Layout 和 Painting来更新网页


三.CSS和JavaScript特性:

1.CSS会并发加载:浏览器解析http response 下载html文件会”自上而下“加载,并在加载过程中进行解析渲染。加载过程中遇到外部css文件,浏览器另外发出一个请求,来获取css文件。这里css解析会生成一个rule tree(规则树),这个以后会更新。

2.JavaScript只能单独加载:当文档加载过程中遇到js文件,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程

四.JavaScript有哪些形式,可以放在什么地方?

  • 外部引入
    <body>...<script src="index.js"></script></body>

  • Html内置
    <body>
    ...
    <script>
    alert(1);
    </script>
    </body>

注意:根据页面渲染原理和JavaScript单独加载的特性,以上两种形式都需放置在<body>标签内接近闭合标签的地方(head内的js会阻塞页面内容的呈现及渲染,也会阻塞其后组件的下载,会导致“白屏”现象)

五.加载异步

  • 加关键字 defer或async,浏览器会立即加载并执行指定脚本,“立即”指的是不等待后续文档载入,读到就加载并执行。

1.async,加载和渲染后续文档元素的过程将和script.js的加载与执行并行进行(异步)。

    <script async src="index.js"></script>        

2.defer,加载后续文档元素的过程将和script.js的加载并行进行(异步),但script.js的执行要在所有元素解析完成之后DOMContentLoaded事件触发之前完成。

    <script defer src="index.js"></script>                

defer和async作用:页面引入其他网站代码,引入的代码不会影响当前页面的展现

注意
defer:脚本延迟到文档解析和显示后执行,有顺序。
async:不保证顺序。

本文配图及部分内容来自于饥人谷,版权归饥人谷_海瀚和饥人谷所有,转载需说明来源
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

  • 渲染引擎及关键渲染路径(Critical Rendering Path) 通过网络模块加载到HTML文件后渲染引擎...
    饥人谷_有点热阅读 1,738评论 0 3
  • 网页通过浏览器展示在我们面前,说网页的渲染机制就是说浏览器怎么渲染页面的。市面上浏览器主流浏览器chrome,fi...
    leocz阅读 283评论 0 0
  • 浏览器基本结构 浏览器结构一般包括如下:1.用户界面(User Interface):用户所看到的界面,并且与之交...
    losspm阅读 340评论 0 0
  • 简单+浅谈前端页面渲染机制。参考教程每天接触最多的某过于浏览器了。常见的浏览器chrome firefox ope...
    简人CC阅读 216评论 0 0
  • 参考文献1.Render-Tree Construction, Layout, and Paint1.Render...
    guidetheorient阅读 112评论 0 0