我一直在研究浏览器渲染,现在我刚刚谈到渲染过程中浏览器从原始CSS构造CSSOM的部分。
在我看到的所有教程中,作者似乎都假设/断言body
元素是根,并且应用于主体的所有样式都将默认应用于 DOM 的其余部分,除非被另一个选择器显式覆盖。这方面的一个例子在这里 https://blog.logrocket.com/how-css-works-parsing-painting-css-in-the-critical-rendering-path-b3ee290762d3/
这里 https://developers.google.com/web/fundamentals/performance/critical-rendering-path/constructing-the-object-model
在这两种解释中 -body
标签被假定为根,即使html
标签看起来应该是根。更重要的是,HTML 规范似乎不需要标记中的任何一个(也许我误解了这一点(。
对我来说,在将样式应用于渲染树中的元素时,这似乎是一条非常重要的信息。如果一个人不知道哪个元素是根,那么一个人就不知道样式应该如何级联到另一个元素上。
所以我的问题本质上是,浏览器是否总是假设 body 元素是根,或者有没有一种方法来确定哪个元素应该是浏览器 CSS 树中的根?
这里有几个问题你混为一谈,所以很难把这个问题作为一个重复的问题关闭,即使你自己提出的每个问题之前都已经被问过,并且回答过。所以我希望这有帮助!
如何确定CSSOM(CSS对象模型(的根元素
根只是文档的根元素,或者html
,不要对此产生误解。
作者似乎假设 body 元素是根 (..(这方面的一个例子在这里 https://blog.logrocket.com/how-css-works-parsing-painting-css-in-the-critical-rendering-path-b3ee290762d3/
嗯,没有。该页面上的示例使用"root"作为它正在谈论的特定子树的顶部,恰好<body>
在那里,但这是一个巧合;这个例子很可能是一个表,然后<table>
将是"根"。
更重要的是,HTML 规范似乎不需要标记中的任何一个(也许我误解了这一点(。
<html>
和<body>
的开始标记都是可选的,所以是的,可以从 HTML 文档中省略它们。<head>
也一样。但元素本身仍然存在!所有内容都在html
元素内,无论是否开始标记。您可以通过加载HTML文档来自己测试这一点,例如
<title>title</title>
<div>Hello world</div>
进入浏览器并检查它,您将看到div 现在包含在body
元素中,而标题位于head
元素中。这是没有办法的。
现在令人困惑的部分是,应用于body
的一些(但不是全部(CSS样式被浏览器应用于html
。 例如background-color
;如果将其分配给正文,则整个浏览器窗口将变为彩色,而不仅仅是正文区域。
这是很久以前遗留下来的行为,当时html
元素不被认为是绘图画布;它不可样式化,只有主体具有样式属性(BGCOLOR,TEXT,LINK等(。尽管情况不再如此,但出于兼容性目的,浏览器的行为仍然像以前一样。