HTML5标准学习 - 文档结构

说起HTML的结构,很多人都能说得头头是道,一般来说答案可能是这样的:

一个DOCTYPE,一个html,里面有head和body元素。

这当然不能说是不正确的,但是如果问到一个最小的HTML源文件必须有哪一些东西的话,恐怕很少有人能正确地做出回答。

先来回答一下这个问题,一个最简的HTML5源码文件需要的内容如下:

<!DOCTYPE html>

是的,就这样,一个字符不多,一个字符不少,除了大小写可任意变化外,其他的任何内容都是不能变动的。

那么究竟是怎么样的规则,导致一个最简的源码文件必须有doctype声明呢?根据标准,一个HTML文档有如下内容组成(严格按照顺序):

  1. 一个BOM标记,且这个BOM标记必须为U+FEFF。
  2. 0-n个空格或注释。
  3. DOCTYPE声明。
  4. 0-n个空格或注释。
  5. 一个HTML元素。
  6. 0-n个空格或注释。

这里存在着一些和HTML4的不同,一个HTML4的最简源码文件是这样的:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                      "http://www.w3.org/TR/html4/loose.dtd">
<title>这里是标题</title>

两者的区别是显而易见的:

  • HTML5把DOCTYPE修改为更简单的<!DOCTYPE html>,这个已经众所周知了。
  • 在HTML4中多了一个<title>标签。

这里的重点就是<title>标签了,关于这个标签,在HTML4.01标准中是这么说的:

Every HTML document must have a TITLE element in the HEAD section.

也即是说,HTML4要求<title>标签是必须存在的。

而在HTML5的标准中,又是这么说的:

There must be no more than one title element per document.

HTML5中只设定了<title>标签数量的上限,却没有指明下限,也就是说,没有<title>的文档已经被视为一个合法的文档了。

对于DOCTYPE,HTML4中设定了6种DOCTYPE,HTML5中将DOCTYPE分为3种,这个在以后的章节中再具体说明。

再回过来看一下文档组成,除去0-n个空格或注释这样并没有多大意义的元素之外,组成的列表中还说明有一个HTML元素,但是最简的源码中却没有这东西。这是因为在HTML的规范中,一直存在“隐式标签”这样的概念,关于隐式标签,大致可以这么解释:

一部分元素,当满足特定的前提条件时,其开始标签或结束标签可以在源码中省略。在这种情况下,被省略的标签称为“隐式标签”。

需要注意的是,此处的省略指的是在源码中省略,而在最终成型的DOM树中,这个标签是存在的,因此才称为隐式标签。因此上面最简的源码结构,在生成DOM树后,其真正的结构是这样的:

<!DOCTYPE html>
<html>
    <head></head>
    <body></body>
</html>

最后,再总结一下XHTML中的一些规范:

  • 因为是XML,所以为了表示这是一个HTML文档,必须有一个命名空间,其值为http://www.w3.org/1999/xhtml
  • 因为是XML,所以MIME type不能是text/html了,text/xmlapplication/xmlapplication/xml+html都是比较好的选择。
  • 因为是XML,必须有根元素,根元素为<html>,即<html>的开始和结束标签不能省略了。
  • 因为是XML,所有元素只要有了开始标签,就不能没有结束标签,或者自闭合。
  • 因为是XML,所有元素都得严格遵守大小写,元素名称必须为小写。

因为是XML,文档变得严格了很多,也因为是XML,其可读性和规范性提高了不少。但最终,我们始终要在HTML的宽容性和XML的规范性之间找到最佳的平衡点,一味地追求极端始终是一个错误。

本文永久地址:http://www.otakustay.com/learning-html5-structure/

标签: html, html5
posted @ 2011-03-28 16:27 Gray Zhang 阅读(2706) 评论(11) 编辑 收藏

 回复 引用 查看   
#1楼2011-03-28 16:41 | 六芒星      
支持性路过。。。
 回复 引用 查看   
#2楼2011-03-28 17:14 | 万一      
@六芒星
挺好,等你继续说。

 回复 引用 查看   
#3楼2011-03-28 17:50 | 沉默杨仔      
这个必须得支持,楼主最好再推荐几本关于html5的书。工作太忙,都没时间了解这些
 回复 引用 查看   
#4楼[楼主]2011-03-28 17:52 | Gray Zhang      
@沉默杨仔
只看标准不看书,经常因为这个被BS来着……
http://diveintohtml5.org/peeks-pokes-and-pointers.html
这本书也不错

 回复 引用 查看   
#5楼2011-03-28 20:34 | Ivony...      
我还是有不同意见。。。。

“需要注意的是,此处的省略指的是在源码中省略,而在最终成型的DOM树中,这个标签是存在的,因此才称为隐式标签。因此上面最简的源码结构,在生成DOM树后,其真正的结构是这样的:”


HTML规范,只是定义了什么“是”HTML文档,至于这个文档,具体是被解释为什么(DOM结构),不是HTML规范所定义的。这是与XML规范不同的。


所以此处的省略,只是说省略后仍然是一个HTML文档,却没有做任何DOM的保证。

 回复 引用 查看   
#6楼[楼主]2011-03-28 20:38 | Gray Zhang      
@Ivony...
关于这一点,我的结论是来自这一段
http://dev.w3.org/html5/markup/documents.html#syntax-implied-tags
该段中有这样的文字:

引用The DOM tree constructed from that example by a conformant UA would look like this:
xxx
Note that the DOM tree includes the html, head, and body elements whose start tags and end tags are implied in the document.


这一段来自HTML5 Reference,虽然并不是spec,但作为ref应该也具有一定的导向性,或许这不是一个标准(standard),但在我看来他应该至少是一种建议(recommandation)

当然在HTML的spec中我确实没有见到任何与DOM Tree相关的细节,不知道关于这一点你怎么看

 回复 引用 查看   
#7楼2011-03-28 20:54 | Ivony...      
引用Gray Zhang:
@Ivony...
关于这一点,我的结论是来自这一段
http://dev.w3.org/html5/markup/documents.html#syntax-implied-tags
该段中有这样的文字:

引用The DOM tree constructed from that example by a conformant UA would look like this:
xxx
Note that the DOM tree includes the html, head, and body elements whose start tags and e...




我当然是喜欢XML的,尽管我也认为XHTML过分严格了。但是XML的革命性意义在于,他定义了什么是well-formed的文档。

HTML规范不定义实现细节并不是问题,HTML 4.01规范也没有定义实现细节,我见过的所有HTML规范都没有定义过。事实上Web混乱的本源就在于此,并不是邪恶的比尔大叔要QJ Web。

HTML5的实现细节可能会由其他的文档和规范来定义,例如DOM规范,呈现方式则由CSS规范来定义,HTML5规范则仅仅只是定义文档结构。要想终结Web混乱的局面,一个HTML5规范完全不能解决问题,我们还需要很多其他的规范。

 回复 引用 查看   
#8楼[楼主]2011-03-28 20:58 | Gray Zhang      
@Ivony...
这是必然的,现在来看,从HTML到DOM到CSS到ECMA,一系列的规范才能组成一个较为完整的Web,但就算是这些规范,也已经混乱不堪

我不想评价XHTML和HTML谁优谁劣的问题,我会按XHTML来编写代码,但作为对标准的学习,我选择HTML(因为选XHTML会很无聊……)

HTML5由于是whatwg来组织,而且奇怪的是HTML5的定义一直涵盖了相当一部分javascript和DOM的API,如geolocation、localstorage或者online/offline等事件,只能说whatwg有一种想把所有东西整合起来的感觉

 回复 引用 查看   
#9楼[楼主]2011-03-28 21:00 | Gray Zhang      
@Ivony...
说起规范和实现细节的问题,下午看群里讨论就有聊到这个,一个很恶搞的问题就来自于ECMA262,这个所谓的规范/标准把实现细节说得明明白白,连注释怎么解释、分号怎么插入都说得一清二楚,实为一个另类的规范

 回复 引用 查看   
#10楼2011-03-29 10:22 | 封涨停      
标准这玩意儿,如果不能被大众普遍接受,就必然被淘汰;
cobar,ejb就是前车之鉴。
html5能不能被普遍使用,是个问题。

 回复 引用 查看   
#11楼2011-03-30 01:05 | Admonis      
顶!支持博主!!!!
继续关注,期待下一篇。