【问题标题】:Understanding CSS rendering理解 CSS 渲染
【发布时间】:2020-06-01 03:01:54
【问题描述】:

所以我到处都读到 CSS 是 渲染阻塞。尽管这与 <script> 标签引起的阻塞不同,因为它不会暂停 HTML 解析。浏览器基本上等待 CSSOM 被构建,然后只向网页呈现任何内容。因此,当 CSS 加载较晚时,会影响网页的加载时间。但我不明白的是,如果是这种情况,FOUC(无样式内容的Flash)是如何引起的? FOUC 基本上是当浏览器暂时显示没有样式的 HTML 时,然后当 CSS 可用时,它会显示正确样式的页面。所以如果浏览器总是在渲染任何东西之前等待 CSS 被加载和解析,FOUC 就不应该发生。

【问题讨论】:

  • CSSOM 可以在异步请求结束之前构建,甚至可能在同步操作全部执行之前构建(例如在 FireFox 中,this fiddle 将呈现无样式的文档,直到您关闭警报,Chrome 的行为不同这里)

标签: css browser


【解决方案1】:

如果浏览器总是在渲染任何东西之前等待 CSS 被加载和解析,FOUC 应该不会发生。

确实,在这种情况下应该会发生这种情况,只是浏览器在渲染之前不会等待所有资源都加载完毕。

请注意,这与您“到处阅读”的内容并不矛盾,如果您确实阅读过“浏览器基本上会等待 CSSOM 被构建,然后只向网页呈现任何内容。

浏览器可以很好地构建CSSOM,但仍然缺少资源,例如,它绝对不需要加载所有背景图像资源来计算元素的框位置。
实际上,它甚至可能需要在构建 DOM 后立即构建 CSSOM,因为在以下 sn-p 的情况下,您需要 CSSOM 才能使 js 工作:

<h1>test</h1>
<script>
  // without CSSOM, we couldn't get its width yet
  console.log(document.querySelector('h1').offsetWidth);
</script>
<style>
  /* even if it's gonna be invalidated later on */
  h1 { width: 300px; border:1px solid; } 
</style>

【讨论】:

  • 您的回答并没有真正解决我的问题。 “浏览器可以很好地构建 CSSOM,但仍然缺少资源”——我相信这些资源不包括 HTML。丢失图像不会导致 FOUC,但没有关联 CSS 的 HTML 节点会。
  • @maverick FOUC 发生在 external 样式表中,这些样式表是 external 资源,加载不会阻止文档的解析。是的,可以在解析所有 html 之前很好地构建 cssom,就像在我的示例中一样,执行脚本时
猜你喜欢
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 2020-07-12
  • 2018-04-24
  • 2010-11-30
  • 2013-05-02
相关资源
最近更新 更多