浏览器的渲染机制初探

零、什么是DOCTYPE及其作用?

  • 1、DTD(document type definition):文档类型定义,是一系列的语法规则,用来定义XML或(X)HTML 的文件类型。浏览器会使用它来判断文档类型,决定使用何种协议来解析,以及切换浏览器模式。

通俗易懂的说就是,DTD告诉浏览器我是什么文档类型,浏览器根据这来判断用什么解析和渲染它。

  • 2、DOCTYPE是用来申明文档类型和DTD规范的,一个主要用途便是文件的合法性验证。如果文件代码不合法,那么浏览器解析时便会出一些差错。

通俗易懂的解释就是,DOCTYPE通知浏览器当前文档包含的是哪个DTD,即何种文档类型。

  • 3、HTML 5 的DOCTYPE写法:
    <!DOCTYPE >

  • 4、HTML 4.0.1有两种DOCTYPE写法,一种严格模式(strict),一种传统模式(Transitional)。

严格模式(Strict):该DTD包含所有HTML元素和属性,但不包括展示性的和弃用的元素,如font,center,big等
传统模式(Tranditional):该DTD包含所有HTML元素和属性,包括展示性的和弃用的元素,如font,center,big等

一、浏览器的渲染过程

浏览器渲染过程(图片来源网络)

几个概念:
DOM Tree:浏览器将HTML解析成树形的数据结构。

CSS Rule Tree:浏览器将CSS解析成树形的数据结构。

Render Tree: DOM和CSSOM合并后生成Render Tree。

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

Painting: 按照算出来的规则,通过显卡,把内容画到屏幕上。

渲染过程:

  • (1) 浏览器会将HTML解析成一个DOM树,DOM 树的构建过程是一个深度遍历过程:当前节点的所有子节点都构建好后才会去构建当前节点的下一个兄弟节点。

  • (2) 将CSS解析成 CSS Rule Tree 。

  • (3) 根据DOM树和CSSOM来构造 Render Tree。注意:Rendering Tree 渲染树并不等同于 DOM 树,因为一些像Header或display:none的东西就没必要放在渲染树中了。

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

  • (5) 再下一步就是绘制,即遍历render树,并使用UI后端层绘制每个节点。

二、Reflow 重排

1、定义

当渲染树中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建, 这就是重排。每个页面至少需要一次回流,就是在页面第一次加载的时候。

2、怎么触发Reflow

任何页面布局和几何属性的改变都会触发重排,比如:

  • 1、页面渲染初始化;(无法避免)

  • 2、添加或删除可见的DOM元素;

  • 3、元素位置的改变,或者使用动画;(position、left、right等)

  • 4、元素尺寸的改变——大小,外边距,边框(margin、padding和margin);

  • 5、浏览器窗口尺寸的变化(resize事件发生时);

  • 6、填充内容的改变,比如文本的改变或图片大小改变而引起的计算值宽度和高度的改变;(font-size、font-weight等)

  • 7、读取某些元素属性:(offsetLeft/Top/Height/Width, clientTop/Left/Width/Height, scrollTop/Left/Width/Height, width/height, getComputedStyle(), currentStyle(IE) )

三、Repaint 重绘

1、定义

当盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来之后,浏览器便把这些原色都按照各自的特性绘制一遍,将内容呈现在页面上。

重绘是指一个元素外观的改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。

2、怎么触发Repaint

改变元素外观属性。如:color,background-color等

注意:重排必定会引发重绘,但重绘不一定会引发重排。

四、怎么避免重排和重绘

重排和重绘都会影响网页加载性能。应该尽量避免重排和重绘,特别是重排,常见做法如下:

  • 1、不要一条一条地修改 DOM 的样式,而是通过新增一个类名(classname),把样式写在这个类名上,去改变元素样式。

  • 2、把 DOM ”离线”后修改,比如:先把 DOM 给 display:none (有一次 Reflow),然后你修改100次,然后再把它显示出来

  • 3、尽量不要使用table布局,因为table中某个元素旦触发了reflow,那么整个table的元素都会触发reflow。那么在不得已使用table的场合,可以设置table-layout:auto;或者是table-layout:fixed这样可以让table一行一行的渲染,这种做法也是为了限制reflow的影响范围

  • 4、为动画的元素使用绝对定位 absolute / fixed

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

推荐阅读更多精彩内容