web性能优化基础篇之页面渲染原理

564 阅读2分钟

这是我参与11月更文挑战的第10天,活动详情查看:2021最后一次更文挑战

在 HTML 解析过程中,我们会得到 DOM 树和 CSS 树,由 DOM 树和 CSS 树合成渲染树,然后进行布局、绘制,最后经过合成,才可以将代码展示成页面。

文档对象模型(DOM)

一段 html 代码:

<html>
  <head>
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <link href="style.css" rel="stylesheet">
    <title>Test</title>
  </head>
  <body>
    <p>Hello <span>World</span></p>
    <div><img src="awesome-photo.jpg"></div>
  </body>
</html>

根据这段代码可以生成 DOM 树。如图所示:

image.png

css 对象模型(CSSOM)

一段 css 代码:

body { font-size: 16px }
p { font-weight: bold }
span { color: red }
p span { display: none }
img { float: right }

根据这段代码可以生成 CSSOM。如图所示:

image.png

渲染树

根据上述的 DOM 和 CSSOM 可以生成渲染树:

image.png

重绘与回流

重绘 repaint

当盒子的位置、大小以及其他属性,例如颜色、字体大小等都确定下来之后,浏览器便把这些原色都按照各自的特性绘制一遍,将内容呈现在页面上。

重绘是指一个元素外观的改变所触发的浏览器行为,浏览器会根据元素的新属性重新绘制,使元素呈现新的外观。

触发重绘的属性

颜色背景外边框
colorbackgroundoutline-color
border-stylebackground-imageoutline
border-radiusbackground-positionoutline-style
visibilitybackground-repeatoutline-width
text-decorationbackground-sizebox-shadow

重排 reflow

当渲染树中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建,这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候。

触发重排的属性

盒子模型相关属性定位属性及浮动改变节点内部文字结构
widthtoptext-align
heightbottomoverflow-y
paddingleftfont-weight
marginrightoverflow
displaypositionfont-family
border-widthfloatline-height
borderclearvertival-align
min-heightwhite-space
  1. "重绘"不一定需要"重排",比如改变某个网页元素的颜色,就只会触发"重绘",不会触发"重排",因为布局没有改变。
  2. 但是,"重排"必然导致"重绘",比如改变一个网页元素的位置,就会同时触发"重排"和"重绘",因为布局改变了。

常见的触发重排的操作

  1. 当你增加、删除、修改 DOM 结点时,会导致 Reflow , Repaint。
  2. 当你移动 DOM 的位置
  3. 当你修改 CSS 样式的时候。
  4. 当你 Resize 窗口的时候(移动端没有这个问题,因为移动端的缩放没有影响布局视口)
  5. 当你修改网页的默认字体时。
  6. 获取某些属性时(width,height...)

注:display:none 会触发 reflow,而 visibility:hidden 只会触发 repaint,因为没有发生位置变化。

最后说一句

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下,您的支持是我坚持写作最大的动力,多谢支持。