第9课:HTML5 语义区块标签
在 HTML5 之前,开发者只能使用 <div> 来划分页面的各个区域,通过 id 或 class 赋予其含义(如 <div id="header">)。HTML5 引入了一套全新的语义区块标签,让页面的结构具有内在的含义。这些标签不仅让代码更具可读性,更是搜索引擎优化(SEO)和可访问性(a11y)基础设施的核心。本节课将逐一剖析 <header>、<footer>、<main>、<article>、<section>、<aside> 和 <nav> 的精确语义、使用场景以及常见的滥用误区。
1. <header>:介绍性内容容器
<header> 表示一组介绍性内容或导航链接。它通常出现在页面、文章或区块的顶部,但不限于顶部。
1 | <article> |
1.1 语义定义与限制
- 可以出现多次:一个页面可以有多个
<header>,例如全局页头、文章页头、区块页头。 - 不能嵌套在另一个
<header>或<footer>内部,也不能是<address>元素的子元素。 - 通常包含:标题(
<h1>~<h6>)、Logo、作者信息、发布日期、导航菜单(<nav>)。
1.2 <header> 与 <h1> 的关系
<header>是容器,<h1>是内容。- 在全局
<header>中,<h1>应代表整个页面的核心主题。 - 在文章
<header>中,标题通常是<h2>或更低级别,以维护页面的标题层级。
1 | <body> |
1.3 常见误用
1 | <!-- ❌ 错误:仅为了包裹一组导航链接而使用 header --> |
2. <footer>:页脚与附属信息
<footer> 表示最近祖先区块(article、section、body 等)的页脚。它通常包含版权信息、作者、相关链接、文档附录等。
1 | <article> |
2.1 语义与多重实例
- 与
<header>类似,<footer>也可在页面内多次出现(页面级页脚、文章级页脚、区块级页脚)。 - 其内容通常与其所在的分段内容元素相关,而非整个页面的版权声明专属。
2.2 <footer> 内不应包含的内容
- 不应再嵌套
<header>或另一个<footer>。 - 不应包含新的主要内容区块(如将
<section>放入<footer>是错误的)。
2.3 与 <address> 的配合
<address> 表示最近祖先 article 或 body 的联系信息。将其放在 <footer> 内是常见的语义组合。
1 | <footer> |
3. <main>:页面的核心内容
<main> 表示文档 <body> 中的主要、独特的内容区域。每个页面应仅有一个 <main>。
1 | <body> |
3.1 关键约束
| 规则 | 说明 |
|---|---|
| 唯一性 | 一个文档中最多只能有一个 <main> 元素(除非其他 <main> 设置了 hidden 属性)。 |
| 不能嵌套 | <main> 不能是 <article>、<aside>、<footer>、<header> 或 <nav> 的子元素。 |
与 role="main" 的关系 |
ARIA 地标(Landmark)中,<main> 自动映射为 role="main",无需额外添加。 |
3.2 可访问性价值
屏幕阅读器用户可以通过快捷键直接跳转到 <main> 区域,跳过重复的导航栏和侧边栏,快速访问核心内容。这对于键盘和辅助技术用户至关重要。
3.3 常见误用
1 | <!-- ❌ 错误:将侧边栏也包裹在 main 中 --> |
4. <article>:独立、可分发的内容块
<article> 表示独立的、完整的、可独立分发或重用的内容块。例如一篇博客文章、一个论坛帖子、一条新闻评论、一个交互式小部件。
1 | <article> |
4.1 判断标准:“独立发布测试”
一个简单的心智模型:如果将该内容块从当前页面剥离,发布到其他页面或 RSS 阅读器中,是否依然完整且有意义? 若是,则应使用 <article>。
4.2 <article> 的嵌套
<article> 可以嵌套,用于表示与父文章相关联的子内容,例如博客文章的评论区。
1 | <article> |
4.3 何时不用 <article>
- 仅为了包裹一组样式块而使用
<article>是错误的,应使用<div>。 - 如果内容不具备“独立完整性”,只是页面的一个分区,应使用
<section>。
5. <section>:主题分组
<section> 表示文档或应用中一个主题性的内容分组,通常需要包含一个标题(<h1>~<h6>)。
1 | <article> |
5.1 <section> 与 <article> 的核心区别
| 对比项 | <section> |
<article> |
|---|---|---|
| 独立性 | 通常依赖上下文,脱离后意义不完整。 | 完全独立,可单独发布。 |
| 标题要求 | 强烈建议包含标题,以形成文档大纲。 | 通常包含标题,但非强制。 |
| 典型场景 | 长文章分章节、首页的功能分区(热门商品、新闻动态)。 | 博客列表中的每篇文章、RSS 条目、评论、产品卡片。 |
| 嵌套关系 | 可以包含 <article>(如首页的“最新文章”区块,内含多个 <article>)。 |
可以包含 <section>(如将长文章分章节)。 |
5.2 警告:勿滥用 <section>
一个常见的反模式是用 <section> 替代 <div> 作为样式钩子或脚本容器。
1 | <!-- ❌ 错误:无标题、无主题分组的含义 --> |
6. <aside>:附属内容
<aside> 表示与周围内容只有间接关联的内容,通常表现为侧边栏、引用、广告、相关链接等。
1 | <article> |
6.1 两种典型使用模式
| 位置 | 含义 | 示例 |
|---|---|---|
在 <article> 内部 |
与文章内容相关但非核心的补充信息(如术语解释、引用来源)。 | 文内插入的名词解释框。 |
在 <article> 外部 |
与整个页面相关的侧边栏内容(如导航菜单、广告、作者简介)。 | 全局侧边栏、相关文章推荐。 |
6.2 可访问性映射
<aside> 自动映射为 ARIA complementary 地标角色,屏幕阅读器可据此快速定位辅助内容区域。
7. <nav>:导航链接集合
<nav> 表示页面中的主导航链接区块。并非所有链接组都需用 <nav> 包裹——仅用于主要导航结构。
1 | <nav aria-label="主导航"> |
7.1 常见导航类型与 aria-label
一个页面可能有多个 <nav>,此时应使用 aria-label 或 aria-labelledby 区分其用途,帮助辅助技术用户理解。
1 | <nav aria-label="主导航">...</nav> |
7.2 何时不用 <nav>
- 友情链接区块(若为非核心导航,可用
<footer>内的普通链接列表)。 - 文章内的脚注链接列表。
- 分页控件(虽然也是导航,但通常用
<nav>包裹是合适的)。
8. 综合示例:典型博客页面的语义结构
1 |
|
课后练习
一、概念自测(选择题 / 填空题)
(单选) 以下哪个标签最适合表示一篇独立的博客文章?
A.<section>
B.<article>
C.<div>
D.<main>(单选) 关于
<main>元素,下列说法正确的是?
A. 一个页面可以有多个<main>元素,只要它们位于不同的<section>内。
B.<main>可以嵌套在<article>内部。
C.<main>自动映射为 ARIArole="main",辅助技术可直接跳转。
D.<main>应该包含页面的所有内容,包括侧边栏和导航。(填空) 要表示文章内部与主题相关但非核心的补充信息(如术语解释框),应使用
______标签。(判断)
<header>元素在一个页面中只能出现一次,且必须位于页面顶部。
A. 正确
B. 错误
二、AI 编程任务:编写面向 AI 的提示词
场景:你需要为一个技术文档网站编写文章详情页的 HTML 结构。要求如下:
- 页面需包含全局页头(网站 Logo + 主导航)、页面主体、全局页脚。
- 主体部分使用
<main>包裹一篇<article>。 <article>内部包含:- 文章标题和元数据(作者、发布日期)放在
<header>中。 - 文章正文分为三个
<section>,每个<section>有一个<h3>标题。 - 文内插入一个
<aside>,显示“本文涉及的关键术语”列表。 - 文章末尾使用
<footer>显示版权声明和文章标签。
- 文章标题和元数据(作者、发布日期)放在
- 页面右侧使用全局
<aside>放置“相关文章推荐”列表(至少 3 篇)。 - 所有语义标签必须正确使用,不得滥用
<div>替代。
任务要求:请写出一段完整的中文提示词,发送给 AI,使其生成符合上述要求的完整 HTML 文档结构。提示词中应明确指定各语义标签的嵌套关系和内容要求。
三、面试真题与参考答案
题目(美团前端面试题):
请阐述 HTML5 中
<section>和<article>的区别,并说明各自的适用场景。如果页面中一个内容区块既有独立完整性,又是某个主题的分组,应如何选择?
参考答案:
1. 核心区别:
| 对比维度 | <section> |
<article> |
|---|---|---|
| 独立性 | 内容依赖上下文,脱离后意义可能不完整。 | 内容完全独立,可被单独聚合、分发、重用。 |
| 语义定位 | 文档或应用的主题性分组,通常需要标题。 | 独立的、完整的内容单元。 |
| 文档大纲 | 是文档大纲的一部分,帮助构建层级结构。 | 也是文档大纲的一部分,但其内部的标题层级可以重新开始(HTML5 大纲算法)。 |
| RSS 聚合 | 不适合被 RSS 阅读器单独抓取。 | 是 RSS 阅读器抓取的基本单元。 |
2. 适用场景举例:
<section>典型场景:- 将一篇长文分为“第一章”、“第二章”。
- 首页的“热门商品”、“最新资讯”功能区(各区内含多个
<article>)。 - 页脚的“联系我们”、“关于我们”栏目分组。
<article>典型场景:- 博客文章、新闻报道、论坛帖子。
- 评论列表中的每条评论。
- 产品列表中的每个独立产品卡片。
3. 模糊边界的处理原则:
当一个内容块既像一个独立单元(可被分享),又像是页面的一个主题分组(有标题和段落),应按“独立发布测试”决策:
- 若该内容块可以被完整地摘录到另一个页面、电子邮件或 RSS 中而不失其意义,则使用
<article>。 - 若摘录后显得突兀、不完整(如“第一章”脱离了整本书),则使用
<section>。
进阶讨论:在 HTML5 大纲算法中,<article> 内部可以重新开始 <h1> 层级。但鉴于主流浏览器和辅助工具对此支持不佳,实践中仍建议在整站范围内保持唯一的 <h1>,在 <article> 内使用 <h2> 开始。
课后练习答案
一、概念自测答案
B
- 解析:
<article>专门用于表示独立、可分发的内容单元,如博客文章。
- 解析:
C
- 解析:
<main>自动映射为role="main",是屏幕阅读器的重要地标。A 错,页面只能有一个可见<main>;B 错,<main>不能嵌套在分段内容中;D 错,<main>仅包含页面专有核心内容。
- 解析:
<aside>- 解析:
<aside>表示与周围内容间接相关的附属信息。
- 解析:
B(错误)
- 解析:
<header>可在页面中多次出现(如全局页头、文章页头),且不限于页面顶部。
- 解析:
二、AI 编程任务参考答案(提示词示例)
示例提示词:
“请使用 HTML5 语义标签生成一个技术文档网站的文章详情页完整结构。要求:
- 全局
<header>包含网站标题(如技术文档中心)和<nav>主导航(首页、文档、关于)。- 页面使用
<main>包裹核心内容。<main>内部为一篇<article>,包含:
<header>:文章标题<h2>、作者和发布日期的<p>。- 三个
<section>,每个带有<h3>标题和若干段落文本(可用占位文本)。- 一个
<aside>,包含一个“关键术语”列表(如 HTML、CSS、JavaScript)。<footer>:包含版权说明文字和文章标签链接。- 在
<main>外部、页面右侧,使用全局<aside>放置“相关文章推荐”列表(至少 3 个链接)。- 页面底部使用全局
<footer>包含版权信息和法律链接。- 代码需整洁,语义准确。请直接输出完整 HTML。”