role="term" 是 wai-aria 1.2 中专用于标记术语的静态语义角色,必须紧邻配对 role="definition" 使用,仅适用于无法使用原生 结构的场景,否则应优先采用语义化 html。

role="term" 是什么,什么时候该用
role="term 是 WAI-ARIA 1.2 规范中定义的**静态语义角色**,专用于标记术语(glossary term),必须与 role="definition" 配对使用,构成术语-释义关系。它不是给任意文字加的“高亮标签”,而是为屏幕阅读器建立可导航、可关联的语义链。
常见误用是把它当作文本样式开关或 SEO 增强手段——role="term" 不影响渲染,不提升搜索排名,也不触发任何行为。它的唯一作用是告诉辅助技术:“这段文本是一个术语,后面紧跟着它的定义”。
- 只适用于明确成对出现的术语与释义结构,比如词典、API 文档、技术白皮书中的术语表
- 不能单独存在:
role="term"元素后必须紧跟一个role="definition"元素(可跨<dt>/</dt> <dd></dd>或<p></p>,但 DOM 顺序必须紧邻) - 原生 HTML 已有更优解:语义化
<dl> <dt></dt> <dd></dd> </dl>结构默认隐式携带role="term"和role="definition",无需手动添加 - 若因框架限制只能输出
<div>,才需显式补 <code>role="term",且必须确保其后第一个非空元素是role="definition"为什么加了 role="term" 屏幕阅读器还是没反应
因为
role="term"是**纯声明性角色**,不自带交互逻辑或朗读增强。它依赖辅助技术主动识别术语-定义对,并提供跳转指令(如 JAWS 的 “T” 键跳术语)。但多数读屏默认不播报“这是术语”,只在用户主动导航时暴露关系。典型失效场景:
- 前后元素被
display: none或aria-hidden="true"隔开 → 定义不可达,语义链断裂 - 中间插入了其他非空元素(如
<p>Note:</p>)→ 破坏“紧邻”要求,AT 无法关联 - 用了
role="term"却没配role="definition"→ 辅助技术忽略该role,当作普通文本处理 - 在
<dt></dt>上额外写role="term"→ 冗余,且某些旧版 NVDA 可能覆盖原生语义导致跳转失败
替代方案:优先用原生
- 而不是 role
除非你完全无法控制输出 HTML 结构(例如 CMS 模板锁定为
<div class="term">),否则直接用 <code><dl></dl>是最稳选择。浏览器和主流读屏对<dt></dt>/<dd></dd>的隐式角色支持远好于手动role。正确写法示例:
使用HTML,CSS,JavaScript开发Android应用程序 英文文字pdf版附源文件下载如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- Web Accessibility Initiative (WAI)
- A part of W3C focused on accessibility guidelines and standards.
错误写法示例:
<div role="term">WAI</div> <p>—</p> <div role="definition">W3C’s accessibility arm.</div>
中间的
<p>—</p>破坏了紧邻性,且<p></p>不是空元素,AT 会跳过定义。容易被忽略的细节:role="term" 不等于
<dfn></dfn>是 HTML 原生标签,表示“被定义的术语”,语义重点在**首次出现的定义上下文**,而非术语表中的条目。它不强制要求后跟释义,也不建立可导航的术语-定义对。所以:
- 写技术文档首段时用
<dfn>ARIA</dfn> is a set of attributes…—— 正确 - 做术语索引页时用
<dfn>ARIA</dfn><span>Accessible Rich Internet Applications</span>—— 错误,应改用<dl></dl>或role="term"/"definition"显式配对 - 混用
<dfn role="term"></dfn>—— 冗余且风险高,<dfn></dfn>已有隐式语义,覆盖可能干扰解析
真正需要
role="term"的时刻极少,绝大多数情况,删掉它,换成<dl></dl>就解决了。 - 前后元素被










