当浏览器拿到一个网页是如何进行渲染的呢? HTML解析器输出的树是由DOM元素和属性节点组成的,它是HTML文档的对象化描述,也是HTML元素与外界(如Javascript)的接口。DOM与标签有着几乎一一对应的关系。 可以看到DOM树的构建过程为:将字节转换成字符,确定tokens,将tokens转换成节点,然后构建 DOM 树。 在浏览器构建这个简单页面的 DOM 过程中,在文档的 head 中遇到了一个 link 标记,该标记引用一个外部 CSS 样式表:style.css。由于预见到需要利用该资源来渲染页面,它会立即发出对该资源的请求。并进行CSSDOM树的构建。 CSSOM 为何具有树结构?为页面上的任何对象计算最后一组样式时,浏览器都会先从适用于该节点的最通用规则开始(例如,如果该节点是 body 元素的子项,则应用所有 body 样式),然后通过应用更具体的规则(即规则“向下级联”)以递归方式优化计算的样式。 以上面的 CSSOM 树为例进行更具体的阐述。span 标记内包含的任何置于 body 元素内的文本都将具有 16 像素字号,并且颜色为红色 — font-size 指令从 body 向下级联至 span。不过,如果某个 span 标记是某个段落 (p) 标记的子项,则其内容将不会显示。 >
那么当资源中还有js时会发生什么?答案是阻塞DOM树的构建! 提到首绘这里来提两个概念:DOMContentLoaded和load
页面的首次绘制是在渲染树解析构建完毕之后。因此所需的关键资源是构建DOM树和CSSDOM的html和css。但是当执行js时会阻塞html的解析也就推迟了页面的首绘时间。该如何解决这个问题呢? script async src='siteScript.js' onload='myInit()'>script> script defer src='siteScript.js' onload='myInit()'>script>
以上两种方式都可以实现js的异步加载。那么两者之间有什么区别呢?
由于async脚本执行顺序的不确定性因此不能用来加载具有明显依赖关系的js会造成乱序。 DOM树表示页面结构,渲染树表示DOM节点如何显示。DOM树中的每一个需要显示的节点在渲染树种至少存在一个对应的节点(隐藏的DOM元素disply值为none 在渲染树中没有对应的节点)。渲染树中的节点被称为“帧”或“盒”,符合CSS模型的定义,理解页面元素为一个具有填充,边距,边框和位置的盒子。一旦DOM和渲染树构建完成,浏览器就开始显示(绘制)页面元素。 那么什么是重排和重绘呢 并不是所有的DOM变化都会影响几何属性,比如改变一个元素的背景色并不会影响元素的宽和高,这种情况下只会发生重绘。
|
|
来自: 昵称43682464 > 《编程》