必须仅包裹首次出现且带明确定义的术语本身,定义描述须紧邻,title 属性可提供完整定义;重复使用、包裹整句或仅作样式用途均错误。

dfn 必须包裹被定义的术语本身,不能只包解释
很多人写 <p>HTTP 是超文本传输协议</p>,然后给整个句子加 <dfn></dfn>,这是错的。浏览器和辅助技术会把“HTTP 是超文本传输协议”整体当成术语名,而不是只把 “HTTP” 当作被定义项。
正确做法是:术语词本身必须被 <dfn></dfn> 直接包裹,且定义性描述要紧邻出现——最好在同一段落内。
-
<p>一个 <dfn>URI</dfn> 是统一资源标识符,用于标识某一互联网资源。</p>✅ -
<p><dfn>HTTP</dfn> 是一种应用层协议。</p> <p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>✅ -
<p><dfn>HTTP 是一种应用层协议。</dfn></p>❌(整个句子被当术语) -
<p>HTTP</p> <p>超文本传输协议</p>❌(无包裹、无邻近、无语义关联)
dfn 第二次出现时不要再用,否则会误导辅助技术
<dfn></dfn> 的语义是「首次定义」,不是「强调术语」。重复标记会让屏幕阅读器误以为该术语又被重新定义了一次,破坏上下文连贯性。
比如在文档开头写了 <dfn>API</dfn>,后文再出现 “API 设计要考虑幂等性”,这里就该直接写 API,不加任何标签。
- 只在术语**第一次出现且带明确定义**时使用
<dfn></dfn> - 后续所有出现都用普通文本或配合
<abbr></abbr>(如果涉及缩写) - 若某术语在不同章节有不同含义,应分别定义,并用
id+aria-describedby显式绑定,而不是靠多次<dfn></dfn>
title 属性不是可选加分项,而是定义来源之一
HTML 规范明确支持三种方式提取被定义术语:title 属性值、子元素的 title、或 <dfn></dfn> 内部文本。其中 title 是最可控的方式——它能绕过文本内容歧义问题。
例如你想定义 “WAI” 为 “Web Accessibility Initiative”,但又不想让缩写出现在正文中,就可以:
<p><dfn title="Web Accessibility Initiative">WAI</dfn> 致力于改善网络可访问性。</p>
这样屏幕阅读器会读出 “WAI,即 Web Accessibility Initiative”,而视觉上仍保持简洁。
- 用
title可避免中英文混排时术语识别错误 - 不要同时设
title和内部文本,否则可能触发双重播报 -
title值应为完整定义,不是补充说明(比如不要写title="详见第3节")
别拿 dfn 当斜体样式用,CSS 才是干这事的
所有主流浏览器默认把 <dfn></dfn> 渲染成斜体,但这只是历史遗留行为,不是设计本意。靠这个实现视觉效果,等于把语义标签当样式钩子用,既不可靠也不可维护。
如果你只是想让某个词看起来像术语(比如教程里突出变量名),应该用 <em></em> 或 CSS:
code.var { font-style: italic; }
滥用 <dfn></dfn> 还会影响 SEO 和知识图谱提取——搜索引擎可能把错误标记的内容当作核心概念抓取,反而稀释真正关键的术语权重。
- 视觉需求 → 用
<em></em>或 CSS 类 - 语义需求 → 用
<dfn></dfn>,且确保有真实定义 - 缩写需求 → 用
<abbr title="..."></abbr>,不是<dfn></dfn>
真正难的不是怎么写 <dfn></dfn>,而是判断「这句话算不算一次有效定义」——它得让机器和人都能立刻确认:这个词是什么、为什么重要、在哪被首次确立。一旦定义松散或位置漂移,<dfn></dfn> 就从语义增强变成语义噪音。



















