必须用 而不是 定义表头,因其具有语义性,能被屏幕阅读器识别为标题,确保表格朗读时上下文正确;仅靠 css 样式无法替代该语义功能。

为什么必须用 <th> 而不是 <code><td> 定义表头
<p>因为 <code><th> 是语义标签,告诉浏览器和屏幕阅读器“这是标题”,不是视觉样式开关。仅靠 CSS 加粗居中 <code><td> 不会触发辅助技术的表头识别逻辑,表格朗读时会把标题当成普通数据读出来,顺序错乱、上下文丢失。
<p>常见错误现象:表格在 NVDA 或 VoiceOver 中逐单元格平铺朗读,不报“姓名:张三”,只读“张三”,用户无法理解哪列对应哪项数据。</p>
<ul><li><code><th> 默认加粗居中是浏览器样式,但语义才是核心;删掉 CSS 后语义依然有效
<li>行表头(如“上午”“下午”)也必须用 <code><th>,不能只在第一行用
<li>嵌套在 <code><thead> 里的 <code><th> 自动被推断为列标题,但复杂结构建议显式加 <code>scope
scope 属性怎么填才不白写
scope 属性怎么填才不白写scope 是明确表头作用范围的“说明书”,不写也能跑,但一到多级表头或行列混合标题就失效。它只有两个合法值:col 和 row,别写 column 或 all —— 浏览器直接忽略。
使用场景:
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 第一行
<th> 描述列 → <code>scope="col"(最常见) - 第一列
<th> 描述行(如时间表左栏)→ <code>scope="row" - 左上角单元格既管行又管列?不要强行
scope="row col",那是无效值;改用<colgroup></colgroup>+<col>或拆分表结构 - 用
display: block或float: left把<th> 拉出表格流 → 辅助技术可能跳过它 <li>用 <code>aria-hidden="true"或visibility: hidden隐藏表头 → 标题消失,整列数据失去上下文 - 把
<th> 套进 <code><div> 或 <code><span></span>→ 打断语义链,scope失效真正需要视觉降级(比如灰字小号)时,只调
color和font-size,保留原生<th> 结构和 display 类型。 容易被忽略的是:即使所有 <code><th> 都写对了,如果表格缺少 <code><thead> 区域、或者 <code><th> 散落在多个 <code><tr> 里没归组,某些旧版 JAWS 仍会降级处理为纯数据表。语义完整性不是单点正确,而是结构闭环。</tr>
错误示例:<th scope="colgroup">产品类别</th> —— 这个值不存在,等同于没写。










