当包含DIV时,为什么标记P弹出DIV? HTML

当包含DIV时,为什么标记P弹出DIV? HTML,html,css,Html,Css,我有一个奇怪的问题。当我按照下面的HTML编码一个结构时。实际上,用户代理(浏览器)将代码解析为: <p></p><div>123</div> 123 所以,css代码是无效的。你可以在中查看。我想知道这种行为的原因是什么,以及是否有其他类似的标签有这种行为?谢谢。这是HTML两个功能的组合 首先,p元素不允许包含div元素。将其内容模型指定为“短语内容”,其中不包括div元素 其次,p元素的结束标记是可选的。(参见上述规范链接下的标签省略)

我有一个奇怪的问题。当我按照下面的HTML编码一个结构时。实际上,用户代理(浏览器)将代码解析为:

<p></p><div>123</div>

123

所以,css代码是无效的。你可以在中查看。我想知道这种行为的原因是什么,以及是否有其他类似的标签有这种行为?谢谢。

这是HTML两个功能的组合

首先,
p
元素不允许包含
div
元素。将其内容模型指定为“短语内容”,其中不包括
div
元素

其次,
p
元素的结束标记是可选的。(参见上述规范链接下的标签省略)


123


但是如果
a
包含
div
。没关系。我想知道定义标记行为是否有自然原因。这是关于W3C草案的吗?答案中描述的两个特性在HTML有段落和div的情况下一直是正确的,这与草案状态无关。允许锚点包含div元素对于HTML5来说是新的,但是锚点的结束标记从来都不是可选的,因此浏览器以与HTML5规范一致的方式执行错误恢复。问题是您正在构建“标记汤”。因为您将不允许的元素放入
中,所以浏览器猜测您没有将其用作块元素,而是用作段落分隔符-这很有意义,因为在找到新的块级别元素之前,它从未遇到

标记。写有效的HTML,一切都会好起来。@Quentin正确地指出,自上世纪末推出
div
以来,您的源代码一直无效。
p div{
  background:#f00;
}
<p></p><div>123</div>
<p>    <!-- Start P element -->
<div>  <!-- Start DIV element. Implicitly end P element -->
123    <!-- Add text node -->
</div> <!-- End DIV element -->
</p>   <!-- No open P element so this is discarded by the parser -->