原文链接:

Using HTML sections and outlines - Mozilla Developer Network
每集HTML5+CSS3网页布局教程-2大纲算法
HTML5标准带来了几个带有标准语义的新元素来描述Web文档结构。本文会介绍这些元素,并且讨论如何用这些元素定义令人满意的文档大纲。

HTML4时代的文档结构

文档的结构(或者可以说在body标签之间的结构)是展示和表现web页面的基础。HTML4使用了区块(sections)和子区块(sub-sections)的概念来描述文档的结构。使用div元素来定义一个区块,并且使用标题元素(h1-h6)来定义这个区块的标题。它们之间的关系决定了web文档的结构和大纲。

下面的这些代码:

Forest elephants

In this section, we discuss the lesser known forest elephants.
...this section continues...

Habitat

Forest elephants do not live in trees but among them.
...this subsection continues...

可以提炼出如下的大纲:

  1. Forest elephants
    1.1 Habitat

定义一个大纲中的节点不一定非要使用div元素,其实,只要一个标题元素(h1-h6)就已经足够用来暗示一个节点了,所以这些标签:

Forest elephants

In this section, we discuss the lesser known forest elephants.
...this section continues...

Habitat

Forest elephants do not live in trees but among them.
...this subsection continues...

Diet

Mongolian gerbils

提炼出了如下的大纲:

  1. Forest elephants
    1.1 Habitat
    1.2 Diet
  2. Mongolian gerbils
    (译注:这段代码没有使用任何div标签,大纲是根据标题元素——例中为h1和h2——来提炼的)

HTML5解决的问题

在HTML4中,文档结构的定义和大纲的算法非常简陋,这带来了不少的问题:

【问题1】用div元素来定义具有语义的区块的话,没有特定的class就没法自动生成大纲(“这个div是大纲的一部分,用来定义区块或者子区块的?”还是“它仅仅就是个div,为了方便使用CSS用来做样式的?”),换句话说,HTML4在“什么是区块、区块的范围怎么定义”这些问题上很不明确。页面是否能自动生成大纲非常重要,因为大多数屏幕阅读器(为有视力障碍人士提供的辅助阅读技术)就是根据文档大纲来规整它们将要展示给用户的信息。而在HTML5中,大纲算法不再必须使用div元素,取代div的是一个新的元素——section.

【问题2】多文档的融合是个难题:引入一个从别处采集来的子文档很可能会改变标题元素的等级,而HTML4正事根据这些标题元素的等级来提炼大纲的。HTML5引入了一系列全新的定义区块的元素(article, section, nav和aside),这些元素有这样的特性:不管它内部的标题元素(h1-h6)是什么级别,它总是离它最近的祖先区块的子节点。

译者例:

h3标题

h1标题

从其他文档引入的section区块

h2标题

从其他文档引入的div区块

上述代码提炼出的大纲如下:

1.h3标题
1.1.h1标题
2.h2标题

可以看到,h1标题竟然成为了h3标题的子节点,这就是section元素的功劳了。因为不管它内部的标题元素是老大(h1)还是老六(h6),它都乖乖的成为离他最近的祖先节点(body)的子节点。再看div,虽然理论上应该也是body的子节点,但由于h2的级别高于h3(h3是body的标题),所以在大纲中竟和body变成了同级节点。

【问题3】在HTML4中,每个节点都是大纲的一部分。但web文档有时候并不是线性的。web文档有时可能会包含特殊的区块来承载信息,但这些信息并不属于主文档的一部分,比如广告和注释。HTML5引入了aside元素,该元素不会作为大纲的节点而成为大纲的一部分。

【问题4】同样的,在HTML4中,由于每个节点都是大纲的一部分,所以也没有适合的区块来承载logo、菜单、目录、版权信息和法律条款等这些信息,因为这些信息和web页面的内容无关,而是和web站点有关。为了解决该问题,HTML5同样引入了三个新元素:①用来承载链接(例如导航菜单和目录)的nav元素②用来承载web站点相关信息的header元素③用来承载web站点相关信息的footer元素。请注意header和footer和section不同,它们不会在大纲中出现,只负责语义性的描述一个区块(译注:有点类似div,但具有语义)。

总而言之,HTML5带来了更准确的区块和标题功能,这使得文档的可控性更强,而且更容易被浏览器使用,从而更好地提高用户体验。

HTML5的大纲算法

让我们来看看大纲算法是如何提炼区块和标题的。

body元素中所有元素都是节点。除了body元素定义的主节点,定义节点可以分为“显性定义的节点”和“隐性定义的节点”两种(以下下简称为“显性节点”和“隐性节点”)。

1.显性定义节点

显性节点使用、