渲染流程

- 浏览器获取到 HTML 资源后开始解析 HTML (DOM tree)
- 解析到 CSS 后根据 CSS 生成 CSS 规则树 (style rules)
- 在 DOM 树和 CSS 规则树都生成完后,通过 DOM 树和 CSS 规则树生成渲染树 (render tree)
- DOM 构建完成后触发
DOMContentLoaded(jQuery 的 $(document).ready() 即对该原生事件的封装)
- 整个页面加载完毕(包括图片等),触发
onload 事件
- 渲染树构建完成后,浏览器开始计算元素的大小和位置 (layout)
- 根据计算好的节点信息将内容绘制到屏幕上 (painting)
- DOM 树和 CSS 规则树(按先后顺序)
- 浏览器获取的 HTML 资源后自上而下开始解析,生成 DOM 树
- 如果遇到 style 的内联样式和 link 会将 CSS 交由 CSS 渲染器构建 CSS 规则树;其中加载 link 引入的外部样式文件是异步加载的,并且整个 CSS 规则树也是与 DOM 树的构建是并行的
- JavaScript 脚本的加载
- 由于 JS 可以操作 DOM,所以在 HTML 解析到 JavaScript 脚本时会停止对 DOM 的解析;而 CSS 的解析会阻塞 JS 的执行,所以在某些情况下 CSS 的解析会通过阻塞 JS 的执行而间接阻塞 DOM 的解析;
defer:defer 脚本会在 DOM 解析完成后,DOMContentLoaded 事件调用前执行,而且 defer 属性的 JS 脚本会按照顺序执行
async:JS 在下载完成后立即执行;脚本按照加载完成的顺序执行,可能会打乱脚本之间的执行顺序
- 渲染树 (render tree) 的构建过程
- 从 DOM 树的根节点开始遍历每一个可见的节点;而不可见、不参与渲染的节点会被跳过,不纳入渲染树,例如引用 CSS 文件的 link 标签、引入 JS 文件的 script 标签和 CSS 属性设置了
display: none; 的节点
- 从 CSS 规则树 (style rules) 中找到对应的节点,然后根据节点信息和样式组合成渲染树 (render tree)
- 相关私有笔记