如何设置dt和dd的样式,使它们处于同一行?


212

使用CSS,如何设置以下样式:

<dl>
    <dt>Mercury</dt>
    <dd>Mercury (0.4 AU from the Sun) is the closest planet to the Sun and the smallest planet.</dd>
    <dt>Venus</dt>
    <dd>Venus (0.7 AU) is close in size to Earth, (0.815 Earth masses) and like Earth, has a thick silicate mantle around an iron core.</dd>
    <dt>Earth</dt>
    <dd>Earth (1 AU) is the largest and densest of the inner planets, the only one known to have current geological activity.</dd>
</dl>

因此,dt在同一列中显示的内容和dd在另一列中显示的内容,并且每行dt和对应的dd内容都在同一行上?即产生看起来像这样的东西:

表格格式


就像一个有用的注释:如果您想控制dts和dds行之间的间距,请检查以下内容:stackoverflow.com/q/896815/114029这些功能强大的标签使样式表单真正简单而美观。
Leniel Maccaferri 2011年


1
请考虑改变公认的答案,这个stackoverflow.com/a/44599527/3853934
米哈尔Perłakowski

Answers:


140

dl {
  width: 100%;
  overflow: hidden;
  background: #ff0;
  padding: 0;
  margin: 0
}
dt {
  float: left;
  width: 50%;
  /* adjust the width; make sure the total of both is 100% */
  background: #cc0;
  padding: 0;
  margin: 0
}
dd {
  float: left;
  width: 50%;
  /* adjust the width; make sure the total of both is 100% */
  background: #dd0
  padding: 0;
  margin: 0
}
<dl>
  <dt>Mercury</dt>
  <dd>Mercury (0.4 AU from the Sun) is the closest planet to the Sun and the smallest planet.</dd>
  <dt>Venus</dt>
  <dd>Venus (0.7 AU) is close in size to Earth, (0.815 Earth masses) and like Earth, has a thick silicate mantle around an iron core.</dd>
  <dt>Earth</dt>
  <dd>Earth (1 AU) is the largest and densest of the inner planets, the only one known to have current geological activity.</dd>
</dl>


2
谢谢!这个CSS技巧可帮助我格式化Zend Form,而不必对表单装饰器类进行编码。
devNoise 2011年

您似乎无法使用此方法在“行”上添加底部边距或填充丝束空间。
Graeck

7
我建议clear: left在dt样式中添加a ,以确保即使需要包装它们也可以保持内联。
西蒙

1
* { ... }语句使所有内容失去边距和填充,并且删除它会使DL失真。使用类也不会成功。似乎,如果我只需要DL,我将无处不在没有空白和填充物...或者?
Erk

当您选择(双击)<dd>中的第一个单词时,这会很尴尬。它还会选择<dt>中的文本,除非<dt>和<dd>之间有空格(如果使用的是htmlmin,则为&nbsp;)。
KFunk

122

我有一个不使用浮子的解决方案!
codepen上检查一下

就是

dl.inline dd {
  display: inline;
  margin: 0;
}
dl.inline dd:after{
  display: block;
  content: '';
}
dl.inline dt{
  display: inline-block;
  min-width: 100px;
}



更新- 3 2017年1月:对这个问题我基于添加柔性一体化解决方案。检查链接的Codepen中的内容并根据需要对其进行优化。谢谢!

dl.inline-flex {
  display: flex;
  flex-flow: row;
  flex-wrap: wrap;
  width: 300px;      /* set the container width*/
  overflow: visible;
}
dl.inline-flex dt {
  flex: 0 0 50%;
  text-overflow: ellipsis;
  overflow: hidden;
}
dl.inline-flex dd {
  flex:0 0 50%;
  margin-left: auto;
  text-align: left;
  text-overflow: ellipsis;
  overflow: hidden;
}

2
完善!那个邪恶的浮动只解决了一个问题,却给了我两个新的问题(例如没有垂直对齐)。很好,现在不见了。
2014年

8
这对于DD部分中的短文字效果很好;如果文字太长,它将环绕并显示在DT部分下方。
Riccardo Murri 2014年

3
即使列表中的某些项目为空,此方法也有效。大!
Tomas Kubes,

@ tjm1706:我认为,基于flex的解决方案可以处理更长的文本大小写。谢谢:)
Navaneeth'1

@navaneeth太好了。为了在单词和定义之间获得点,我添加了:dl.inline-flex dt:after {content:“ .......”}}我实际上在这里使用150个点来确保够了。您还需要添加空格:dt的nowrap
MERM

60

CSS网格布局

像表格一样,网格布局使作者能够将元素对齐到列和行中。
https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Grid_Layout

要更改列大小,请看一下grid-template-columns属性。

dl {
  display: grid;
  grid-template-columns: max-content auto;
}

dt {
  grid-column-start: 1;
}

dd {
  grid-column-start: 2;
}
<dl>
  <dt>Mercury</dt>
  <dd>Mercury (0.4 AU from the Sun) is the closest planet to the Sun and the smallest planet.</dd>
  <dt>Venus</dt>
  <dd>Venus (0.7 AU) is close in size to Earth, (0.815 Earth masses) and like Earth, has a thick silicate mantle around an iron core.</dd>
  <dt>Earth</dt>
  <dd>Earth (1 AU) is the largest and densest of the inner planets, the only one known to have current geological activity.</dd>
</dl>


正是我想要的。caniuse.com/#feat=css-grid-不像我所希望的那样普遍,但是可以很好地得到支持。
Iiridayn

59

如果您使用Bootstrap 3(或更早版本)...

<dl class="dl-horizontal">
    <dt>Label:</dt>
    <dd>
      Description of planet
    </dd>
    <dt>Label2:</dt>
    <dd>
      Description of planet
    </dd>
</dl>

14
如果您查看Bootstrap的CSS,即使我不喜欢使用Bootstrap,也可以了解如何设置其样式,尽管我确实喜欢该框架。这是一个代码段,为简化示例,忽略了响应式设计的媒体查询:dl {margin-top:0; margin-bottom:20px} dt,dd {line-height:1.428571429} dt {font-weight:700} dd {margin-left:0} .dl水平dt {float:left; width:160px; clear:left; text-align:right; overflow:hidden; text-overflow:省略号;空白:nowrap} .dl-水平dd {margin-left:180px}
蒂姆·富兰克林

8
dl-horizontal实际上从引导4.在BS4下降,你需要使用网格类来代替。
Scribblemacher

21

假设您知道边距的宽度:

dt { float: left; width: 100px; }
dd { margin-left: 100px; }

2
我不会把它干净,因为你已经在硬编码的利润率。
利亚姆·道森

6
干净:形状简单,轮廓分明,令人愉悦。答案很短。它用三个语句解决了这个问题。不知道保证金不是问题的一部分。
2012年

6
这些样式的问题通常将Clean用作标记。无论如何,欢迎使用StackOverflow,我建议您将这些假设放在您的问题的主体中,以简化说明。
利亚姆·道森

8

因为我还没有看到适合我的用例的示例,所以这里是我能够实现的最完善的解决方案。

dd {
    margin: 0;
}
dd::after {
    content: '\A';
    white-space: pre-line;
}
dd:last-of-type::after {
    content: '';
}
dd, dt {
    display: inline;
}
dd, dt, .address {
    vertical-align: middle;
}
dt {
    font-weight: bolder;
}
dt::after {
    content: ': ';
}
.address {
    display: inline-block;
    white-space: pre;
}
Surrounding

<dl>
  <dt>Phone Number</dt>
  <dd>+1 (800) 555-1234</dd>
  <dt>Email Address</dt>
  <dd><a href="#">example@example.com</a></dd>
  <dt>Postal Address</dt>
  <dd><div class="address">123 FAKE ST<br />EXAMPLE EX  00000</div></dd>
</dl>

Text

奇怪的是,它不能使用display: inline-block。我想,如果你需要设置任何规模dt要素或dd元素,你可以设置dl的显示为display: flexbox; display: -webkit-flex; display: flex;flex的速记dd元素和dt元素,就像这样flex: 1 1 50%display作为display: inline-block。但是我还没有测试过,因此请谨慎对待。


6

jsFiddle截图

参见jsFiddle演示

我需要一个与该项目完全相同的清单,该清单显示了公司的员工,其照片在左侧,信息在右侧。我设法在每次之后使用psuedo-elements完成清除DD

.myList dd:after {
  content: '';
  display: table;
  clear: both;
}

另外,我希望文本仅显示在图像的右侧,而不会在浮动的图像下包裹(伪列效果)。这可以通过在标签内容周围添加DIV带有CSS 的元素来实现。您可以省略这些多余的内容,但是标记的内容将环绕在浮动对象下。overflow: hidden;DDDIVDDDT

与它玩了一会儿后,我就能够支持多种DT每个元素DD,但不是多个DD每个元素DT。我尝试添加另一个可选类以仅在last 元素之后清除DD,但随后的DD元素包裹在DT元素下面(不是我想要的效果……我希望DTand DD元素形成列,而多余的DD元素太宽)。

依所有权利,此功能仅在IE8 +中有效,但由于IE7中的古怪之处,它也同样适用。


很容易是这里最好的答案之一。
Michael Ahlers

5

这是另一个选项,它通过显示dt和dd内联然后在dd之后添加换行符而起作用。

dt, dd {
 display: inline;
}
dd:after {
 content:"\a";
 white-space: pre;
}

这类似于上面的Navaneeth的解决方案,但是使用这种方法,内容将不会像表中那样排成一行,但是dd会在每行上紧随dt而不考虑长度。


5

我需要这样做,并使<dt>内容相对于内容垂直居中<dd>。我曾经display: inline-blockvertical-align: middle

在此处查看有关Codepen的完整示例

.dl-horizontal {
  font-size: 0;
  text-align: center;

  dt, dd {
    font-size: 16px;
    display: inline-block;
    vertical-align: middle;
    width: calc(50% - 10px);
  }

  dt {
    text-align: right;
    padding-right: 10px;
  }

  dd {
    font-size: 18px;
    text-align: left;
    padding-left: 10px;
  } 
}

3

根据如何设置dt和dd元素的样式,您可能会遇到一个问题:使它们具有相同的高度。例如,如果要在这些元素的底部保留一些可见的边框,则很可能希望以相同的高度显示边框,例如在表格中。

一种解决方案是作弊,并将每一行都设为“ dl”元素。(这等同于在表中使用tr)我们失去了定义列表的初衷,但与此相反,这是一种获取快速,漂亮样式的伪表的简便方法。

CSS:

dl {
 margin:0;
 padding:0;
 clear:both;
 overflow:hidden;
}
dt {
 margin:0;
 padding:0;
 float:left;
 width:28%;
 list-style-type:bullet;
}
dd {
 margin:0;
 padding:0;
 float:right;
 width:72%;
}

.huitCinqPts dl dt, .huitCinqPts dl dd {font-size:11.3px;}
.bord_inf_gc dl {padding-top:0.23em;padding-bottom:0.5em;border-bottom:1px solid #aaa;}

HTML:

<div class="huitCinqPts bord_inf_gc">
  <dl><dt>Term1</dt><dd>Definition1</dd></dl>
  <dl><dt>Term2</dt><dd>Definition2</dd></dl>
</div>

1
你不写quatreVingtCinqPts吗?:)
nicodemus13

2

我找到了一个对我来说似乎很完美的解决方案,但是它需要额外的<div>标签。事实证明,不必<table>像表中那样使用标记来对齐,使用display:table-row;display:table-cell;样式就足够了:

<style type="text/css">
dl > div {
  display: table-row;
}
dl > div > dt {
  display: table-cell;
  background: #ff0;
}
dl > div > dd {
  display: table-cell;
  padding-left: 1em;
  background: #0ff;
}
</style>

<dl>
  <div>
    <dt>Mercury</dt>
    <dd>Mercury (0.4 AU from the Sun) is the closest planet to the Sun and the smallest planet.</dd>
  </div>
  <div>
    <dt>Venus</dt>
    <dd>Venus (0.7 AU) is close in size to Earth, (0.815 Earth masses) and like Earth, has a thick silicate mantle around an iron core.</dd>
  </div>
  <div>
    <dt>Earth</dt>
    <dd>Earth (1 AU) is the largest and densest of the inner planets, the only one known to have current geological activity.</dd>
  </div>
</dl>

为什么它不符合XHTML?
Derick Schoonbee,

8
@DerickSchoonbee-因为dls只能将dts和dds作为孩子。dt只能将内联元素作为子元素。dd出于某种原因,s可以将块级元素作为子元素。
安东尼

6
-1无效的HTML 4,XHTML 1或HTML5。基本上,您只想要该DI元素,例如我自己。但是有了任何这样的元素,您根本不需要像CSS表之类的深奥的东西……无论如何,该元素不存在,因此您不应使用它。
Andreas Rejbrand 2013年

@AndreasRejbrand DI元素也不是有效的HTML5
AlexMorley-Finch 2014年

@ AlexMorley-Finch:我知道。这就是为什么我说我想要这样的元素(DI来自XHTML 2.0)。顺便说一下,WHATWG HTML 5编辑器Ian Hickson使我意识到run-inCSS display值正是我想要的(在我的情况下,我想要简单的名称-值元数据列表)。
Andreas Rejbrand 2014年

2

我最近需要混合内联和非内联dt / dd对,方法是dl-inline<dt>应紧随内联<dd>元素的元素上指定类。

dt.dl-inline {
  display: inline;
}
dt.dl-inline:before {
  content:"";
  display:block;
}
dt.dl-inline + dd {
  display: inline;
  margin-left: 0.5em;
  clear:right;
}
<dl>
    <dt>The first term.</dt>
    <dd>Definition of the first term. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a placerat odio viverra fusce.</dd>
    <dt class="dl-inline">The second term.</dt>
    <dd>Definition of the second term. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a placerat odio viverra fusce.</dd>
    <dt class="dl-inline">The third term.</dt>
    <dd>Definition of the third term. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a placerat odio viverra fusce.</dd>
    <dt>The fourth term</dt>
    <dd>Definition of the fourth term. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque a placerat odio viverra fusce.</dd>
</dl

>


1

这适用于IE7 +,符合标准,并允许不同的高度。

<style>
dt {
    float: left;
    clear: left;
    width: 100px;        
    padding: 5px 0;
    margin:0;
}
dd {
    float: left;
    width: 200px;
    padding: 5px 0;
    margin:0;
}
.cf:after {
    content:'';
    display:table;
    clear:both;
}
</style>

<dl class="cf">
    <dt>A</dt>
    <dd>Apple</dd>
    <dt>B</dt>
    <dd>Banana<br>Bread<br>Bun</dd>
    <dt>C</dt>
    <dd>Cinnamon</dd>
</dl>        

参见JSFiddle


1

这可以将它们显示为带有边框的表格,它应该以第一栏的宽度3em响应。自动换行只打破了任何比列宽的单词

 dl { display:block;
      border:2px solid black;
      margin: 1em;}  
 dt { display:inline-block;
      width:3em;
      word-wrap:break-word;} 
 dd { margin-left:0;
      display:inline;
      vertical-align:top;
      line-height:1.3;} 
 dd:after { content:'';display:block; } 

比较<table><dl>

<!DOCTYPE html>
<html>
<style>

dl { display:block;border:2px outset black;margin:1em; line-height:18px;}  
dt { display:inline-block;width:3em; word-wrap:break-word;} 

dd { margin-left:0; display:inline; vertical-align:top; line-height:1.3;} 
dd:after { content:'';display:block; } 


.glosstable { border:2px outset #aaaaaa;margin:1em; text-align:left}  
.glosstable, table, tbody,  tr,  td, dl, dt {font-size:100%; line-height:18px;}

.glossaz { font-size:140%;padding-left:2em;font-weight:bold;color: #00838c; } 
td.first {width: 2.5em;} 
</style>
<body>
Table<br>
<table class="glosstable">
  <tr><td class="first">Milk</td>
  <td class="glossdata">Black hot drink</td>
</tr>
  <tr><td class="first">Coffee2</td>
  <td class="glossdata">Black hot drink</td>
</tr>
  <tr><td>Warm milk</td>
  <td class="glossdata">White hot drink</td>
</tr>
</table>
DL list <br>
<dl class="glosstablep">
  <dt>Milk</dt>
  <dd class="glossdata">White cold drink</dd>
  <dt>Coffee2</dt>
  <dd class="glossdata">Black cold drink</dd>
  <dt>Warm Milk</dt>
  <dd class="glossdata">White hot drink</dd>
</dl>

</body>
</html>


0

在将定义列表样式化为表格时,我通常从以下内容开始:

dt,
dd{
    /* Override browser defaults */
    display: inline;
    margin: 0;
}

dt  {
    clear:left;
    float:left;
    line-height:1; /* Adjust this value as you see fit */
    width:33%; /* 1/3 the width of the parent. Adjust this value as you see fit */
}

dd {
    clear:right;
    float: right;
    line-height:1; /* Adjust this value as you see fit */
    width:67%; /* 2/3 the width of the parent. Adjust this value as you see fit */
}

-8

此处建议的大多数人都可以使用,但是您应该只将通用代码放入样式表中,并将特定的代码放入html代码中,如下所示。否则,您将得到一个style肿的样式表。

这是我的方法:

您的样式表代码:

<style>
    dt {
        float:left;
    }
    dd {
        border-left:2px dotted #aaa;
        padding-left: 1em;
        margin: .5em;
    }   
</style>

您的html代码:

<dl>
    <dt>1st Entity</dt>
    <dd style="margin-left: 5em;">Consumer</dd>
    <dt>2nd Entity</dt>
    <dd style="margin-left: 5em;">Merchant</dd>
    <dt>3rd Entity</dt>
    <dd style="margin-left: 5em;">Provider, or cToken direct to Merchant</dd>
    <dt>4th Entity</dt>
    <dd style="margin-left: 5em;">cToken to Provider</dd>
</dl>

看起来像这样


1
我建议不要在可以将其移至样式表时重复margin-left,因为它们在那里可以防止代码重复。样式表的膨胀可以通过一致的设计来抵消;但是即使那样-如果要防止膨胀是为了节省网络流量,仍然可以通过将其粘贴在样式表中而不是HTML中来保存它。
Iiridayn

2
-1对不起。不要使用内联样式,除非您真的没有其他选择,否则,您最终将得到一个非常凌乱的html标记。
MEM 2014年

我认为这是一种反模式。
Denis Ivanov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.