dt 和 dd 必须作为 dl 的直接子元素并列存在,不可嵌套或脱离 dl 使用,否则导致语义断裂、无障碍失效及 CSS 失效;一个 dt 可对应多个 dd,嵌套 dl 仅允许出现在 dd 内,且 dt 应为名词性短语。

直接说结论:dt 和 dd 必须作为 dl 的直接子元素并列存在,不能嵌套、不能脱离 dl 单独使用,否则语义断裂、无障碍失效、CSS 选择器失灵。
dt 和 dd 必须同为 dl 的直接子元素
这是 HTML 规范强制要求的结构层级。常见错误是把 dd 塞进 dt 里,或者把 dt 放在 div 中再塞进 dl —— 这两种写法浏览器会尝试“修复”,但实际解析结果不可控,屏幕阅读器可能跳过整个条目。
-
dl是唯一合法父容器,dt和dd只能出现在它里面,且必须是它的第一层子元素 - 写成
<dt>API</dt><dd>Application Programming Interface</dd>是合法的;写成<dt>API<dd>Application Programming Interface</dd></dt>是非法的 - 验证工具(如 W3C Validator)会报错:「Element dd not allowed as child of element dt」
一个 dt 后面可以跟多个 dd,但不能合并成一个
多角度解释同一术语时,每个逻辑段落应独立成 dd,而不是用 p 或换行符硬塞进一个 dd 里。这不只是为了样式,更是为了让辅助技术逐条朗读、让 JS 能按需操作某条解释。
- 正确:
<dt>HTTP</dt><dd>应用层协议</dd><dd>默认端口为 80</dd><dd>基于请求-响应模型</dd> - 错误:
<dd>应用层协议,默认端口为 80,基于请求-响应模型</dd>—— 所有信息挤在一起,无法被结构化提取 - 搜索引擎和知识图谱更倾向从多个
dd中抽取字段,单个dd内容越长,语义粒度越粗
dd 默认 margin 不可靠,别依赖它做布局对齐
浏览器给 dd 加的 margin-top: 0.61em 看似能实现缩进效果,但它不是语义换行,也不保证多行文本对齐。一旦用了 CSS reset 或 modern layout(如 Flex/Grid),这个 margin 很容易失效或干扰布局。
立即学习“前端免费学习笔记(深入)”;
- 清除默认样式后,
dd会紧贴dt显示,甚至重叠 - 用
display: grid是最稳的方案:dl { display: grid; grid-template-columns: max-content 1fr; }+dd { grid-column: 2; } - 避免用
margin-left模拟缩进:不同字体、字号下缩进像素值不一致,响应式场景易错位 - 若用 Flex 布局包裹
dl,dd的 margin 不参与 flex 分布,容易造成意外间距
嵌套 dl 只允许出现在 dd 内部
想表达“参数下的子参数”这类层级关系(比如 headers 对象包含 Content-Type 和 Authorization),唯一合规方式是在某个 dd 里再写一个完整的 dl。dt 或外部直接嵌套都违反规范。
- 合法:
<dd><dl><dt>Content-Type</dt><dd>application/json</dd></dl></dd> - 非法:
<dt><dl><dt>...</dt></dl></dt>或<dl><dl></dl></dl> - 嵌套超过两层会让键盘导航路径变长,屏幕阅读器进入/退出成本升高,视觉上也容易混淆归属
- Vue/React 中动态渲染嵌套定义列表时,要确保每层
dl都有明确的key,避免因 key 复用导致 DOM 错乱
真正容易被忽略的是:即使结构完全合法,如果 dt 里塞了按钮、链接或长句,语义就崩了——dt 应该只是名词性短语,它被屏幕阅读器读作 “term: xxx”,不是标题也不是操作入口。



















