1

今天有人试图通过挑战我对 HTML 的一般知识来骚扰和贬低我,因为我才刚开始学习它,所以我从未声称拥有这些知识。她问了我以下两个问题:

问题 1. 如果我创建了一个 html 页面,其中只有一个字符串,而没有在其中编写任何 html 标记(没有正文、没有 html、没有 doctype),那么为什么浏览器仍然呈现它并将字符串显示为一个段落?

对此,我使用了我的最佳猜测,即浏览器仍然设法将其显示为一个段落,因为这是它的最佳猜测,并且它通过假设这是作者想要的并因此“放置”这些标签来弥补缺失的标签,即使我们从未手动编写过它。

问题 2. 在上面的例子中,如果我在 html 的源代码中在不同的行中写了几个字符串,浏览器仍然将它们显示为单行文本。

同样,我使用了我最好的猜测并得出结论,HTML 是一种自由格式的语言,因此它不会关心源代码中有多少空格或缩进。

然而,她似乎并不高兴。我的回答错了吗?如果是,那么他们是完全错误还是部分错误?这些问题的正确答案是什么?

感谢您阅读并耐心等待描述。

4

3 回答 3

4

问题 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 包裹内容(文本或段落)divborder查看未折叠边距。这是您的浏览器处理纯文本的方式,而这也是您的浏览器处理段落的方式

但是,如果<!DOCTYPE ...>包含(以防止浏览器进入 Quirks 模式),纯文本文档不会与带有段落的文档显示相同(元素margin-topp不会折叠到元素的margin-topbody)。

问题 2. 在上面的例子中,如果我在 html 的源代码的不同行中写了几个字符串,浏览器仍然将它们显示为单行文本。

同样,我使用了我最好的猜测并得出结论,HTML 是一种自由格式的语言,因此它不会关心源代码中有多少空格或缩进。

HTML 将所有空格(除非white-space设置为 以外的其他normal内容)视为单个空格(折叠)。因此,test\n\ntest相当于test test

然而,她似乎并不高兴。我的回答错了吗?如果是,那么他们是完全错误还是部分错误?这些问题的正确答案是什么?

您的结论有些正确,但不能很好地处理边缘情况(例如,如果浏览器更改了p元素的字体/颜色/等)。

于 2012-07-02T17:51:56.850 回答
1

HTML 和 BODY 标签是可选的,参见http://www.w3.org/TR/REC-html40/struct/global.html#h-7.3

将它们从文档中删除会被视为 text/html 类型,这会导致空白区域折叠成一个空白;这就是为什么源代码中不同行中的单词会在一行后面呈现的原因。

于 2012-07-02T17:55:44.347 回答
0

Q1:

我不认为浏览器会将单个字符串显示为段落。正如您所说,这样做的原因是,单独行上的任何后续字符串都呈现在同一块中。您可以使用 chrome 网络检查器 (CTRL+SHIFT+I) 进行检查。任何不是标签或脚本/样式表(或文档类型)的东西都会被浏览器显示出来。

Q2:

HTML 对换行不敏感。

如果您仍然不满意,请查看规范:http: //developers.whatwg.org/

于 2012-07-02T17:51:34.437 回答