5

标记省略的 HTML5 规范 ( http://www.w3.org/TR/html51/syntax.html#syntax-tag-omission ) 以以下两个语句开头(强调我的):

  • 如果 html 元素中的第一件事 不是注释,则可以省略 html 元素的开始标记。
  • 如果 html 元素后面没有 紧跟注释,则可以省略 html 元素的结束标记。

那些声明读起来类似,但不一样,我想知道是否有人可以澄清它们的含义。

以下情况似乎很明确 - 您无法删除开始或结束标签:

<html><!-- start --> ... </html><!-- end -->

但是当空白被引入混合时呢?html在以下情况下可以消除开始标记吗?

<html>
   <!-- comment after whitespace -->
   ...

在类似的情况下可以消除结束标签吗?

   ...
</html>
<!-- comment after whitespace -->

其他一些规则特别提到了空白字符,这让我相信应该考虑它们。大多数规则都说“……紧跟……”,这与列出的第一个要点不同。

4

3 回答 3

2

在 html 中,标签之间的空格无关紧要。<html> <head><html><head>浏览器一样。在内容中(例如,span/p 标签内的单词之间)它由浏览器呈现,但是当您想在元素之间使用空间(作为设计资源)时,您应该使用  。

因此,正如我所看到的,紧随其后的并不是“下一个字符”,而是“结束标签应该在的位置之后的第一件事,无论它们之间有多少空格。

</html>然后,在这两种情况下删除 html 标记都会使 html 无效,因为无论该位置与评论之间有多少空格。

编辑:我认为他们试图用另一个词来表达同样的事情,避免重复,但最终被混淆了;

于 2013-02-20T21:50:21.683 回答
2

这里的重要因素是短语first thing inside紧随其后的是谈论节点,即 DOM,而不是标签或其他标记,所以它所做的区分是关于节点是子节点(里面的第一件事)还是后续节点兄弟姐妹(紧随其后)。

就空间而言:

如果 html 元素中的第一件事不是注释,则可以省略 html 元素的开始标记。

html 元素中的第一件事不能是空格字符,因为在解析器算法中,空格字符标记被丢弃并且不会添加到 DOM 中。

如果 html 元素后面没有紧跟注释,则可以省略 html 元素的结束标记。

空格字符,无论它们出现在</html>标签之前还是之后,最终都会出现在 html 元素内(实际上也是在 body 元素内),因此无论是否有空格,注释都将紧跟在 html 元素之后在标记之间。

于 2013-02-20T21:54:03.713 回答
1

关于标记省略的规则有些误导,因为在大多数情况下,它们实际上并没有说明何时可以省略标记,而是在省略标记时应该如何解释它们。以以下文档为例:

<!DOCTYPE html><!-- A comment --><title>A title</title>

这是一个有效的 HTML5:您可以自己通过W3C 验证器运行它。但是标签省略规则明确指出

如果元素内的第一件事不是注释html,则可以省略[a]n元素的开始标记。html

我们如何调和这一点?答案是这些是消歧规则。因为如果html元素内的第一件事是注释,则元素的开始标签可能不会被省略,所以我们在解析时可以自由地假设注释不是html元素内的第一件事。同样,标签省略规则规定

body如果元素为空,或者元素内的第一件事body不是空格字符或注释 [... ]

所以我们可以自由地假设注释也不body是元素内部的第一件事。所以实际上这个文档可以明确地解析为等价于

<!DOCTYPE html><!-- A comment --><html><head><title>A title</title></head><body></body></html>

HTML5 的解析器算法指定如果我们处于before html插入模式,这是解析器在看到之后转换到的状态<!DOCTYPE html>,我们看到

一个字符标记,它是 U+0009 CHARACTER TABULATION、"LF" (U+000A)、"FF" (U+000C)、"CR" (U+000D) 或 U+0020 SPACE 之一

那么我们要“忽略令牌”。另一方面,如果我们看到一个评论标记,那么我们将

插入注释作为 Document 对象的最后一个子对象。

直到我们看到其他类型的标签,我们才会发出一个html元素。所以我们应该期望这种行为不会受到空格的影响,实际上 Firefox 54 和 Chrome 60 都会解释文档

<!DOCTYPE html>
         <!-- A comment -->
    <title>A title</title>

等同于

<!DOCTYPE html><!-- A comment --><title>A title</title>

也就是说,他们都被视为

<!DOCTYPE html><!-- A comment --><html><head><title>A title</title></head><body></body></html>
于 2017-08-01T21:21:09.067 回答