Skip to content
This page has been auto-translated and may contain errors.View in English

文档结构和大纲

docs.scrimba.com

一个页面不是一堆平铺的元素。从上到下阅读时,它应该自成一体:一个标题,然后是它下面的各个部分,每个部分都有自己的标题,按有意义的顺序排列。这个形状就是页面的大纲,它来自两个因素的共同作用。标题为每个部分命名,来自语义 HTML 章节的地标区域 <header><nav><main><aside><footer> 将这些部分分组成区域。本章讲的是这两者如何组合成整个页面。

标题和地标如何形成大纲

网页从上到下阅读,就像你阅读书中的一页。访客从顶部开始向下进行,所以内容所在的顺序就是访客阅读它的顺序。将内容按照某人实际想要接触它们的顺序放置。

标题为该顺序赋予了形状。标题是对其后内容部分的简短标签,使用 <h1><h6> 的标签编写。<h1> 是整个页面的标题。每个 <h2> 为其下的主要部分命名,<h3><h2> 内的较小部分命名。将它们堆叠起来,你就会得到页面的**大纲**:一个镜像页面顺序的目录。

html
<h1>初学者的酸面包</h1>
<h2>你需要什么</h2>
<h3>配料</h3>
<h3>工具</h3>
<h2>制作酵种</h2>

单独阅读标题,你就已经知道了页面的内容以及它是如何组织的,甚至还没有读一个段落。

页面的结构来自两个层次,它们回答不同的问题。标题级别 <h1><h6> 形成一个嵌套层次结构:<h1> 是页面标题,<h2> 是顶级部分,<h3> 是该 <h2> 的子部分,依此类推。单独阅读标题,你就有了页面的**大纲**,一个直接从标记构建的目录。

地标元素形成第二层。<header><nav><main><aside><footer> 将页面分组成命名区域,所以你不是得到一个嵌套的主题列表,而是得到一个区域地图:这是导航,这是主要内容,这是页脚。

html
<body>
  <header>
    <nav>...</nav>
  </header>
  <main>
    <h1>初学者的酸面包</h1>
    <h2>你需要什么</h2>
    <h2>制作酵种</h2>
  </main>
  <footer>...</footer>
</body>

一个结构告诉你内容是关于什么的(标题),另一个告诉你每种内容住在哪里(地标)。构建良好的页面两者都有。

**大纲**是页面的结构表示为一个层次结构:顶部是标题,其下是各部分,这些部分的下面是子部分。没有什么在屏幕上画出这个大纲。它存在于标记中,它的主要受众是读取结构而不是像素的软件。

屏幕阅读器(为看不见的人朗读页面或驱动盲文显示器的软件)从页面构建两个可导航的结构。第一个是所有标题的列表,从 <h1><h6>,按源序保持其级别,所以用户可以调出所有标题并直接跳到他们想要的标题。第二个是地标的列表,由 <header><nav><main><aside><footer> 标记的区域,这使他们可以在整个区域之间跳跃,而不是读完它们之间的所有内容。每个地标元素都带有隐含的 ARIA 角色(一个可访问性标签,命名它是什么类型的区域,例如 navigationmain),屏幕阅读器会宣布的就是这个角色。

这两个结构在实践中就是大纲。有视觉的读者通过扫描页面下来的标题文本来略读;屏幕阅读器用户通过逐步浏览相同的标题和区域来略读。相同的结构,用两种方式到达。这就是有意构建它的原因:大纲不是少数人依赖的装饰,它是一个大群体如何阅读的方式。

Juno标题和地标如何形成大纲 从上到下阅读页面,就像阅读书籍一样,所以按照人们想要内容的顺序放置内容。你的标题,从 <h1><h6>,是骨架:<h1> 是页面标题,一切都在它下面嵌套。单独阅读标题,你就应该已经知道页面的布局方式。
Juno标题和地标如何形成大纲 两个层次给了页面它的形状:标题级别构建了一个嵌套的目录,而像 <main><nav> 这样的地标描绘出了区域。一个说的是内容是关于什么的,另一个说的是它住在哪里。两者都构建,页面就有了真正的结构,而不仅仅是外观。
Juno标题和地标如何形成大纲 屏幕阅读器从你的页面构建两个列表:每个标题及其级别,和每个地标区域。这对就是你的大纲,也是很多人实际阅读的方式。所以结构不是为少数用户提供的便利,它是阅读体验本身,它直接来自你选择的标签。

一个 main,和正确的标题顺序

两个习惯可以保持大纲清晰。首先,给页面一个单独的 <h1>。它是页面的标题,一个页面有一个标题,就像一本书在封面上只有一个名字。其他所有内容都是 <h2> 及以下。

其次,不要跳过级别。在 <h2> 之后,下一步是 <h3>,而不是 <h5>。跳过级别会在大纲中留下间隙,就像目录中列出第 1 章然后第 4 章。一次移动一个级别,向下和备份:

html
<h1>平日晚餐</h1>
<h2>意大利面</h2>
<h3>番茄和罗勒</h3>
<h3>大蒜黄油</h3>
<h2>沙拉</h2>
<h3>希腊</h3>

这些标题所在的内容通常位于一个 <main> 区域内。<main> 标记页面的主要内容,这部分对这个页面来说是唯一的,不是共享的页眉、导航或页脚。有一个 <main>,就像有一个 <h1> 一样。

一个页面确实只有一个 <main> 地标。它包装了对这个页面来说是唯一的内容,屏幕阅读器提供了直接跳转到它的功能,所以用户可以跳过在每个页面上重复出现的页眉和导航。一个页面上两个 <main> 元素打破了这个承诺并混淆了区域地图。

对于标题,两个规则保持大纲的一致性。有一个 <h1>,即页面标题。并且标题级别依次下降:<h2> 后面跟 <h3>,从不直接跳到 <h4><h5>选择标题级别的依据是它在大纲中的位置,而不是它看起来有多大。<h1> 通常直接位于 <main> 内或页面页眉中,命名页面所关于的内容。

html
<main>
  <h1>平日晚餐</h1>
  <h2>意大利面</h2>
  <h3>番茄和罗勒</h3>
</main>

如果标题看起来太大或太小,那是一个样式问题。在 CSS 中设置大小,让级别保持其含义。

每个页面有一个 <main>(在标记中可能有更多,仅当除一个外都隐藏时,例如在将非活跃视图保留在 DOM 中的单页应用中)。它带有 ARIA 角色 main,是键盘和屏幕阅读器用户依赖的"跳转到主要内容"跳跃的目标,以绕过重复的导航。

标题级别比外观看起来要重得多,因为有一段值得了解的历史。多年来,HTML 规范描述了一个文档**大纲算法**,它可以从分节元素(<section><article><nav><aside>)计算结构,所以嵌套在 <section> 内的 <h1> 会自动降级为二级标题。这是一个简洁的想法。没有浏览器曾经实现过它,没有屏幕阅读器使用过它,最终它被从规范中删除了。

实际的后果很简单且永久:大纲仅由你的标题数字定义。嵌套在三个 <section> 元素深处的 <h1> 对每个浏览器和每个屏幕阅读器仍然是顶级标题。嵌套不会为你重新编号任何东西。所以保持一个 <h1>,一次下降一个级别,并将数字视为它是的结构事实,而不是大小拨号盘。

Juno一个 main,和正确的标题顺序 每个页面一个 <h1>,因为一个页面有一个标题。逐个级别地向下进行标题级别,<h2> 然后 <h3>,不要跳到 <h5>。页面的主要内容放在一个 <main> 中。如果标题看起来大小不对,那是 CSS 的工作,不是切换级别的理由。
Juno一个 main,和正确的标题顺序 一个 <main>,一个 <h1>,和逐级递减的级别。为标题在大纲中的位置选择,而不是为它呈现的大小,因为大小属于你的样式表。<main> 也是跳过链接的目标,所以保持单一可以保持该快捷方式有效。
Juno一个 main,和正确的标题顺序 那个会按分节嵌套重新编号标题的旧大纲算法从未被构建过并被删除了,所以你的标题数字就是大纲,就这样。一个埋在三个 <section> 元素中的 <h1> 在任何地方仍然是一个 <h1>。保持一个 <h1>,一个 <main>,和逐级递减。

分组和排序内容

相关内容分组在一起时阅读效果更好。两个元素用于此目的。<section> 是一个页面的主题块,有自己的标题,就像食谱的"配料"部分。<article> 是一个独立的作品,即使你提取它也仍然有意义,比如单个博客文章或客户评论。

html
<article>
  <h2>低温焙烤佛卡夏</h2>
  <p>几乎不需要揉搓的面包。</p>
</article>

顺序和分组一样重要。因为页面从上到下阅读,把最重要的内容放在靠近顶部的地方,其余的按读者想要的顺序排列。食谱在步骤之前列出你需要的东西,因为那是你会跟随它的顺序。

对有一个标题的内容的主题分组使用 <section>,对可以独立分发的自成一体的单位使用 <article>,比如博客文章、产品卡或论坛回复。两者都应该有一个标题,这样它们会出现在大纲中;如果分组没有名称,分组内容只是工作的一半。

你编写元素的顺序是**源序**,它的重要性比乍一看要大。源序就是阅读顺序和制表符顺序。阅读顺序是屏幕阅读器说的内容和没有 CSS 的页面显示的内容。制表符顺序是按下 Tab 键时键盘在链接和表单控件中移动的顺序。两者默认都跟随源序。

html
<main>
  <article>
    <h2>低温焙烤佛卡夏</h2>
    <h2>...</h2>
  </article>
</main>

CSS 可以用 flexbox 或网格在视觉上移动内容,但它不会改变源序。所以按内容实际阅读的顺序编写标记,然后从那里开始样式化。在 CSS 中重新排序,可见顺序和制表符顺序就不匹配了,这对任何通过键盘导航的人来说都是令人困惑的。

<section><article> 分组内容,但都不产生标题级别。这是大纲算法观点的具体体现:<section> 不会为大纲添加步骤,一个内部没有标题的 <section> 对屏幕阅读器无法导航到的内容没有任何贡献。给每个分节元素一个标题,否则它是眼睛能看到的分组,而大纲看不到。

结构的考虑应该是略读,因为几乎没有人从头到尾阅读页面。有视觉的用户扫描标题;屏幕阅读器用户逐步浏览标题和地标列表。一个描述性的 <h2> 每屏,以及优先加载内容使要点在支持细节之前,两种用户都可以使用。没有标题的大段文字对任何类型的略读者来说都是不可读的。

然后是**键盘导航**,用 Tab 键而不是鼠标在页面中移动,它遵循源序。一旦你用 CSS orderflex-direction: row-reverse 或网格放置在视觉上重新排序内容,可见顺序和源序就分散了:当用户按 Tab 键时焦点在屏幕上不可预测地跳跃,因为浏览器仍然遵循源序。鼠标用户从不注意到的重新排序对键盘用户来说成了一个迷宫。可靠的规则是使源序与预期的阅读顺序相匹配,并为不影响内容应如何阅读的更改保留 CSS 重新排序。

Juno分组和排序内容<section> 分组有标题的主题部分的相关内容,用 <article> 包装自成一体的内容,比如单个文章。然后注意顺序:页面从上到下阅读,所以重要的内容靠近顶部。按照某人实际想要阅读的顺序编写它。
Juno分组和排序内容<section> 在标题下分组内容,<article> 包装自成一体的单位,两者都需要一个标题以便进入大纲。要记住的大事件:源序就是阅读顺序和制表符顺序。按照它阅读的顺序编写标记,然后让 CSS 处理外观,否则键盘路径就不再匹配人们看到的内容。
Juno分组和排序内容 一个没有标题的 <section> 对大纲是看不见的,所以每个分组都要有一个标题,否则它分组的就是屏幕阅读器无法到达的东西。而源序就是你的制表符顺序:用 CSS order 或网格重新排序,焦点就会开始在屏幕周围跳跃以进行键盘用户。将源序匹配到阅读顺序,只在不改变内容应如何阅读时才在 CSS 中重新排序。

常见的结构性错误

一些结构性错误一次又一次地出现,每一个都有一个简洁的修复。

  • 使用标题标签来放大文本。 因为它呈现的大小而去使用 <h3> 会破坏大纲。按照含义选择级别,在 CSS 中设置大小。
  • 跳过标题级别。<h2> 跳到 <h4> 会在大纲中留下洞。一次一个级别地向下。
  • 超过一个 <h1> 一个页面有一个标题。额外的 <h1> 标签会混乱目录。
  • 根本没有标题。 一长段没有任何中断的段落很难扫描。添加标题以便读者可以找到他们的路。

修复这些,页面对每个人来说都读得清楚,无论他们是用眼睛扫描还是听着它被朗读。可访问性章节对让页面对每个访客都有效有更多的说明。

常见的错误都归结为外观代替结构。

为其呈现的大小选择标题级别会扰乱大纲,因为级别是一个结构信号,CSS 已经控制了大小。跳过级别(一个 <h2> 后跟 <h4>)会留下一个读起来像缺失的部分的间隙。多个 <h1> 元素给了页面多个标题并模糊了它的目录。伪造标题,给 <p><div> 样式使其看起来大胆和巨大,给了你外观而没有结构:它从不出现在屏幕阅读器构建的标题列表中。

还有两个值得命名。一个空地标,比如一个里面什么都没有的 <nav>,添加了一个导向无处的区域。而在 CSS 中重新排序内容,使可见顺序不再匹配源序,让键盘用户以与他们看到的不匹配的顺序制表通过页面。将结构保留在 HTML 中,外观保留在 CSS 中,大多数这些情况都不会发生。

大多数结构性失败是同一个错误穿了不同的衣服:用外观代替结构。一个样式看起来像标题的 <div> 对辅助技术没有任何作用,因为样式对大纲没有影响;只有真实的标题元素进入标题列表。跳过的级别对屏幕阅读器用户读起来像一个消失的部分。几个 <h1> 元素把页面交给了多个标题,削弱了大多数用户依赖的一个快捷方式。

更微妙的失败是关于顺序和焦点。用 CSS 重新排序,使视觉和源顺序分散,对鼠标用户来说是看不见的,对任何通过制表符浏览的人来说是令人困惑的,因为键盘导航遵循源序。正的 tabindex 值(一个强制元素更早进入制表符顺序的属性)会通过按顺序跳跃焦点使这更糟;避免它们并让源序做工作。还有一个没有可访问内容的地标,一个空的 <nav> 或一个没有标题的 <section>,添加了一个导向无处的区域到地图。

其中所有的基本规则是:在 HTML 中构建结构,这样没有 CSS 也是正确的,然后在上面样式化。一个其大纲在纯粹的、无样式的标记中保持的页面,是一个以它被阅读的每种方式都保持的页面。关于元素本身的更多信息,语义 HTML 章节是本章的伴侣。

Juno常见的结构性错误 前四项:不要用标题来放大文本,不要跳过级别,不要添加第二个 <h1>,不要让长页面完全没有标题。每一个都会混乱大纲。按照含义选择标题级别,让 CSS 处理大小。
Juno常见的结构性错误 几乎每个结构错误都是外观代替结构:一个为其大小而选择的标题,一个假装是标题的大胆 <div>,一个跳过的级别,两个 <h1> 元素。一个样式化的 <div> 从不进入大纲,所以它只是眼睛的标题。将结构保留在 HTML 中,样式保留在 CSS 中,这些大多数都会消失。
Juno常见的结构性错误 每种情况下的迹象都是样式在做结构的工作:一个假的 <div> 标题,一个跳过的级别,空地标,一个让键盘焦点跳跃的 CSS 重新排序。也跳过正的 tabindex,它会拖拽焦点失序。构建没有 CSS 也正确的标记,然后在上面样式化,它就会以某人到达它的任何方式读得正确。