问题 1. 如果我创建了一个 html 页面,其中只有一个字符串,而没有在其中编写任何 html 标记(没有正文、没有 html、没有 doctype),那么为什么浏览器仍然呈现它并将字符串显示为一个段落?
对此,我使用了我的最佳猜测,即浏览器仍然设法将其显示为一个段落,因为这是它的最佳猜测,并且它通过假设这是作者想要的并因此“放置”这些标签来弥补缺失的标签,即使我们从未手动编写过它。
由于在这两种情况下都没有使用 ,因此在 Initial Insertion Mode<!DOCTYPE ...>
的最后一步中找不到它,因此整个文档都以Quirks Mode呈现。
虽然浏览器(至少 Firefox 和 Chrome)不会将其解析为段落,但默认情况下,它们会 呈现与Quirks 模式中的段落相同的简单字符串。这是因为“当 Document 处于 quirks 模式时,body 元素顶部或底部的 HTML 元素的垂直边距预计会折叠为零”(来源,更多关于折叠边距margin-top
) ,所以有效body
消耗margin-top
. p
由于简单字符串没有边距,因此没有任何反应。最终结果是文本段落和文本本身都显示相同。
这就是您的浏览器处理简单字符串的方式。特别注意DOM View,它显示了文档的最终结构。为了进行比较,请查看段落的外观。虽然它们在渲染中可能看起来相同,但结构并不相同。
现在,为了说明我关于折叠边距的观点,用 a 包裹内容(文本或段落)div
以border
查看未折叠边距。这是您的浏览器处理纯文本的方式,而这也是您的浏览器处理段落的方式。
但是,如果<!DOCTYPE ...>
包含(以防止浏览器进入 Quirks 模式),纯文本文档将不会与带有段落的文档显示相同(元素margin-top
的p
不会折叠到元素的margin-top
中body
)。
问题 2. 在上面的例子中,如果我在 html 的源代码的不同行中写了几个字符串,浏览器仍然将它们显示为单行文本。
同样,我使用了我最好的猜测并得出结论,HTML 是一种自由格式的语言,因此它不会关心源代码中有多少空格或缩进。
HTML 将所有空格(除非white-space
设置为 以外的其他normal
内容)视为单个空格(折叠)。因此,test\n\ntest
相当于test test
。
然而,她似乎并不高兴。我的回答错了吗?如果是,那么他们是完全错误还是部分错误?这些问题的正确答案是什么?
您的结论有些正确,但不能很好地处理边缘情况(例如,如果浏览器更改了p
元素的字体/颜色/等)。