3.3 创建HTML文档
元素和属性不会孤立存在,它们是用来标记HTML文档内容的。要创建一个HTML文档,最简单的方法是创建一个文本文件,并将其文件扩展名设置成为这类文件规定的.html。这个文件可以直接从磁盘载入浏览器,也可以从Web服务器载入(在本书中,我一般都要使用Web服务器。我的Web服务器名为titan,这个名字经常出现在书中屏幕截图的浏览器窗口中)。
浏览器和用户代理
在本章(及本书大部分章节)中,HTML文档都是针对浏览器创建的。这样看待HTML文档较为省事,而且HTML文档最常见的使用方式也是用浏览器查看。但是还有其他情况需要考虑。用于处理HTML文档的各种软件有一个共同的名称叫做用户代理(user agent)。浏览器是最流行的用户代理,但不是唯一的一种。
非浏览器类用户代理现在还很少,以后可能会多起来。在HTML5中更加强调将内容与呈现形式分开,正是因为认识到HTML内容并不总是会被显示给用户看。本书尽管说的还是浏览器(因为这是最重要、最强势的一类用户代理),但是最好还是记住:你的HTML文档有可能会给别的一些软件处理。
HTML文档具有特定的结构,最起码要有一些关键性的元素。本书绝大多数示例均为完整的HTML文档,这样读者很快就能轻松看出元素的应用方式和效果。为了给你一个初步印象,在此我要先带你看一个基本的HTML文档。代码清单中所有的HTML元素都会在后面各章得到详细讲解,本章提供了它们的相关参照信息。
HTML与XHTML的对比
尽管本书讲的是HTML,但我要是不提一下XHTML(在HTML前面加了一个X)的话,那就太不负责了。符合HTML语法的文档不一定符合XML语法,因此用标准的XML解析程序处理HTML文档可能会遇到麻烦。
为了解决这个问题,可以使用XHTML,它是HTML的XML序列化形式(这就是说,以符合XML规范的方式来表达文档的内容以及HTML元素和属性,以便XML解析程序处理)。此外,也可以创建既是有效HTML文档也是有效XML文档的多语文档(polyglot document),不过这要求使用HTML语法的一个子集。本书不讲XHTML,想了解更多XHTML方面的信息的读者可以参阅这个网址:http://wiki.whatwg.org/wiki/HTML_vs.XHTML。
3.3.1 外层结构
HTML文档的外层结构由两个元素确定:DOCTYPE和html,如代码清单3-11所示。
代码清单3-11 HTML文档的外层结构
<! DOCTYPE HTML> <html> <! -- elements go here --> </html>
上例中的DOCTYPE元素让浏览器明白其处理的是HTML文档。这是用布尔属性HTML表达的:
<! DOCTYPEHTML>
紧跟着DOCTYPE元素的是html元素的开始标签。它告诉浏览器:自此直到html结束标签,所有元素内容都应作为HTML处理。用了DOCTYPE元素之后又接着使用html元素看起来可能有点奇怪,其实早在HTML标准小荷才露尖尖角的时候,具有同等地位的还有一些别的标记语言,文档中可能会混合使用多种标记语言。
如今HTML已成为占绝对优势的标记语言,即使在文档中省略DOCTYPE和html元素,绝大多数浏览器仍会假定自己处理的是HTML文档。不过这并不意味着不必再用这两个元素。这是因为它们有着重要的用途,而且依赖浏览器的默认行为模式就像轻信陌生人一样不靠谱——多数情况下事情很顺利,可是冷不防就会出大漏子。关于DOCTYPE和html元素详见第7章。
3.3.2 元数据
HTML文档的元数据部分可以用来向浏览器提供文档的一些信息。元数据包含在head元素内部,如代码清单3-12所示。
代码清单3-12 在HTML文档中添加head元素
<! DOCTYPE HTML> <html> <head> <!-- metadata goes here --> <title>Example</title> </head>
</html>
这个清单中的元数据少到不能再少,只有title元素一项。按说HTML文档中都应该包含title元素,但是没有的话浏览器通常也不会在意。大多数浏览器把title元素的内容显示在其窗口的标题栏上或用来显示文档的标签页的标签位置上。第7章会详细说明head元素和title元素,以及可以放在head元素中的所有其他元数据元素。
提示
代码清单3-12也演示了HTML文档中注释的写法。注释以标签<! --开头,以-->结尾。浏览器会忽略这两个标签之间的一切内容。
除了可包含用于说明HTML文档的元素,head元素还能用来规定文档与外部资源(如CSS样式表)的关系,定义内嵌CSS样式,放置和载入脚本程序。第7章将会示范所有这些用途。
3.3.3 内容
文档的第三部分是文档内容,这也是最后一个部分,放在body元素之中,如代码清单3-13所示。
代码清单3-13 在HTML文档中添加body元素
<! DOCTYPE HTML> <html> <head> <! -- metadata goes here --> <title>Example</title> </head> <body> <!-- content and elements go here --> I like <code>apples</code> and oranges. </body> </html>
body元素告诉浏览器该向用户显示文档的哪个部分。自然,本书大部分篇幅都花在那些需要放在body元素之中的东西上面。把body元素加进来后,HTML文档的基本框架业已成型,本书大部分例子都要用到这个框架。
3.3.4 父元素、子元素、后代元素和兄弟元素
HTML文档中元素之间有明确的关系。包含另一个元素的元素是被包含元素的父元素。在代码清单3-13中,body元素是code元素的父元素,这是因为code元素位于body元素的开始标签和结束标签之间。反过来说,code元素是body元素的子元素。一个元素可以拥有多个子元素,但只能有一个父元素。
包含在其他元素中的元素也可以包含别的元素。从代码清单3-13中也可以看到:html元素包含着body元素,而后者又包含着code元素。body元素和code元素都是html元素的后代元素,但是二者中只有body元素才是html元素的子元素。子元素是关系最近的后代元素。具有同一个父元素的几个元素互为兄弟元素。在代码清单3-13中,head元素和body元素就是兄弟,这是因为它们都是html元素的子元素。
元素间关系的重要性在HTML中随处可见。一个元素能以什么样的元素为父元素或子元素是有限制的,这些限制通过元素类型表现出来(下一节将讨论这个问题)。即将在第4章讲述的CSS中元素间的关系也很重要,圈定应用样式的元素的方法之一就要借助元素的父子关系。最后,本书第四部分中介绍的文档对象模型(DOM)也会涉及通过搜索文档树查找文档中某个元素,而文档树正是元素之间关系的一种表述。在HTML世界里,从后代中辨认兄弟是一种重要能力。
3.3.5 了解元素类型
HTML5规范将元素分为三大类:元数据元素(metadata element)、流元素(flow element)和短语元素(phrasing element)。
元数据元素用来构建HTML文档的基本结构,以及就如何处理文档向浏览器提供信息和指示。其说明见第7章。
另外两种元素略有不同,它们的用途是确定一个元素合法的父元素和子元素范围。短语元素是HTML的基本成分。第8章会介绍最常用的短语元素。流元素是短语元素的超集。这就是说,所有短语元素都是流元素,但并非所有流元素都是短语元素。
有些元素无法归入上述三种类型,这些元素要么没有什么特别的含义,要么只能用在一些非常有限的情况下。li元素就是受限元素的一个例子。它表示列表项,只能有三种父元素:ol(表示有序列表)、ul(表示无序列表)和menu(表示菜单)。该元素详见第9章。从第6章开始的所有元素说明都包含了元素所属类型的信息。