css - 浏览器何时以及如何在 <body> 中呈现 &lt;style&gt; 标签?

标签 css html

我注意到如果我放置 <style>里面<body> css 将应用于 <style> 之后和之前的所有元素标签。

所以在我看来,css 是在页面加载时处理的,类似于 javascript 文档就绪事件的行为。我对吗?如果是这种情况,顺序将是多个 <style>标记被处理?

最佳答案

长话短说:

简而言之,您的问题的答案是:一次 <style><body> 内遇到标签一切都停止了,CSSOM 正在重建并重新应用于所有现有的渲染(绘制)内容。

配售<style>里面的标签 <body>被认为是不好的做法,因为它可以创建 FOUC .但是如果你的 <style>标签只包含在 DOM 中放置在它后面的元素的规则,将它放在 body 中是完全没问题的,因为不会发生 FOUC。


页面的渲染过程是相当复杂的。但是,过于简单化了,这就是发生的事情

  1. <head>被读取并构建 CSSOM。除非使用 @media 明确指定,否则所有 CSS 都是渲染阻塞的查询。非阻塞 CSS 仍然被加载,它没有被完全跳过。
  2. DOM 构建和 CSSOM 构建并行运行,但所有 <script>执行被推迟到 CSSOM 构建完成(在 </head> 标签上),此时所有加载 <script> s 运行,阻止 DOM 构建。 JS此时可以对CSSOM进行修改。 *
  3. 配售<style>里面的标签 <body>中断一切(JS 执行和 DOM 构建),CSSOM 正在更新并应用于已呈现的内容(如果有)。之后一切恢复。

* 进一步测试显示<head>解析是单线程的。 CSSOM 构建确实会阻止 javascript 执行,但它是分阶段完成的,因为每个 <link /><style>满足标签(在 <script> 之后放置的 <link> 只会在 <link /> 被解析并应用于 CSSOM 后执行)。 <script>放置在 CSS 资源之间的标签不会延迟到 <head> 中的所有 CSS 资源。被解析了,正如我最初想的那样。
而且,当然 js可以在运行时更改 CSSOM。参见 this question我问了更多关于如何 js执行被 CSSOM 构建阻止。


以上都是正常加载,不考虑async ,这给它增加了一个全新的复杂层。

如果您对更多详细信息感兴趣,我建议您浏览 Performance Web Fundamentals 章节,由 Google 提供。

关于css - 浏览器何时以及如何在 <body> 中呈现 &lt;style&gt; 标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44371227/

相关文章:

html - 如果浏览器的元素检查器说元素的宽度是 300px,我能确定它在所有浏览器中都是一样的吗?

jquery - 给元素线性渐变的度数添加动画

html - 如何设置不同大小的图像以占据它们之间的所有空间

css - 如何禁用主题

javascript - 动画性能 jQuery、css transition ?我怎样才能在这里有更好的表现?

html - 响应图像调整大小

javascript - AureliaJS 中 ul 项目的 click.delegate

javascript - 如何在用户向下滚动页面 150px 后将图像显示为菜单项?

javascript - 复制应用于元素的 CSS 样式

javascript - 修改基本的 JavaScript ScrollTop 函数