dl标签专为术语与解释的语义配对设计,适用于API参数、错误码、商品规格等名词性术语加说明的场景,禁用作普通列表、两栏布局或问答页面,否则损害可访问性与SEO。
dl 的语义是“定义列表”(definition list),不是 ul 或 ol 那种通用列表。它专为术语 + 解释的配对结构设计,比如词典条目、API 参数说明、配置项文档。用错语义会导致屏幕阅读器误读、SEO 降权,也影响后续用 CSS 精确控制样式。
常见错误是把 dl 当成“多列布局工具”,硬塞多个 dt 不带 dd,或者把 dd 套在 div 里再塞一堆段落——这会破坏嵌套规则,浏览器可能自动补全或忽略部分标签。
dt(definition term)必须直接包含术语本身,dd(definition description)紧跟其后,解释该术语。一个 dt 可以对应多个 dd(比如同义词或不同角度的解释),但一个 dd 不能跨多个 dt。
dt 和 dd 必须都作为 dl 的直接子元素,不能用 div 包裹dt 连续出现是合法的(如多个同义术语共用一个解释),但后面必须跟至少一个 dd
dd 的容忍度低:Chrome 会把后续 dt 当作新条目,Firefox 可能丢弃无配对的 dt
正确示例:
立即学习“前端免费学习笔记(深入)”;
<dl> <dt>HTTP</dt> <dd>超文本传输协议,用于客户端与服务端通信</dd> <dt>HTTPS</dt> <dd>HTTP 的安全版本,基于 TLS 加密</dd></dl>
dl 默认没有 margin,但 dd 有左缩进(通常 40px),dt 是 inline-level 行内表现。想实现紧凑排版(如参数表格)、横向术语卡、或响应式双栏,得主动重置。
dd 缩进:dd { margin-left: 0; }
dt 换行并加粗:dt { display: block; font-weight: bold; }
dt, dd { display: inline-block; vertical-align: top; },但必须确保屏幕阅读器仍能按逻辑顺序读出float 或 flex 把 dt 和 dd 拆到不同容器里——这会割裂语义关系嵌套 dl 是合法的(比如某个术语的解释里又含子术语),但实际中容易失控。静态站点生成器(如 Docsify、Docusaurus)或 Markdown 转 HTML 工具常把缩进解析成嵌套 dl,结果渲染出多层缩进,视觉混乱且难以用 CSS 统一控制。
dl + 语义清晰的 dd 内容组织,而非靠嵌套表达层级dl 加 class(如 dl-nested),再单独写 CSS 限制缩进深度真正难的不是写对标签,而是判断某个内容结构到底适不适合用 dl——术语和解释之间有没有明确的“定义关系”,而不是仅仅因为看起来像两栏就硬套。