浏览器渲染过程与原理

浏览器发出请求之后

浏览器发出请求–》DNS查询–》DNS缓存–》请求到服务器–》服务器代码运行–》返回HTML文档–》浏览器渲染页面

浏览器引擎:JS引擎和渲染引擎

浏览器渲染引擎:

IE(Trident)
Chrome(Blink)
Firefox(Gecko)
Opera(Blink)
Safari(Webkit)
UC(U3)
QQ浏览器/微信webview(X5/Blink):原来是X5,后来改为Blink

Blink与Webkit的关系:Blink基于Webkit,原理差不多

浏览器渲染过程

这里写图片描述

DOM解析:把HTML文档解析为DOM树的过程

  • 遇到<script>标签则停止解析,先执行js
  • DOMContentLoaded事件在HTML文档完全加载并解析后触发,不等样式表、图片、子帧(subframes)完成加载。
  • 此时图片资源并未加载完成

查看节点类型:在element处选中要查看的节点,在console处输入$0.constructor,即可看到选中节点的类型。

CSS解析:将CSS代码解析为CSS规则树的过程

  • 与DOM解析同步进行
  • 与script的执行互斥(js中可能要获取css属性)
  • Webkit内核进行了script执行优化(当script与css无关时,不会互斥)

DOM Tree

DOM树结构与HTML标签一一对应

  • display:none的元素也在DOM树中
  • <script>标签也在DOM树中
  • 注释也在DOM树中

Render Tree

DOM Tree + CSS Rules = Render Tree

  • 每个节点为一个Render Object对象,包含宽高、位置、背景色等样式信息
  • 宽高和位置是通过Layout(重排)计算出
  • Render Tree和DOM Tree不完全对应
  • display:none的元素不在Render Tree中
  • visibility:hidden的元素在Render Tree中
  • float元素、absolute元素、fixed元素会发生位置偏移
  • 常说的脱离文档流,就是脱离Render Tree

重排(Layout)/回流(reflow)

  • 当修改元素的位置、大小时,引起浏览器的重排
  • 对一个元素的重排,可能影响到其父级元素(如,子元素的大小改变,父元素的大小可能也改变)

如何避免重排:

  • 用transform做形变和位移
  • 通过绝对定位,脱离当前层叠上下文(即形成新的Render Layer)

DOMContentLoaded事件在什么时候触发

DOMContentLoaded事件不直接等待CSS文件、图片的加载完成。
DOMContentLoaded事件需要等待每个静态的script标签中的JS执行完才触发。
JS的执行,需要等待位于它前面的CSS加载(如果是外联的话)、执行完成,因为JS可能会依赖位于它前面的CSS计算出来的样式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值