一个视觉示例。
让我们来看一个内容示例

从语义上讲,思考此内容的一种方式是将其分成两个相关的部分。一个部分称为“跟踪您的支出”,它包含一些描述性数据,另一个部分称为“RSS Feed”,它也包含一些描述性数据。记住这一点,然后查看这段代码
<div class="chunk">
<h4>Track your expenses</h4>
<img src="/images/paper_small.gif" alt="" class="left"/>
<p>Divide bills easily by creating receipts and letting billshare do the math. Automatically keep a searchable history of all bills.</p>
</div>
<div class="chunk">
<h4>RSS Feeds</h4>
<img src="/images/rss_big.jpg" alt="" class="left"/>
<p>Keep track of new receipts are posted to your groups instantly by subscribing to the groups RSS feed.</p>
</div>
从语义上讲,这是不正确的。
即使这段代码非常干净并且可以正常工作,但从语义上讲,它偏离了我们最初的想法。有两个问题。首先,div 分别独立地隔开了部分,而不是将它们放在一起。其次,“描述”被拆分为一个<img>元素和一个<p>元素,而不是放在一起。
定义列表来救援。
好的好的。我们调整了示例。这恰好是定义列表的完美场景。定义列表由三种不同的标签组成
- <dl>: 容器
- <dt>: 定义术语(就像标题一样)
- <dd>: 定义描述
现在让我们尝试使用定义列表重写此内容。我们知道现在可以将整个内容包装在一个容器中,并将所有内容放在一起。我们知道可以将标题设置为定义术语。但是那个描述呢?从语义上讲,最好的方法是将所有内容都包含在一个定义描述元素中……我们可以!唯一的障碍是图像在不同部分之间有所不同,因此我们需要对<dd>元素应用一个唯一的类。
<dl>
<dt>Track your expenses</dt>
<dd class="chunk_divide">Divide bills easily by creating receipts and letting billshare do the math. Automatically keep a searchable history of all bills.</dd>
<dt>RSS Feeds</dt>
<dd class="chunk_rss">Keep track of new receipts are posted to your groups instantly by subscribing to the groups RSS feed.</dd>
</dl>
这些标签为您在 CSS 中提供了许多样式选项。
dt {
font-weight: bold;
}
dd {
background:none no-repeat left top;
padding-left: 50px;
}
dd.catchPhrase1 {
background-image:url('../img/paper_small.gif');
}
dd.catchPhrase2 {
background-image:url('../img/stats.gif');
}
我不能使用无序列表来做这件事吗?
当然可以。但是列表只能包含列表元素,因此标题和描述的语义描述不如定义列表好。实际上,您可以使用表格、div 甚至任何数量的 HTML 元素来实现,但没有一个在语义上像在这种情况下使用定义列表那样合理。
它们还能做什么?
我很高兴您问这个问题,因为此示例没有充分利用定义列表的所有功能。另一个主要优势是,在定义列表中,您可以使用多个术语或多个描述,这都没有关系!让我们考虑一些示例。
DT: 网站链接
DD: 网站描述
DT: 即将到来的演出
DD: 日期
DD: 场地
DD: 入场费
DT: 化名 #1
DT: 化名 #2
DD: 含义
DT: 食谱
DD: 食材
DD: 食材
DD: 指导
一旦您开始真正思考,您会发现定义列表有许多实际应用,所以很少在代码中看到它们确实让人惊讶。
为什么定义列表没有更广泛地使用?
很难说……我认为可能是搜索引擎优化 (SEO) 是最主要的原因。人们知道(或者认为他们知道)标题标签会赋予内容额外的权重和重要性。使用得当,您的术语标签可以替代标题标签,我猜想人们认为这意味着他们的内容会获得更少的搜索引擎权重。我不会对此问题发表任何意见,因为我不是 SEO 天才,但我直觉认为,您永远不会因为代码标记良好而受到处罚。
另一个限制是,您不能在 <dt>
元素中使用块级元素。它在这一点上与标题元素(例如 <h1>
)类似。(感谢 Paul O’Brien 的提示)
“标题标签会赋予内容额外的权重和重要性” - 您可以在 dt 中包含一个标题标签吗?例如,标题,或者这将是无效的?我必须承认,在我开始在这里阅读之前,我从未听说过定义列表。
@Lazlow: 定义列表不像无序列表和有序列表那样流行,但它们确实存在。
您使用 DT 标签定义定义的标题,不需要在其中放置另一个标题标签。
@Lazlow - 补充 Volkan 的说法,定义列表不能包含块级元素,这排除了标题元素,这就是为什么 DT 标签用于标题的原因。
好示例……
您说得对,定义列表根本没有被广泛使用。我记得很久以前我第一次使用它们,并且使用和设置样式真的非常容易。
感谢您关注定义列表!我不经常看到它被使用,我想知道这是因为人们不喜欢它还是因为他们根本不知道它。关于语义使用的示例越多越好。
@Matt – 我认为人们不使用它是因为他们不知道它以及如何最好地使用它。无序列表使用得更频繁,因为它们用于菜单。
顺便说一句,你的提交按钮在我的 IE7 中没有显示出来
顺便说一句,Chris,你的新页脚很棒 :)
“另一个限制是,你不能在定义列表中使用块级元素”
仅供说明 - 你不能只在 dt 中使用块元素,而不能在 dd 中使用。
嗨,前段时间,在使用定义列表时,我在某个地方读到,给一个 dt 多个 dd 是不合适的。
他们建议像这样放置一个 ul:
DL
DT
DD
UL
LI
LI
LI
UL
DD
DL
你怎么看?
找到了链接:http://tinyurl.com/9sd68
好读!
谢谢大家。
很棒的文章。我一直都在使用定义列表,因为它们是唯一可以以标记方式表达 name=value 对关系的方式。我甚至用它们来标记一对元素,比如一张照片和附带的标题,尽管这可能有点牵强。我相信这也是一个提议的微格式。
非常好的文章,我“偶然”发现了这篇文章,并喜欢你对 DL 的热爱。
另外,如果可以的话,我补充一点,我上周不得不向客户解释 DL 背后的语义原因。他们想让我把它设置成
<h1>标题</h1>
<p>文本</p>
用于搜索引擎。现在,这可以工作,但这不会出现在主要内容区域或标题中,不,这将出现在右侧的专栏中,这是一个四栏设计,实际上并不是一个引人注目的部分。因此,除了解释为什么 DL 在语义上是正确的之外,我还不得不解释为什么在标题以外的其他地方使用 H1,实际上并不是语义上的。我最终做的是用两种方法分别编写了一个示例页面,并关闭了样式;这让他有点开眼界。
总之,非常好的文章,抱歉评论太长。我将收藏你的网站。
@Chocopunk – 我个人不建议在定义列表中使用 UL、LI 等,这看起来太混乱且不符合语义
我从未使用过定义列表,因为我不喜欢单独的定义没有分组的方式。相反,它们只是在 <dl> 中一起堆放。如果定义列表包含一些容器元素(例如 <di>,类似于列表的 <li>)来对单独的 <dt> 和 <dd> 对进行分组,它将更结构化,对我来说更有意义。
但我认为这并不重要!我认为需要进一步调查!
我以前从未使用过定义列表,但在阅读了你的文章后,我会尝试更多地使用它。
感谢提示!
你的语义论点有点偏。
第一个情况是完全符合语义的。标题旨在引导一段内容。你说它不正确是因为它们没有分组,但它们是通过彼此的相对位置分组的,如果这还不够,它们是通过父元素分组的(例如,你可以在此组之上定义一个 div)。虽然不是理想的,但列表元素是一个更好的解决方案,但它永远不会是一个较差的语义解决方案。
另一个值得关注的是,你不需要将 DL 列表限制为每个项目一个 DT 或 DD - 它不是键值对。
例如,你可以做
DT(节标题)
DD(图像)
DD(段落)
读得很好。我以前从未使用过 DL、DT 或 DD。
定义列表很棒 :)
读得很好,下次开发时我会尝试这种方法。
干得好,Chris
在我开始研究定义列表后,一个 Twitter 朋友给我发了这篇文章。我显然应该在更多文章中使用它们,因为我经常在我的博客上做“扩展”列表。
感谢你提供精彩的概述!我一定要玩玩它们。
如果像 tinyMCE 这样的 CMS 编辑器中包含 DL、DT 和 DD 按钮,定义列表可能会被更多地使用。我合作过的绝大多数营销人员对代码知之甚少,因此让他们进入编辑器的文本部分来创建和编辑 DL 是不可能的。即使有了这些按钮,他们也必须至少选择两个项目,点击 DL 按钮,取消选择,选择第一个项目并点击 DT,选择第二个项目并点击 DD。这不可能发生。
底线是:如果我使用定义列表为客户组织内容,很可能它无法得到正确维护。
话虽如此,我认为它们很棒。
嗨,Chris。很高兴你免费提供你的知识。这些年来,我犯过所有可能的错误。现在,当我想尝试新事物时,你的网站是我的首选网站 - 或者尝试做同样的事情 - 做得更好。谢谢。
一位同事使用了 DL,我的工作是根据输入的值使用 JS 有条件地隐藏一个 dt/dd 对。我发现,不知何故,为它们设置 display:none 并不起作用(即使使用 !important),我找到的唯一解决方案相当繁琐:http://stackoverflow.com/questions/6988945/hide-show-dd-elements-in-a-definition-list
因此,这是使用 DL 的一个缺点,正式地说,我将坚持使用经过验证的 div 和 ul。除非,有谁知道一种优雅的方法来动态隐藏定义列表对吗?
更正!忽略我上面提到的所有内容… 我的问题出在 JS 上,而不是 dl… 看起来 dl 毕竟值得考虑
DL 是一个 HTML5 标签吗?如果是,它与以前版本的 HTML 兼容吗?