我正在做一个任务,我需要用一些内容更正给定的 HTML 文件并写下这个更正的原因。
还有一些我知道必须更正的代码行,但是我找不到任何官方文档来明确说明这种嵌套是错误的。
<p class = "par">
<div>...</div>
</p>
所以我的问题是我在哪里可以找到官方规范或其他文件中的官方声明,明确说明?
我找到了一些文章,清楚地提到了这一点,但我需要更多的东西“官方”。我最多能找到的是:
text/html中的标签遗漏: 如果 p 元素紧跟地址、article、aside、blockquote、details、div、dl、fieldset、figcaption、figure、footer、form、h1、h2、h3、h4、h5,则可以省略 p 元素的结束标记, h6, header, hgroup, hr, main, menu, nav, ol, p, pre, search, section, table, 或 ul 元素,或者如果父元素中没有更多内容且父元素是 HTML 元素不是 a、audio、del、ins、map、noscript 或 video 元素,也不是自主自定义元素。
如您所见,它没有明确说明不允许
<div>
嵌套在 <p>
中。
p
的内容模型不允许div
p
元素Content model是“Phrasing content”。
“短语内容” 是定义的一组元素,not 包括
div
.
<p><div></div></p>
实际上没有“工作”另一个揭示此类 HTML 代码缺陷的有力论点可能是指出它有效地产生了什么,而且它很可能不是任何作者真正想要的:
生成的 DOM 结构 not 生成嵌套在段落内的
div
,但它生成段落后跟 div,然后是第二个空段落。
各种证明:Hixie 的 DOM 查看器
Ian Hickson 的“Live DOM Viewer” 极简文档
<!doctype html><body><p class="par"><div></div></p>
显示结果结构如下:
body 元素有三个直接子元素:带有类“par”的段落、div 和没有类的第二段。
验证者
W3C 标记验证器 以查找错误。在这种情况下,它会指出“流浪”结束标签:
本地演示
document.write(document.getElementsByTagName('p').length)
body,
p,
div {
margin: .1em;
padding: .2em;
background: #0005;
}
p {
border: outset;
}
div {
border: double;
}
p:empty {
border: dotted;
}
html {
background: darkslategrey;
color: snow;
}
code {
font-family: monospace, monospace;
background: black;
}
Expecting <code>body</code>: true.
<p>
Expecting <code>body > p</code>: true.
<div>
Expecting <code>body > p > div</code>: false,
actually <code>body > div</code>.
</div>
Expecting <code>body > p</code>: false,
actually <code>body</code>.
Empty paragraph follows:
</p>
Expecting <code>body</code>: true.
<hr>
Total paragraphs count:
为什么
“解析HTML文档”中指定了这两条规则:
1。粗略解释:p
.
一个开始标签,其标签名称是以下之一:[...]“div”[...]如果打开元素的堆栈在按钮范围内有一个
p
元素,则关闭一个p
元素。为令牌插入一个 HTML 元素。
2。松散地解释:
</p>
在 HTML 中总是产生没有属性的空段落。
标签名称为“p”的结束标签如果打开元素的堆栈在按钮范围内没有 p 元素,那么这是一个解析错误;为没有属性的“p”开始标记插入一个 HTML 元素。
关闭 p 元素。
body {
counter-reset: x;
}
p:empty::before {
content: counter(x) '. empty paragraph';
counter-increment: x;
}
</p>
</p>
</p>
</p>
这两个规则都可以在
“关闭 p
元素”指令的反向引用中找到。