hgroup 标题组
<hgroup> 元素用于将一个标题(h1-h6)与其相关的副标题、标语或宣传语组合在一起。它告诉浏览器和辅助技术这些标题是作为一个整体单元存在的,副标题不应该被纳入文档大纲。
前置知识
阅读本节前,建议先了解:footer 页脚
基础概念
什么是 hgroup
<hgroup> 是 HTML5 引入后被废弃又在 HTML5.2 中恢复的元素。它的作用是将主标题和副标题/标语组合在一起,使辅助技术能够正确理解标题层级关系。
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>hgroup 示例</title>
</head>
<body>
<header>
<!-- hgroup 将主标题和副标题组合 -->
<hgroup>
<h1>HTML5 语义化教程</h1>
<p>从入门到精通的完整指南</p>
</hgroup>
</header>
</body>
</html>hgroup 的历史
| 版本 | 状态 | 说明 |
|---|---|---|
| HTML5.0 | 引入 | 用于组合标题,影响文档大纲 |
| HTML5.1 | 废弃 | 因大纲算法未被实现而废弃 |
| HTML5.2 | 恢复 | 重新定义语义,不再影响大纲算法 |
| HTML Living Standard | 保留 | 当前规范中的有效元素 |
hgroup 的作用
<hgroup> 的核心作用是排除副标题对文档大纲的影响。没有 hgroup 时,副标题(即使不是标题元素)可能会被某些工具误解为独立的标题层级。
html
<!-- 没有 hgroup:副标题可能干扰标题层级 -->
<header>
<h1>文章标题</h1>
<p>这是一篇副标题</p> <!-- 可能被某些工具误读 -->
</header>
<!-- 有 hgroup:副标题明确属于主标题 -->
<header>
<hgroup>
<h1>文章标题</h1>
<p>这是一篇副标题</p> <!-- 明确是主标题的附属 -->
</hgroup>
</header>语法与使用
基本语法
html
<hgroup>
<h1>主标题</h1>
<p>副标题或标语</p>
</hgroup>hgroup 的内容规则
<hgroup> 的第一个子元素必须是 h1-h6 级别的标题元素,后续的子元素可以是:
<h2>-<h6>标题元素<p>元素(作为副标题/标语)
html
<!-- 模式 1:主标题 + p 副标题(最常见) -->
<hgroup>
<h1>主标题</h1>
<p>副标题描述</p>
</hgroup>
<!-- 模式 2:主标题 + h2 副标题 -->
<hgroup>
<h1>主标题</h1>
<h2>副标题</h2>
</hgroup>
<!-- 模式 3:多个标题 -->
<hgroup>
<h1>主标题</h1>
<h2>二级副标题</h2>
<h3>三级副标题</h3>
</hgroup>hgroup 的可访问性效果
<hgroup> 对辅助技术的影响:
| 元素 | 不使用 hgroup | 使用 hgroup |
|---|---|---|
| h1 | 大纲:h1 | 大纲:h1 |
| h2(副标题) | 大纲:增加一个 h2 条目 | 大纲:不增加条目 |
| p(副标题) | 可能被忽略或误读 | 作为 h1 的描述文本 |
详细说明
hgroup 的正确使用场景
1. 文章标题 + 副标题
html
<article>
<header>
<hgroup>
<h1>Web 性能优化实践</h1>
<p>从加载速度到运行时效率的全面优化策略</p>
</hgroup>
<p>作者:<address>张三</address> · <time datetime="2024-01-15">2024-01-15</time></p>
</header>
<p>正文内容...</p>
</article>2. 网站品牌 + 标语
html
<header>
<hgroup>
<h1>TechBlog</h1>
<p>分享前端技术,探索 Web 未来</p>
</hgroup>
</header>3. 章节标题 + 说明
html
<section>
<hgroup>
<h2>性能指标</h2>
<p>理解 Core Web Vitals 的三个核心指标</p>
</hgroup>
<p>详细内容...</p>
</section>4. 书籍/报告标题
html
<article>
<header>
<hgroup>
<h1>2024 前端技术趋势报告</h1>
<h2>年度行业分析与预测</h2>
<p>由 TechResearch 团队出品</p>
</hgroup>
</header>
</article>hgroup 不适用的场景
html
<!-- 错误:hgroup 内只有一个标题 -->
<hgroup>
<h1>标题</h1>
</hgroup>
<!-- 应该直接使用 h1 -->
<h1>标题</h1>
<!-- 错误:第一个子元素不是标题 -->
<hgroup>
<p>描述文字</p>
<h1>标题</h1>
</hgroup>
<!-- hgroup 的第一个子元素必须是 h1-h6 -->
<!-- 错误:内容不是标题/副标题关系 -->
<hgroup>
<h1>标题</h1>
<p>正文段落内容</p>
</hgroup>实战示例
完整的 hgroup 使用示例
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>hgroup 完整示例</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, sans-serif; color: #333; }
/* 网站头部 */
.site-header {
background: linear-gradient(135deg, #1e3a5f 0%, #2d5f8a 100%);
color: #fff; padding: 3rem 2rem 2rem; text-align: center;
}
/* hgroup 样式 */
.site-header hgroup h1 {
font-size: 2.5rem; font-weight: 700; margin-bottom: 0.5rem;
}
.site-header hgroup p {
font-size: 1.1rem; opacity: 0.85; font-weight: 300;
}
main { max-width: 800px; margin: 2rem auto; padding: 0 2rem; }
/* 文章卡片 */
.article-card {
background: #fff; padding: 2rem; border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.08); margin-bottom: 2rem;
}
/* 文章 hgroup */
.article-card header hgroup h2 {
font-size: 1.5rem; margin-bottom: 0.25rem; color: #1e293b;
}
.article-card header hgroup p {
font-size: 0.95rem; color: #64748b; font-style: italic;
}
.article-meta {
color: #94a3b8; font-size: 0.8rem; margin-top: 0.75rem;
}
.article-card p { line-height: 1.7; color: #475569; }
/* 章节 hgroup */
.content-section {
margin: 2rem 0; padding: 1.5rem;
background: #f8fafc; border-radius: 8px;
}
.content-section hgroup h3 {
font-size: 1.2rem; color: #1e293b; margin-bottom: 0.25rem;
}
.content-section hgroup p {
font-size: 0.85rem; color: #64748b; margin-bottom: 1rem;
}
.site-footer {
background: #1e293b; color: #94a3b8;
text-align: center; padding: 1rem; margin-top: 2rem;
}
</style>
</head>
<body>
<!-- 网站 header + hgroup -->
<header class="site-header">
<hgroup>
<h1>Frontend Weekly</h1>
<p>每周精选前端技术文章与教程</p>
</hgroup>
<nav aria-label="主导航" style="margin-top: 1.5rem;">
<a href="/" style="color:#fff;text-decoration:none;margin:0 1rem;">首页</a>
<a href="/articles" style="color:rgba(255,255,255,0.8);text-decoration:none;margin:0 1rem;">文章</a>
<a href="/about" style="color:rgba(255,255,255,0.8);text-decoration:none;margin:0 1rem;">关于</a>
</nav>
</header>
<main>
<!-- 文章 1 -->
<article class="article-card">
<header>
<hgroup>
<h2>深入理解 JavaScript 事件循环</h2>
<p>从宏任务到微任务,彻底搞懂异步执行机制</p>
</hgroup>
<p class="article-meta">
作者:<address style="font-style:normal">张三</address>
· <time datetime="2024-01-20">2024 年 1 月 20 日</time>
· 12 分钟阅读
</p>
</header>
<p>事件循环(Event Loop)是 JavaScript 实现异步的核心机制。理解事件循环对于编写高效的非阻塞代码至关重要。</p>
<section class="content-section">
<hgroup>
<h3>宏任务与微任务</h3>
<p>理解任务队列的两种类型</p>
</hgroup>
<p>JavaScript 中的异步任务分为宏任务(macro task)和微任务(micro task)两种类型。</p>
</section>
<section class="content-section">
<hgroup>
<h3>执行顺序</h3>
<p>事件循环的完整执行流程</p>
</hgroup>
<p>事件循环的执行顺序是:同步代码 -> 微任务队列 -> 宏任务队列。</p>
</section>
</article>
<!-- 文章 2 -->
<article class="article-card">
<header>
<hgroup>
<h2>CSS Container Queries 实战指南</h2>
<p>基于容器而非视口的响应式设计新方案</p>
</hgroup>
<p class="article-meta">
作者:<address style="font-style:normal">李四</address>
· <time datetime="2024-01-18">2024 年 1 月 18 日</time>
· 10 分钟阅读
</p>
</header>
<p>Container Queries 是 CSS 中备受期待的新特性,它允许组件根据其容器的尺寸而非视口大小来调整样式。</p>
</article>
</main>
<footer class="site-footer">
<p>© 2024 Frontend Weekly. All rights reserved.</p>
</footer>
</body>
</html>注意事项
常见错误
- hgroup 只有一个子元素:hgroup 至少需要两个子元素才有意义
- 第一个子元素不是标题:hgroup 的第一个子元素必须是 h1-h6
- 用 hgroup 包裹非标题内容:hgroup 只用于标题组合
html
<!-- 错误 -->
<hgroup>
<h1>标题</h1>
<p>很长的正文段落...</p> <!-- 不是副标题 -->
</hgroup>
<!-- 正确 -->
<hgroup>
<h1>标题</h1>
<p>简短的副标题</p> <!-- 简短描述 -->
</hgroup>最佳实践
- 副标题保持简短:hgroup 中的副标题应简洁明了,通常一行以内
- 使用 CSS 区分标题层级:通过字体大小、颜色等视觉手段区分主标题和副标题
- 仅在需要时使用:如果有明确的标题+副标题关系才使用 hgroup
- 配合 header 使用:hgroup 通常出现在 header 元素内
下一节
继续学习:address 联系信息