# HTML

在浏览器地址栏键入 URL,按下回车之后会经历什么?

1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;

2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;

3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;

4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;

5. 释放 TCP连接;

6. 浏览器将该 html 文本并显示内容;

async 和 defer 的作用是什么?有什么区别?(浏览器解析过程)

1.
<script src="script.js"></script>
普通的script标签引入js代码时,会阻塞dom和cssom的继续渲染,直到js代码运行完
2.
<script async src="script.js"></script>
async模式下,js文件的加载变成了并行(异步),
3.
<script defer src="script.js"></script>
defer模式下,js文件的加载变成了并行(异步),并将js的
执行结果运行在dom和css渲染之后,DOMContentLoaded事件触发之前

参考文献: 《defer 和 async 的区别》 (opens new window)


浏览器的渲染原理?

 (1)首先解析收到的文档,根据文档定义构建一棵 DOM 树,DOM 树是由 DOM 元素及属性节点组成的。

 (2)然后对 CSS 进行解析,生成 CSSOM 规则树。

 (3)根据 DOM 树和 CSSOM 规则树构建渲染树。渲染树的节点被称为渲染对象,渲染对象是一个包含有颜色和大小等属性的矩形,渲染对象和 DOM 元素相对应,但这种对应关系不是一对一的,不可见的 DOM 元素不会被插入渲染树。还有一些 DOM 元素对应几个可见对象,它们一般是一些具有复杂结构的元素,无法用一个矩形来描述。

 (4)当渲染对象被创建并添加到树中,它们并没有位置和大小,所以当浏览器生成渲染树以后,就会根据渲染树来进行布局(也可以叫做回流)。这一阶段浏览器要做的事情是要弄清楚各个节点在页面中的确切位置和大小。通常这一行为也被称为“自动重排”。

 (5)布局阶段结束后是绘制阶段,遍历渲染树并调用渲染对象的 paint 方法将它们的内容显示在屏幕上,绘制使用 UI 基础组件。

 值得注意的是,这个过程是逐步完成的,为了更好的用户体验,渲染引擎将会尽可能早的将内容呈现到屏幕上,并不会等到所有的
 html 都解析完成之后再去构建和布局 render 树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其
 余内容。

DOMContentLoaded 事件和 Load 事件的区别?

当初始的 HTML 文档被完全加载和解析完成之后

DOMContentLoaded 事件被触发,而无需等待样式表、图像和子框架的加载完成。

Load 事件是当所有资源加载完成后触发的。

参考文献: 《DOMContentLoaded 事件/Load 事件的区别?》 (opens new window)