我是否需要始终在HTML5中指定开始标记?

时间:2017-09-05 14:34:57

标签: html html5

第一种形式: -

<!DOCTYPE html>
 <head>
     <title>Untitled</title>
     <meta charset="UTF-8"/>
     <link rel="stylesheet" href="" type="text/css"/>
 </head>
     <body>

     </body>
 </html>

第二种形式: -

<!DOCTYPE html>
 <html>
 <head>
     <title>Untitled</title>
     <meta charset="UTF-8"/>
     <link rel="stylesheet" href="" type="text/css"/>
 </head>
     <body>

     </body>
 </html>

据我所知,在<!DOCTYPE html>标记之前必须包含<html>(如果使用HTML5),否则我的网站可能会遇到行为问题。 (我被告知here

在第一个中,没有</html>标记的开头,但我已将其包含在第二个标记中。

我注意到有些网站使用其中一种肤色。可能是<html>或非<html>!即使是HTML编辑器Android应用程序(WebMaster)也使用第一个(没有<html>)!

我无法理解,<!DOCTYPE html><html>完全相同,只是附加!DOCTYPE,或两者都不同!

那么,哪一个是正确的?为什么那个是正确的?

5 个答案:

答案 0 :(得分:2)

Doctype是强制性的,与HTML开始标记完全不同。

(Doctype中包含extension SCNNode { func boundingBoxContains(point: SCNVector3, in node: SCNNode) -> Bool { let localPoint = self.convertPosition(point, from: node) return boundingBoxContains(point: localPoint) } func boundingBoxContains(point: SCNVector3) -> Bool { return BoundingBox(self.boundingBox).contains(point) } } struct BoundingBox { let min: SCNVector3 let max: SCNVector3 init(_ boundTuple: (min: SCNVector3, max: SCNVector3)) { min = boundTuple.min max = boundTuple.max } func contains(_ point: SCNVector3) -> Bool { let contains = min.x <= point.x && min.y <= point.y && min.z <= point.z && max.x > point.x && max.y > point.y && max.z > point.z return contains } } ,因为XML和SGML文档类型必须指定根元素的标记名称,HTML 5 Doctype旨在向后兼容预期的文件夹。

HTML,HEAD和BODY元素的开始和结束标记是可选的。

对于每个HTML版本都是如此(但不适用于不允许省略任何标记的XHTML)。

答案 1 :(得分:1)

从技术上讲,在HTML5中,只有!DOCTYPEtitle标记是必需的。所有其他标签都是可选的,仅用于开发人员的便利性和可读性。

更多信息,请参阅Google的HTML样式指南。 CSS:https://google.github.io/styleguide/htmlcssguide.html#Optional_Tags

答案 2 :(得分:0)

要详细说明Quentin和Maciek的答案,<!DOCTYPE html>将HTML文件或流声明为具有html文档类型和SGML解析器的顶级元素。 SGML(标准通用标记语言)是HTML,XML和其他标记语言的概括和起源。 HTML5及更高版本不再引用SGML标准(ISO 8879)来描述HTML的有效性和解析规则。然而,HTML文档实际上是SGML文档,可以使用SGML完全解析,包括W3C HTML5,W3C HTML5.1,WHATWG HTML和所有其他版本的HTML。

SGML标准还定义了标记遗漏的规则,或者更确切地描述了推断HTML文档中实际不存在的标记的规则,并将文档视为它们。 SGML仅仅是用于描述HTML等具体标记语言的语言框架,标记遗漏的规则必须告诉SGML,因为SGML没有关于HTML的内置硬编码知识。这是一种告诉SGML文档中可以省略html开始和结束元素的方法(注意,Web浏览器直接支持其他SGML声明语法):

<!DOCTYPE html [
    <!ELEMENT html O O (head,body?)>
    <!-- other declarations for
         the head and body element
         following here ... -->
]>

html元素的此声明具有O O O 任务的双字母O),其间有空格)标记省略指示符告诉SGML启动和可以分别省略端元素标签。如果使用-连字符代替O作为开始或结束标记省略指示符,或两者都使用,则需要相应的标记。

还有其他HTML元素允许在各种HTML5规范中声明标记推断。我已经在我的项目页面(2)创建了这些和其他语法规则的转录到现代HTML的SGML中。

例如,在html元素的上述声明中,(head,body?)部分声明html的子内容必须是head元素,后跟可选的body元素。由于这些也被声明为可选的(虽然由于空间原因不在上面的代码段中),结合title的进一步声明,一个完整有效的HTML文档可能看起来像这样

<!DOCTYPE html>
<title>Hello</title>
<p>Body Text

如何使用SGML解析这个问题在我的链接项目页面(3)以及我给出的幻灯片/谈话中进行了描述(1)。

答案 3 :(得分:-2)

您只需要第一行TAG和TITLE标记。从技术上讲,页面标记和页面上的其他所有内容都是可选的

答案 4 :(得分:-4)

<!DOCTYPE>声明必须是HTML文档中标记之前的第一件事。

<!DOCTYPE>声明不是HTML标记;它是Web浏览器关于页面编写的HTML版本的指令。

e.g。

HTML 5 <!DOCTYPE html>告诉浏览器这是一个html文档,因此将其渲染出来。

但是在HTML 4中,它是这样完成的:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

通常......呈现。这绝对不是必需的,而是一种很好的做法,因为我们并不总是使用普通的HTML。有了其他Web编程语言的知识,您将看到在一个文件中使用多种语言。所以它对此很有用。

还有很多其他原因,但我不会在这里解释。