浏览器输入一个URL到页面显示的过程

98 阅读2分钟
  • 首先通过DNS服务器进行域名解析
  • 解析出对应的IP地址,然后从ip地址对应的主机发送http请求,获取对应的静态资源
  • 默认情况服务器会放回index.html文件
  • 然后浏览器内核开始解析HTML
  • 首先 会解析对应的html 生成DOM Tree
  • 解析过程中,如果遇到css的link标签 则会下载对应的css文件
    • 下载css文件和DOM树同时进行
  • 下载完对应的css文件后会进行css解析 生成cssom(css object model)
  • 当DOM Tree 和 CSSTree 都解析完成之后,会进行合并来生成Render Tree(渲染树)
  • 初步生成的渲染树会显示节点以及部分样式 但是并不表示每个节点的尺寸 位置信息 于是进行Layout(布局)来生成渲染树中节点的宽度 高度位置信息
  • 经过Layout之后 浏览器内核将布局时的每个frame转屏幕上的每个像素点 将每个节点绘制到屏幕上
    注意:第一次确定节点的大小位置 称之为布局(Layout)之后对节点大小位置改变后重新计算称之为回流
    -引起回流的情况:
    • DOM结构发生改变(节点的增删)
    • 修改了节点的布局(高度 宽度 字体大小等)
    • 修改窗口的尺寸
    • 调用getComputedStyle获取位置信息
      第一次绘制节点 渲染到页面上称之为绘制(paint)之后重新绘制 称之为重绘
      引起重绘情况:
    • 修改背景色颜色 等
      回流一定会引起重绘 所以回流非常消耗性能
  • 如何避免回流
    • 尽量一次性的修改样式
      • 通过添加classList
    • 避免频繁的操作DOM
    • 避免通过getComputedStyle 获取尺寸位置信息等
    • 对于某些元素使用position:absolute/fixe
      • 开销较小 不会对其他元素造成影响