【问题标题】:Why do we need a <html> tag if we have <!DOCTYPE html>?如果我们有 <!DOCTYPE html>,为什么还需要一个 <html> 标签?
【发布时间】:2020-05-14 13:05:30
【问题描述】:

如果我们已经使用&lt;!DOCTYPE html&gt;标签定义了这个文档是html,为什么还要加上&lt;html&gt;标签呢?

是否可以添加任何其他标签来代替?

如果没有,我们为什么需要它?

【问题讨论】:

  • 一个简单的谷歌搜索回答了这个问题——文档类型是一个声明而不是一个元素标签。它只是通知浏览器有关页面以及如何呈现它 - 特别是它是一个 html5 配置的文档。 - “即使它被尖括号包裹,它也不是一个标签而是一个声明。”。
  • @gavgrif 谢谢,但我的问题是如果我们已经声明了你的文档类型,为什么我们需要一个 HTML 标签?如果我声明这是一个 HTML 文档,那为什么我不能只添加 head 和 body 标签呢?

标签: html frontend


【解决方案1】:

在语义层面...

&lt;!DOCTYPE html&gt;&lt;html&gt;,尽管都包含 &lt; angle brackets &gt;,但本质上是不同的东西:

  • &lt;!DOCTYPE html&gt; 声明文档类型并且解析为任何 DOM 元素。引用MDN's Doctype article,“其唯一目的是防止浏览器在呈现文档时切换到所谓的"quirks mode"”。
  • &lt;html&gt; 但是,确实解析为 DOM 元素。您可以为其附加属性或使用 JavaScript 对其进行操作。例如,尝试将其粘贴到浏览器控制台中:document.querySelector('html').style.opacity = '0.5'。您可以使用&lt;html&gt; 做到这一点,但不能使用DOCTYPE

在规范层面...

为什么要有任何标准?标准是必要的,以便实现者(例如浏览器供应商)知道他们需要构建什么,并且开发人员知道他们正在开发的对象是什么。如果没有通用标准,就不可能构建可互操作的软件。

您当然可以质疑为什么标准的逻辑设置方式,而答案几乎以“因为历史”(有时是“因为政治”)而告终。如果现在改变这些历史决定,就会破坏网络。

在标记级别...

It's best practice to always set a lang attribute on the HTML element,出于可访问性和 SEO 原因,您需要包含它才能做到这一点:

始终在 html 标记上使用语言属性来声明页面中文本的默认语言。

在编写代码或标记以明确表达您的意图以帮助其他人阅读您的作品时,这也是一种普遍的最佳做法。仅出于这个原因,添加一个环绕的 HTML 标记会更清晰。

在 DOM 层面...

如果你在 HTML 元素上包含任何属性,那么你写的内容实际上并不重要,因为HTML is quite forgiving)(感谢@Run_Script关联)。无论如何,它都会被解析到相关的 DOM 节点,所以document.body.parentElement instanceof HTMLHtmlElement 将永远是true

不过,出于上述原因,我还是建议您始终包含它。

【讨论】:

  • 感谢您如此详细的回答!那么很快答案就是“因为历史”,但是为什么创作者不会在 html 语法规则中改变它呢?在我看来,DOCTYPE 和 HTML 通常在做同样的事情,将文档内容声明/标记为 html。那么为什么要有 2 个标签/声明而不是一个呢?也许在Doctype声明中指定所需的属性会更合乎逻辑,所以不需要添加html标签?
  • @Rumata 我已经修改了我的答案来回答这些问题。你可以在这里看到差异:stackoverflow.com/posts/61798724/revisions
【解决方案2】:

!DOCTYPE html 标记确保 HTML 或 XHTML 文档在不同的浏览器中以相同的方式解析。该声明是对 Web 浏览器的指示,说明页面是用什么版本的 HTML 编写的。这个标签的存在确保文档作者遵循了 html 标准。从历史上看,Doctype 声明在 HTML 被定义为基于 SGML 的语言时使用,后来又在 XML 中使用。

html 标记 表示 和 之间的所有内容都是符合 doctype 声明所规定的 HTML 类型标准的代码。简单来说,它是一个 html 文档的根。

【讨论】:

    【解决方案3】:

    实际上,在有效的 HTML 文档中根本不需要 html 标记。以下是一个最小的 HTML 文档:

    <!DOCTYPE html SYSTEM "html5.dtd">
    <title>The title</title>
    <p>Some text</p>
    

    那是因为 HTML 是基于 SGML 的,SGML 可以推断省略的标签。在示例中,SGML

    • 推断文档元素(根元素),知道它必须是 html,因为 DOCTYPE 声明是这样说的

    • 推断出head 元素,因为html 的内容模型一开始就需要它

    • 推断&lt;/head&gt; 结束元素标记,因为p 元素不能出现在head 的内容模型中

    • 推断&lt;body&gt; 开始标签元素,因为它需要跟随head 元素

    • 接受段落元素和文本内容,并且

    • 关闭文档末尾的bodyhtml 元素。

    所以这是 SGML 到达的完全标记的文档:

    <html>
      <head>
        <title>The title</title>
      </head>
      <body>
        <p>Some text</p>
      </body>
    </html>
    

    SGML 知道这一点,因为它被赋予了一个html5.dtd 文件,其中包含这些和其他HTML 语法规则。现在 HTML5 不再使用 DTD,而是硬编码了这些规则(实际上,浏览器总是硬编码这些规则),但是 SGML 规则用于标记省略,以及其他规则,例如空元素和属性短 -表单语法仍然适用。如果您想查看(各种版本的)HTML5 的完整 DTD,您可以查看我的网站 sgmljs.net W3C HTML 5.2,并附有全面的说明。

    所以,为了回答您的问题,SGML 的想法是您可以使用许多不同类型的文档,每个文档都有自己的元素词汇表,而不仅仅是 HTML。然而,HTML 成为 SGML 的主要应用程序。此外,过去的浏览器滥用 DOCTYPE 声明来切换其解析和呈现行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 1970-01-01
      • 2011-05-24
      • 2011-05-31
      • 2012-08-06
      • 1970-01-01
      • 2010-11-19
      • 2010-10-05
      相关资源
      最近更新 更多