dfn标签必须作为dt的直接子元素出现,仅用于标记术语首次定义,不可置于dd中或单独使用;缩写术语应通过title属性提供全称,非缩写则无需title;整个dl结构不自动构成首次定义场景,需依全文上下文判断;禁止嵌套格式化标签或冗余aria属性。

标签在<dl></dl>结构里不是必须的,但用对了能强化语义——它只该出现在<dt></dt>中,且仅用于标记术语首次被定义的那个词本身。
dfn 必须放在 dt 里,不能塞进 dd 或单独挂靠
不是装饰性标签,它的作用是锚定“哪个词正在被定义”。在定义列表中,这个角色天然由<dt></dt>承担,所以应作为<dt></dt>的直接子元素出现,而不是写在<dd></dd>里解释句中,更不能脱离<dt></dt>单独存在。
- ✅ 正确:
<dt><dfn>DOM</dfn></dt> <dd>文档对象模型……</dd> - ❌ 错误:
<dt>DOM</dt> <dd> <dfn>文档对象模型</dfn>……</dd>(把解释当术语,语义错位) - ❌ 错误:
<dt><dfn>DOM</dfn></dt> <dd> <dfn>DOM</dfn> 是……</dd>(重复套用,破坏首次定义逻辑)
配合 title 属性明确术语本体,尤其适合缩写
当术语是缩写时,的title属性应填写全称,让辅助技术与知识抽取工具准确识别“被定义的是什么”。可见文本保留缩写,符合阅读习惯。
- ✅ 推荐:
<dt><dfn title="Document Object Model">DOM</dfn></dt> - ❌ 反向:
<dfn title="DOM">Document Object Model</dfn>(定义对象变成字符串"DOM",语义失效) - ⚠️ 注意:如果术语不含缩写(如
flexbox、viewport),可不加title,直接写<dfn>flexbox</dfn>
整个定义列表是否算“首次定义场景”?看上下文
<dl></dl>常用于集中罗列术语,但它本身不自动构成“首次定义”的语义环境。是否该加,取决于这个词在整篇文档中是不是第一次出现并给出解释。
- 若该术语此前未出现过,
<dt><dfn>...</dfn></dt>合理; - 若前文已定义过(比如在导言段落里提过
HTTP并解释了),此处只是汇总,就该省略; - 术语表页面本身作为首次定义场景,全量使用是恰当的。
避免嵌套或跨结构绑定,保持结构干净
在<dl></dl>里不需要额外用aria-describedby关联<dd></dd>——因为<dt></dt>和<dd></dd>的父子关系本身就是规范认可的定义绑定方式。强行加id和aria-describedby反而冗余,还可能因目标不可访问而失效。
- ✅ 简洁写法:
<dt id="http"><dfn>HTTP</dfn></dt> <dd>超文本传输协议……</dd> - ❌ 不必要:
<dt><dfn aria-describedby="http-def">HTTP</dfn></dt> <dd id="http-def">……</dd> - ⚠️ 切忌:
<dt><dfn><code>fetch()中再嵌<em></em>或<strong></strong>——只包裹术语,不负责强调或格式











