前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库table caption aria-label 区别
HTML语义与文档

给表格加标题,用 <caption> 和 aria-label 有什么区别?

<caption> 是表格的可见标题,写在 <table> 里第一行,所有用户都能看到。aria-label 是隐藏标签,只有屏幕阅读器能读到,页面上不会显示。两个都能让辅助技术报读表格名称,但 <caption> 同时照顾了视觉用户,语义更完整。

前端进阶之旅 · 一题精讲更新于 2026.09.29
HTML#语义与文档#Web 可访问性
先看核心答案读代码示例
理解线索

表格说明的两种方式

  1. <caption>写在 <table> 里的可见标题,浏览器和辅助技术都能识别
  2. aria-label加在 <table> 标签上的隐藏标签,只对屏幕阅读器生效
  3. aria-labelledby指向页面上另一个元素的 id,把那个元素的文本当作表格名称

如果同时写了 <caption> 和 aria-label,后者会覆盖前者作为表格的可访问名称;可见标题与读屏名称可能不一致。

核心回答

先记住这个答案

<caption> 写在 <table> 标签内部的第一行,渲染出来就是一段可见文字,视觉用户和屏幕阅读器都能拿到。aria-label 写在 <table> 标签上,页面上不显示任何内容,只有屏幕阅读器读到这张表格时才会报读。想让所有人都知道这张表是什么意思,用 <caption>;设计稿不允许出现可见标题时,再退而用 aria-label。

  • <caption> 在页面上可见,语义和可访问性都有
  • aria-label 只面向辅助技术,页面上看不到
  • 优先用可见的 <caption>
  • <caption> 是表格的首个子元素

实际写法对比

在一个展示季度销售额的表格上,两种写法看起来差不多,但浏览器处理方式完全不同。

<caption> 写法和 aria-label 写法HTML
<!-- 方式一:caption,页面上会显示"2024 年各季度销售额" -->
<table>
  <caption>2024 年各季度销售额</caption>
  <tr>
    <th scope="col">季度</th>
    <th scope="col">销售额</th>
  </tr>
  <tr>
    <td>Q1</td>
    <td>320 万</td>
  </tr>
</table>

<!-- 方式二:aria-label,页面上看不到标题文字 -->
<table aria-label="2024 年各季度销售额">
  <tr>
    <th scope="col">季度</th>
    <th scope="col">销售额</th>
  </tr>
</table>

第一种写法中,<caption> 会成为表格的可访问名称,同时页面上方也能看到标题。第二种写法同样能提供可访问名称,但页面上没有标题文字;具体怎样报读名称与行列数,取决于读屏器。

什么时候用哪个

大多数场景下优先选 <caption>,因为它同时服务两类用户。后台管理系统里一页摆了好几张表格,每张表上方有个 <caption> 写清楚"用户列表""订单记录",视觉用户一扫就知道哪张是哪张。

如果 UI 设计已经在表格上方放了一个 <h3> 标题,再加 <caption> 会多出来一行重复文字。这时可以用 aria-labelledby 指向那个 <h3> 的 id,这样既不重复又保留了语义。aria-label 一般是最后的选择,只在周围确实没有可指向的可见元素时使用。

aria-labelledby 指向外部标题HTML
<h3 id="user-heading">活跃用户</h3>
<table aria-labelledby="user-heading">
  <tr>
    <th scope="col">姓名</th>
    <th scope="col">最后登录</th>
  </tr>
</table>

这样屏幕阅读器进入表格时会读出"活跃用户",和可见的 <h3> 内容一致。

回答前,多想一步

容易答错的地方

同时写 <caption> 和 aria-label
如果两个都写,aria-label 会覆盖 <caption> 作为表格的可访问名称,但 <caption> 仍然是可见内容。视觉用户看到的标题与辅助技术读到的名称可能不一样,反而制造了混乱。选一个就好。
把 <caption> 放在 <table> 中间
<caption> 必须是 <table> 的第一个子元素。放在 <tr> 后面,浏览器虽然大概率还是能渲染出来,但 HTML 校验器会报错,辅助技术的行为也不可预测。
试着用自己的话回答

面试官还会怎么问?

<caption> 的样式怎么调?

<caption> 默认以表格标题盒显示,能用 CSS 设置字体、颜色、对齐。caption-side: bottom 可以把它挪到表格下方显示,但不影响 DOM 顺序;具体报读顺序仍应在目标读屏环境里确认。

如果 <caption> 的文字太长,有没有替代方案?

可以在 <caption> 里只写一句简短的标题,详细说明放在 <caption> 外面用普通段落写。或者用 aria-describedby 指向一段额外描述,让屏幕阅读器在报读完标题后再报读补充信息。

不加任何标题,屏幕阅读器会怎么处理表格?

屏幕阅读器会直接报读"表格,X 行 Y 列",然后跳到第一个单元格。用户只知道页面上有一张表,但不知道这张表是干什么的,如果页面上有多张表就很难区分。

从一道题,走向一组知识

把知识连起来

语义与文档

表格里的 th 和 scope 怎样帮读屏找到表头?

scope 解决的是表头和数据单元格的对应关系,和 <caption> 一起构成完整的表格无障碍标记。

语义与文档

表格有多层表头时,td 的 headers 该怎么写?

复杂表格需要 id 加 headers 手动关联,<caption> 只管表格整体标题,不管单元格对应哪个表头。

参考资料

  • HTML:语义与文档参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 实际写法对比
  3. 什么时候用哪个
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑