html中不存在“子标题标签”,caption是表格唯一且必须的语义化标题容器,须作为table的第一个子元素;需通过caption内换行、figure/figcaption包裹或aria-labelledby关联等方式实现合规副信息展示。

HTML 中没有“子标题标签”这个概念,caption 是表格唯一的、语义化的标题容器,且一个 <table> 只能有一个 <code><caption></caption>。所谓“子标题”,在数据报表模块中实际是视觉分组或辅助说明需求,不能靠多个 <caption></caption> 实现(第二个会被浏览器忽略,W3C 验证报错)。
用 <caption></caption> 定义主标题(必须且唯一)
它描述整个表格的用途或上下文,比如“2024年华东区销售汇总”。必须作为 <table> 的第一个子元素,位置错误(如塞进 <code><thead> 或放在 <code><tbody> 后)会导致语义丢失、屏幕阅读器读不到。
<ul>
<li>正确写法:<code><table>
<caption>主标题文本</caption>
<thead>…</thead>
<tbody>…</tbody>
</table>
<h3></h3>、<div class="title"> 或 <code>title 属性代替,否则无障碍访问失效
caption-side: bottom 移至下方(仅支持 top/bottom)实现“子标题”效果的合规方式
当需要补充单位、时间范围、数据状态等信息时,应避免硬造“子标题”,改用语义清晰、可访问的组合方案:
- 在
<caption></caption>内用标点或换行分隔主副信息(如<caption>销售汇总<br><small>单位:万元|数据截至2024-06-30</small> </caption>),再用 CSS 控制样式 - 用
<thead> 中带 <code>scope="colgroup"的<th> 标注列组说明(例如跨多列的“线上渠道”“线下渠道”) <li>在表格上方或下方添加 <code><p></p>或<aside></aside>,并通过aria-labelledby关联到表格(如<table aria-labelledby="cap-main desc-extra">) <li>对复杂报表,用 <code><figure><figcaption></figcaption></figure>包裹整个<table>,此时 <code><figcaption></figcaption>可承担主副标题结构(<figcaption><strong>主标题</strong><small>副说明</small></figcaption>)避免常见错误
这些做法看似“加了子标题”,实则破坏结构和可访问性:
- 写两个
<caption></caption>—— 第二个被静默丢弃,验证失败 - 把
<caption></caption>塞进<thead> 或 <code><tr> 里 —— 浏览器不识别为标题,屏幕阅读器跳过 <li>用 <code>margin-top或position: absolute模拟位置 —— 布局不稳定,打印/导出时消失 - 给
<caption></caption>设固定width或float—— 脱离表格流,宽度计算异常 - 在 JS 导出逻辑中手动插入首行(如 SheetJS 的
aoa数组第一项) - 用
data-caption属性冗余存储标题文本(如<table data-caption="主标题|副说明">),供后端或脚本提取 <li>打印样式中显式启用:<code>@media print { caption { display: table-caption; } }(依赖打印机驱动支持)
导出与打印场景下的补充处理
<caption></caption>在浏览器渲染中有效,但多数 Excel 导出库、PDF 生成器不读取它。如需导出时保留标题: - 写两个











