我注意到,如果我将css 放在<style>里面<body>,它将应用于<style>标记之后和之前的所有元素。
因此,我认为加载页面时会处理CSS,这与javascript文档就绪事件类似。我对吗?如果是这样的话,将按多个顺序<style>处理多个标签?
TL; DR:
简而言之,您的问题的答案是:一旦<style>在内部满足标签,<body> 所有内容就会停止,并且CSSOM将被重建并重新应用于所有现有的渲染(绘制)内容。
<style>在内部放置标签<body>被认为是不好的做法,因为它可以创建FOUC。但是,如果您的<style>标记仅包含在DOM中放置的元素的规则,则将其放置在主体中就很好了,因为不会发生FOUC。
页面的渲染过程非常复杂。但是,过于简化了,这是发生了什么
<head>被读取并构建CSSOM。除非通过@media查询明确指定,否则所有CSS均为渲染阻止。非阻塞CSS仍在加载中,并未完全跳过。<script>执行都推迟到构建CSSOM时(</head>满足标记要求),然后<script>运行所有已加载的s,从而阻止DOM的构建。JS可以在此时更改CSSOM。<style>在内部放置标签会<body>中断所有内容(JS执行和DOM构建),CSSOM正在更新并应用于已经渲染的内容(如果有)。之后一切恢复。*在进一步测试中,<head>分析似乎是单线程的。CSSOM构建确实阻止了javascript的执行,但是它是在阶段完成的,因为每个阶段都满足<link />和<style>标记(<script>放置在a <link>之后将<link />在解决并应用于CSSOM 之后执行)。就像我最初想的那样<script>,<head>在解析所有CSS资源之前,不会推迟放置在CSS资源之间的标记。
而且,当然js可以在运行时更改CSSOM。看到这个问题,我询问有关jsCSSOM构建如何阻止执行的更多信息。
以上所有内容均适用于常规加载,而无需考虑async,这为其增加了一层全新的复杂性。
如果您对更多详细信息感兴趣,建议阅读Google提供的“网络基础知识” 的“ 性能”一章。