aria-details 已被 w3c 废弃,所有主流浏览器和读屏器均不支持,加了也无效;应改用 aria-describedby 关联真实存在的 dom 节点,并确保其未被隐藏且位于可访问树中。

aria-details 不能关联详细说明——它已被 W3C 明确废弃,所有主流浏览器(Chrome、Firefox、Safari、Edge)和读屏器(NVDA、VoiceOver、JAWS)均不支持该属性,加了也无效。
你写 aria-details="desc-id",DOM 里能看到,但屏幕阅读器不会朗读,开发者工具查不到任何行为反馈,CSS 也无法据此选中元素。它不是“没做好”,而是根本没被实现。
为什么 aria-details 不该用在表格或任何地方
- W3C 规范已将其标记为 deprecated(废弃),不推荐、不维护、不保证兼容
- 没有浏览器引擎解析该属性的语义或触发朗读逻辑
- 它与
aria-describedby的设计目标重叠,但后者已被广泛支持且稳定
正确做法:用 aria-describedby 指向真实存在的节点
aria-describedby 是当前唯一可靠、可验证、被全部主流 AT 支持的关联方式,前提是:
- 目标元素(如
<p id="desc-age">...</p>)必须在 DOM 中真实存在,且加载完成时就位 - 不能被
aria-hidden="true"的父容器包裹(继承屏蔽) - 不要使用
display: none或visibility: hidden隐藏——可用position: absolute; left: -9999px视觉隐藏但保留可访问性 - 多个 ID 用空格分隔:
aria-describedby="desc-age desc-unit",但朗读顺序取决于 DOM 中节点出现顺序,不是书写顺序
示例:
<p id="desc-age">年龄字段表示用户注册时填写的周岁,不含小数</p> <td aria-describedby="desc-age">28</td>
表格场景下更自然的替代方案
比起硬塞描述文本,优先用原生语义降低理解门槛:
- 整表说明写在
<caption></caption>里,例如:<caption>2024 年用户注册信息统计(含字段定义说明)</caption> - 列标题用
<th scope="col">,必要时内嵌简短说明:<code><th scope="col">年龄 <small aria-hidden="true">(周岁)</small> </th>,再配aria-label="年龄(周岁)"确保读全 - 对整列通用说明,可用
<div role="note"> 区域统一指向,而非逐单元格重复绑定 <hr> <p>真正容易被忽略的是 DOM 顺序和可访问树完整性:动态插入的描述节点,必须确保插入后立即存在于可访问树中;若用 JS 渲染,别等 <code>DOMContentLoaded之后才挂 ID,否则旧版 JAWS 可能只缓存初始状态。











