dt标签必须是名词性短语,不能是句子或操作控件;其作用是声明核心术语,如“src”“fetch()”,而非“请设置src属性”或“点击调用fetch”。

怎样定义术语名称部分:DT 标签必须是名词性短语,不能是句子或操作控件
dt 标签的作用不是“加粗标题”,而是向浏览器和屏幕阅读器声明:“这个词是接下来要解释的核心术语”。它必须是一个简洁、独立的名词性短语,比如 src、fetch()、viewport,而不是 “请设置 src 属性” 或 “点击此处调用 fetch”。
常见错误现象:
- 在
dt里塞<button></button>或<a></a>—— 语义冲突,辅助技术会读作“term: 按钮”,完全失真 - 写成
<dt>如何使用 localStorage?</dt>—— 这是问题,不是术语;应改为<dt>localStorage</dt> - 把整段说明文字放进
dt——dt不承担解释职责,那是dd的事
实操建议:
- 多个同义术语可共用一个
dd,例如连续写两个dt:<dt>data-src</dt> <dt>srcset</dt> <dd>用于响应式图像加载的属性……</dd> - 若术语本身是代码,直接用
<dt><code>querySelectorAll(),无需额外包裹dfn(除非你正在首次定义它) -
dt不支持嵌套h1–h6,规范禁止;如果设计稿要求视觉层级,用 CSS 控制字体大小/权重即可
DT 和 DFN 的关系:同一术语在不同场景下用不同标签
很多人混淆 dt 和 dfn,其实它们解决的是两类问题:dt 是定义列表里的“条目名”,dfn 是文档中“某处正在定义该词”。同一个词,在词汇表里用 dt,在正文首段引入时用 dfn。
例如 API 文档中:
- 词汇表章节:
<dt><code>body- 请求体,通常为 JSON 或表单数据……
- 正文介绍:
<p>发送请求时,<dfn><code>body字段承载实际传输的数据。
关键区别:
-
dfn必须紧邻完整定义句,且只能出现在p、section、dt等合法块级上下文中;dt本身就可以是那个上下文 -
dfn支持title属性(用于缩写展开),dt不需要也不推荐加title - 一个页面可以有多个
dt叫method(分别在不同 API 小节),但dfn应只在首次出现时标记一次
DT 内容被截断或错位?检查 CSS 重置是否覆盖了默认行为
浏览器对 dt 默认不设 margin/padding,但所有主流浏览器都会给 dd 加约 40px 左侧缩进。如果没做样式干预,多行 dd 容易与 dt 错行,看起来像“术语消失了”。这不是 HTML 写错了,是视觉反馈断层。
最简修复方式(推荐用 CSS Grid):
dl {
display: grid;
grid-template-columns: max-content 1fr;
gap: 0.25em 1em;
}
dt {
font-weight: 600;
margin-bottom: 0.25em;
}
dd {
margin: 0;
grid-column: 2;
}
注意点:
- 别用
float或inline-block模拟两栏——dt换行后dd极易错列 -
grid-column: 2是关键,它强制每个dd都落在第二列,不依赖dt的宽度 - 如果
dt内容过长(如带路径的参数/api/v2/users/:id),用white-space: nowrap; overflow: hidden; text-overflow: ellipsis;控制,别让它撑开整列
为什么 DT 不能单独存在?HTML 验证失败只是表象,语义断裂才是核心问题
dt 在规范中不是独立语义单元,它必须与 dd 构成“术语-解释”配对。即使你暂时只写了 <dt>cache</dt>,没有紧跟 dd,HTML 验证器会报错,但更严重的是:屏幕阅读器不会播报这个词,搜索引擎不会把它识别为可索引术语,无障碍树里它就是个孤儿节点。
容易被忽略的地方:
- 不要为了“先占位再补内容”而留空
dd——<dd></dd>仍算有效,但语义为空,不如先删掉整个dt - 嵌套
dl时,内层dt的父容器必须是dd(合法),不能是另一个dt(非法) - 服务端渲染或 CMS 输出中,若
dd因条件未满足被跳过,务必同步跳过对应dt,否则结构崩坏











