1. 引言
在 HTML 中,列表是组织信息的常用方式。除了我们熟知的 <ul>(无序列表)和 <ol>(有序列表)之外,HTML 还提供了一个专门用于呈现术语及其定义的列表元素------<dl>(Description List,定义列表)。它不仅是简单的视觉排列,更承载了"术语-描述"的语义关系,对于提升网页的可访问性和 SEO 友好性至关重要。
本文将深入探讨 <dl> 元素的结构、语义、使用方法、CSS 样式技巧以及在实际开发中的最佳实践,帮助你彻底掌握这个强大而常被忽视的 HTML 元素。
2. <dl> 元素是什么?
<dl> 是 "Description List"(定义列表)的缩写。它是一个容器元素,用于创建一个术语及其对应描述 的关联列表。与 <ul>/<li> 不同,<dl> 的子元素不是单一的 <li>,而是由两种特定元素配对组成:
一个 <dt> 后面可以跟一个或多个 <dd>,清晰地表达了"一对多"的从属关系。
基本示例:
html
<dl>
<dt>HTML</dt>
<dd>超文本标记语言,用于创建网页结构。</dd>
<dt>CSS</dt>
<dd>层叠样式表,用于描述网页的表现和布局。</dd>
<dt>JavaScript</dt>
<dd>一种脚本语言,用于实现网页的交互行为。</dd>
</dl>
3. 核心结构:<dt> 与 <dd>
<dl> 的有效子元素只能是 <dt> 和 <dd>。它们必须按照一定的逻辑顺序嵌套在 <dl> 内部。
3.1 <dt> (Description Term)
- 作用:标记一个需要被解释或定义的术语、名称或标签。
- 使用规则 :
3.2 <dd> (Description Details)
- 作用 :提供与前面最近的
<dt>术语相关的描述、定义、解释或值。 - 使用规则 :
3.3 结构关系图
#mermaid-svg-Z5lxEXXZZFsLHReB{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Z5lxEXXZZFsLHReB .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Z5lxEXXZZFsLHReB .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Z5lxEXXZZFsLHReB .error-icon{fill:#552222;}#mermaid-svg-Z5lxEXXZZFsLHReB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Z5lxEXXZZFsLHReB .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Z5lxEXXZZFsLHReB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Z5lxEXXZZFsLHReB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Z5lxEXXZZFsLHReB .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Z5lxEXXZZFsLHReB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Z5lxEXXZZFsLHReB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Z5lxEXXZZFsLHReB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Z5lxEXXZZFsLHReB .marker.cross{stroke:#333333;}#mermaid-svg-Z5lxEXXZZFsLHReB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Z5lxEXXZZFsLHReB p{margin:0;}#mermaid-svg-Z5lxEXXZZFsLHReB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Z5lxEXXZZFsLHReB .cluster-label text{fill:#333;}#mermaid-svg-Z5lxEXXZZFsLHReB .cluster-label span{color:#333;}#mermaid-svg-Z5lxEXXZZFsLHReB .cluster-label span p{background-color:transparent;}#mermaid-svg-Z5lxEXXZZFsLHReB .label text,#mermaid-svg-Z5lxEXXZZFsLHReB span{fill:#333;color:#333;}#mermaid-svg-Z5lxEXXZZFsLHReB .node rect,#mermaid-svg-Z5lxEXXZZFsLHReB .node circle,#mermaid-svg-Z5lxEXXZZFsLHReB .node ellipse,#mermaid-svg-Z5lxEXXZZFsLHReB .node polygon,#mermaid-svg-Z5lxEXXZZFsLHReB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Z5lxEXXZZFsLHReB .rough-node .label text,#mermaid-svg-Z5lxEXXZZFsLHReB .node .label text,#mermaid-svg-Z5lxEXXZZFsLHReB .image-shape .label,#mermaid-svg-Z5lxEXXZZFsLHReB .icon-shape .label{text-anchor:middle;}#mermaid-svg-Z5lxEXXZZFsLHReB .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Z5lxEXXZZFsLHReB .rough-node .label,#mermaid-svg-Z5lxEXXZZFsLHReB .node .label,#mermaid-svg-Z5lxEXXZZFsLHReB .image-shape .label,#mermaid-svg-Z5lxEXXZZFsLHReB .icon-shape .label{text-align:center;}#mermaid-svg-Z5lxEXXZZFsLHReB .node.clickable{cursor:pointer;}#mermaid-svg-Z5lxEXXZZFsLHReB .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Z5lxEXXZZFsLHReB .arrowheadPath{fill:#333333;}#mermaid-svg-Z5lxEXXZZFsLHReB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Z5lxEXXZZFsLHReB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Z5lxEXXZZFsLHReB .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Z5lxEXXZZFsLHReB .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Z5lxEXXZZFsLHReB .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Z5lxEXXZZFsLHReB .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Z5lxEXXZZFsLHReB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Z5lxEXXZZFsLHReB .cluster text{fill:#333;}#mermaid-svg-Z5lxEXXZZFsLHReB .cluster span{color:#333;}#mermaid-svg-Z5lxEXXZZFsLHReB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Z5lxEXXZZFsLHReB .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Z5lxEXXZZFsLHReB rect.text{fill:none;stroke-width:0;}#mermaid-svg-Z5lxEXXZZFsLHReB .icon-shape,#mermaid-svg-Z5lxEXXZZFsLHReB .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Z5lxEXXZZFsLHReB .icon-shape p,#mermaid-svg-Z5lxEXXZZFsLHReB .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Z5lxEXXZZFsLHReB .icon-shape .label rect,#mermaid-svg-Z5lxEXXZZFsLHReB .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Z5lxEXXZZFsLHReB .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Z5lxEXXZZFsLHReB .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Z5lxEXXZZFsLHReB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
(术语 1)
(描述 1.1)
(描述 1.2)
(术语 2)
(描述 2.1)
4. 基本用法与示例
4.1 经典用例:词汇表
这是 <dl> 最直接的用途。
html
<dl>
<dt>语义化 HTML</dt>
<dd>使用恰当的 HTML 元素来传达内容的结构和含义,而不仅仅是表现样式。</dd>
<dt>ARIA</dt>
<dd>无障碍富互联网应用套件,一组用于改善残障人士可访问性的属性。</dd>
<dd>例如 `role`、[`aria-label`](https://xplanc.org/primers/document/zh/03.HTML/EX.HTML%20%E5%85%83%E7%B4%A0/EX.label.md) 等属性。</dd> <!-- 一个术语对应多个描述 -->
</dl>
4.2 展示元数据或键值对
非常适合展示产品参数、设置选项等。
html
<dl>
<dt>产品型号</dt>
<dd>X-Pro 2025</dd>
<dt>处理器</dt>
<dd>Intel Core i7-14700H</dd>
<dt>内存</dt>
<dd>32GB DDR5</dd>
<dt>颜色</dt>
<dd>深空灰</dd>
<dd>月光银</dd> <!-- 一个键对应多个值 -->
</dl>
4.3 问答 (FAQ) 列表
html
<h2>常见问题解答</h2>
<dl>
<dt>如何重置密码?</dt>
<dd>请访问登录页面,点击"忘记密码"链接,按照邮件指引操作。</dd>
<dt>服务支持哪些支付方式?</dt>
<dd>我们支持支付宝、微信支付、信用卡和 PayPal。</dd>
</dl>
5. 使用 CSS 美化 <dl>
默认情况下,浏览器通常将 <dd> 渲染为带有一定左外边距 (margin-left)。我们可以通过 CSS 实现更美观、灵活的布局。
5.1 水平布局(类似表格)
让术语和描述在同一行显示。
css
dl.horizontal {
display: grid;
grid-template-columns: max-content 1fr; /* 第一列适应内容,第二列占满剩余空间 */
gap: 1rem 2rem; /* 行间距 1rem,列间距 2rem */
}
dl.horizontal dt {
grid-column: 1; /* 术语放在第一列 */
font-weight: bold;
text-align: right; /* 右对齐更美观 */
}
dl.horizontal dd {
grid-column: 2; /* 描述放在第二列 */
margin: 0; /* 清除默认左边距 */
}
应用效果:
html
<dl class="horizontal">
<dt>姓名:</dt><dd>张三</dd>
<dt>邮箱:</dt><dd>zhangsan@example.com</dd>
<dt>职位:</dt><dd>前端开发工程师</dd>
</dl>
5.2 紧凑垂直布局
css
dl.compact dt {
font-weight: bold;
color: #2c3e50;
margin-top: 1em; /* 为每个术语组增加上间距 */
}
dl.compact dd {
margin-left: 1.5em; /* 控制描述缩进 */
color: #555;
line-height: 1.6;
}
6. 语义化优势与最佳实践
6.1 为什么使用 <dl> 而不是 <div> 或 <table>?
- 语义明确:清晰地向浏览器、屏幕阅读器和搜索引擎声明了"术语-描述"的关系。
- 提升可访问性:屏幕阅读器可以识别这种结构,并可能提供导航提示(如"术语列表")。
- SEO 友好:帮助搜索引擎更好地理解页面内容的组织结构。
- 代码简洁 :比用一堆
<div>嵌套更简洁,意图更清晰。
6.2 最佳实践
- 不要滥用:仅用于真正的术语-描述场景,不要仅仅为了视觉上的缩进而使用。
- 保持配对 :确保每个
<dt>至少有一个对应的<dd>。 - 样式重置 :记得在 CSS 中重置
<dd>的默认margin-left以适应你的设计。 - 结合 ARIA :在复杂的动态内容中,可以适当使用
aria-labelledby或aria-describedby来增强关联,但<dl>本身已具备良好的原生语义。
7. 总结
<dl> 元素是 HTML 语义化工具箱中一个专门且强大的工具。它完美地解决了"如何标记一组相关联的术语和解释"这个问题。通过正确使用 <dl>、<dt> 和 <dd>,你不仅能创建出结构清晰的列表,还能显著提升网站的可访问性和内容的结构化程度。
下次当你需要展示 FAQ、产品规格、词汇表或任何键值对信息时,请优先考虑使用定义列表 <dl>,让你的 HTML 代码更具语义和表现力。