浏览器的渲染机制以及JS运行机制

渲染机制

DOCTYPE的作用

  • DTD(文档定义类型)是一系列的语法规则,用来定义XML或者(X)HTML的文件类型。浏览器会使用它来判断文档类型,决定用何种协议来解析,以及切换浏览器模式
  • DOCTYPE是用来声明文档类型和DTD规范的,一个主要的用途是文件的合法性验证。如果文件代码不合法,那么解析的时候会出一些差错。

DOCTYPE类型

  • HTML5 <!DOCTYPE html>
  • HTML 4.01 Strict 严格模式 该DTD包含所有HTML元素和属性,但不包括展示性和弃用的元素
  • HTML 4.01 Transitional 传统模式 该DTD包含所有HTML元素和属性,
    包括展示性和弃用的元素 (比如font)

浏览器渲染过程

DOC渲染过程

所以浏览器的渲染过程主要包括以下几步:

  • 解析HTML生成DOM树。
  • 解析CSS生成CSSOM规则树。
  • 将DOM树与CSSOM规则树合并在一起生成渲染树。
  • 遍历渲染树开始布局,计算每个节点的位置大小信息。
  • 将渲染树每个节点绘制到屏幕。

渲染阻塞

当浏览器遇到一个 script 标记时,DOM 构建将暂停,直至脚本完成执行,然后继续构建DOM。每次去执行JavaScript脚本都会严重地阻塞DOM树的构建,如果JavaScript脚本还操作了CSSOM,而正好这个CSSOM还没有下载和构建,浏览器甚至会延迟脚本执行和构建DOM,直至完成其CSSOM的下载和构建。

所以,script 标签的位置很重要。实际使用时,可以遵循下面两个原则:

  • CSS 优先:引入顺序上,CSS 资源先于 JavaScript 资源。
  • JS置后:我们通常把JS代码放到页面底部,且JavaScript 应尽量少影响 DOM 的构建。

重排reflow

定义

DOM结构中的每个元素都有自己的盒模型,这些都需要浏览器根据各种样式来计算并根据结果将元素放到它该出现的位置,这个过程叫做reflow

触发reflow

  • 当增加、删除、修改DOM节点的时候,会导致reflow或者repaint
  • 当你移动DOM节点,或者搞动画的时候
  • 当你修改CSS样式的时候
  • 当你resize窗口的时候(移动端没有这个问题),或者滚动的时候
  • 当你修改网页默认字体的时候(这个会出现各种问题)
  • 如何触发reflow应该至少要记住以上两点以上

重绘repaint

定义

当各种盒子的位置、大小以及其他属性改动,例如字体大小颜色等都确定下来以后,浏览器就把这个元素按照各自的特性绘制了一遍,于是页面内容就出现了,这个过程叫做repaint

触发repaint

  • DOM改动
  • CSS改动

如何尽可能少的进行重绘

将DOM改动或者CSS改动尽可能的一次性改完,不要一次操作分多次进行
例子:

//多次重绘
dom1.style.backgroundColor = 'red'
dom1.style.width= '50px'
dom1.style.height= '50px'
//一次重绘
//CSS
.add{
  backgound-color: red;
  width: 50px;
  heiht: 50px;
}
//JS
dom2.className = 'add'

JS运行机制

JS是单线程的,不可以同时执行多个任务,但是同时也有异步操作。JS会优先执行同步操作,然后同步操作都完成以后再去执行异步操作。

console.log(1)
setTimeout(function() {
  console.log(3)
}, 0)
console.log(2)
//输出顺序为 1 2 3 因为setTimeout是一个异步函数
console.log(1)
setTimeout(function() {
  console.log(2)
}, 0)
while (true) {
  
}
//只输出1然后进入无线循环不输出2

验证了所有同步操作完成之前异步操作是不会被执行的。

Event Loop

for(var i = 0;i < 4;i++) {
  setTimeout(function() {
    console.log(i)
  },1000)
} 
//输出四个4

上面这段代码同时输出4个4.因为在循环的过程中遇到setTimeout会记住这个函数,但是不会去执行他,然后进入下一轮循环,等到循环结束,setTimeout被放入异步队列执行。

异步任务

  • setTimeout 和 setInterval
  • DOM事件
  • ES6中的promise

总结

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

推荐阅读更多精彩内容