Como estilizar dt e dd para que eles fiquem na mesma linha?

212

Usando CSS, como posso estilizar o seguinte:

<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>

então o conteúdo do dtprograma em uma coluna e o conteúdo do ddem outra coluna, com cada um dte o correspondente ddna mesma linha? Ou seja, produzindo algo parecido com:

formato de tabela

avernet
fonte
Apenas como uma observação útil: se você deseja controlar o espaçamento entre linhas de dts e dds, verifique o seguinte: stackoverflow.com/q/896815/114029 Essas poderosas tags tornam as formas de estilo realmente fáceis e bonitas.
Leniel Maccaferri 12/11/11
Consulte também stackoverflow.com/questions/896815/… particularmente a resposta aceita stackoverflow.com/a/896840/1037948
drzaus 27/10/16
1
Por favor, considere alterar a resposta aceita para isso: stackoverflow.com/a/44599527/3853934
Michał Perłakowski

Respostas:

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>

eozzy
fonte
2
Obrigado! Esta dica de CSS me ajudou a formatar meu formulário do Zend sem precisar codificar as classes do decorador de formulários.
devNoise
Você não parece capaz de adicionar uma margem inferior ou espaço de preenchimento nas "linhas" usando esse método.
Graeck 13/09
7
Eu recomendo adicionar um clear: leftao estilo dt para garantir que eles permaneçam alinhados, mesmo que precisem quebrar.
6114 Simon
1
A * { ... }declaração faz com que tudo perca a margem e o preenchimento e a remoção distorce o DL. Usar uma classe também não serve. Parece que se eu quiser algo além do DL, terei que ficar sem margens e forros em todos os lugares ... Ou?
Erk
Isso se comporta de maneira estranha quando você seleciona (clique duas vezes) a primeira palavra no <dd>. Ele também seleciona o texto dentro do <dt>, a menos que haja espaço em branco (ou um & nbsp; se você estiver usando o htmlmin) entre o <dt> e o <dd>.
KFunk
122

Eu tenho uma solução sem usar carros alegóricos!
verifique isso no codepen

Viz.

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



Update - 3 rd janeiro 2017: solução baseada flex-box eu adicionei para o problema. Verifique isso no codepen vinculado e refine-o conforme as necessidades. Obrigado!

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;
}
Navaneeth
fonte
2
Perfeito! Aquele carro alegórico do mal resolveu um problema enquanto me dava dois novos (como nenhum alinhamento vertical). Bom que se foi agora.
flu
8
Isso funciona bem com texto curto na parte DD; se o texto for muito longo, ele será contornado e exibido na parte DT.
Riccardo Murri
3
Isso funciona mesmo se alguns itens da lista estiverem vazios. Ótimo!
Tomas Kubes
@ tjm1706: Eu acho que a solução baseada em flexibilidade pode lidar com casos de texto mais longos. Obrigado :)
Navaneeth
@navaneeth Grande sol'n. Para obter pontos entre a palavra e a definição, adicionei: dl.inline-flex dt: after {content: "................"} Na verdade, uso 150 pontos aqui para garantir que são suficientes. Você também precisa adicionar espaço em branco: nowrap para o dt
MERM 13/17
60

Layout da grade CSS

Como as tabelas, o layout da grade permite que um autor alinhe elementos em colunas e linhas.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout

Para alterar os tamanhos das colunas, dê uma olhada na grid-template-columnspropriedade

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>

yckart
fonte
É exatamente isso que eu quero. caniuse.com/#feat=css-grid - não é tão universal quanto eu gostaria, mas é razoavelmente bem suportado.
Iiridayn
59

Se você usa o Bootstrap 3 (ou anterior) ...

<dl class="dl-horizontal">
    <dt>Label:</dt>
    <dd>
      Description of planet
    </dd>
    <dt>Label2:</dt>
    <dd>
      Description of planet
    </dd>
</dl>
silvster27
fonte
14
Se você olhar o CSS do Bootstrap, poderá ter uma idéia de como estilizá-lo, mesmo sem usar o Bootstrap, embora eu goste dessa estrutura. Aqui está um trecho, ignorando as consultas de mídia para o design responsivo para simplificar um exemplo: dl {margin-top: 0; margin-bottom: 20px} dt, dd {line-height: 1.428571429} dt {font-weight: 700} dd {margin-left: 0} .dl-horizontal dt {float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: elipsis; white-space: nowrap} .dl- dd horizontal {margin-left: 180px}
Tim Franklin
8
o dl-horizontalfoi realmente retirado do Bootstrap 4. No BS4, você precisa usar classes de grade.
Scribblemacher
21

Supondo que você saiba a largura da margem:

dt { float: left; width: 100px; }
dd { margin-left: 100px; }
ancestral
fonte
2
Eu não chamaria isso de limpo, porque você codificado as margens no.
Liam Dawson
6
Limpo: com uma forma simples, bem definida e agradável. A resposta é curta. Ele resolve o problema em três declarações. Não ter conhecido a margem não era um requisito como parte da questão.
ancestral
6
Limpar geralmente é usado para marcação nesses estilos de perguntas. De qualquer forma, seja bem-vindo ao StackOverflow e recomendo que você coloque esses tipos de suposições no corpo da sua pergunta, apenas para maior clareza.
Liam Dawson
8

Como ainda tenho que ver um exemplo que funcione no meu caso de uso, aqui está a solução mais completa que consegui encontrar.

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="#">[email protected]</a></dd>
  <dt>Postal Address</dt>
  <dd><div class="address">123 FAKE ST<br />EXAMPLE EX  00000</div></dd>
</dl>

Text

Curiosamente, ele não funciona display: inline-block. Suponho que, se você precisar definir o tamanho de qualquer um dos dtelementos ou ddelementos, poderá definir a dlexibição como display: flexbox; display: -webkit-flex; display: flex;e a flexabreviação dos ddelementos e dtelementos como algo como flex: 1 1 50%e displaycomo display: inline-block. Mas eu não testei isso, portanto, aborde com cautela.

Tyler Crompton
fonte
6

Captura de tela do jsFiddle

Veja a demonstração do jsFiddle

Eu precisava de uma lista exatamente como descrita para um projeto que mostrasse funcionários de uma empresa, com sua foto à esquerda e informações à direita. Consegui realizar a limpeza usando psuedo-elements depois de cada DD:

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

Além disso, eu queria que o texto fosse exibido apenas à direita da imagem, sem envolver a imagem flutuada (efeito de pseudo-coluna). Isso pode ser feito adicionando um DIVelemento com o CSS overflow: hidden;ao redor do conteúdo da DDtag. Você pode omitir esse extra DIV, mas o conteúdo da DDtag será agrupado sob o flutuanteDT .

Depois de brincar um pouco, consegui suportar vários DTelementos por DD, mas não vários DDelementos por DT. Eu tentei adicionar outra classe opcional para limpar somente após o último DD, mas subseqüentes DDelementos enrolado sob os DTelementos (não meu efeito desejado ... Eu queria que o DTe DDelementos para colunas de formulário, eo extraDD elementos eram muito grandes).

Por todos os direitos, isso deve funcionar apenas no IE8 +, mas devido a uma peculiaridade no IE7, ele também funciona lá.

terceiro
fonte
Facilmente uma das melhores respostas aqui.
Michael Ahlers
5

Aqui está outra opção que funciona exibindo o dt e o dd inline e adicionando uma quebra de linha após o dd.

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

Isso é semelhante à solução de Navaneeth acima, mas usando essa abordagem, o conteúdo não será alinhado como em uma tabela, mas o dd seguirá o dt imediatamente em todas as linhas, independentemente do comprimento.

Andrew Downes
fonte
5

Eu preciso fazer isso e ter o <dt>conteúdo centralizado verticalmente, em relação ao <dd>conteúdo. Eu usei display: inline-blockjunto comvertical-align: middle

Veja o exemplo completo no Codepen aqui

.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;
  } 
}
Astrotim
fonte
3

Dependendo de como você estiliza os elementos dt e dd, você pode encontrar um problema: torná-los com a mesma altura. Por exemplo, se você quiser mas alguma borda visível na parte inferior desses elementos, provavelmente desejará exibir a borda na mesma altura, como em uma tabela.

Uma solução para isso é trapacear e tornar cada linha um elemento "dl". (isso é equivalente a usar tr em uma tabela) Perdemos o interesse original das listas de definição, mas, por outro lado, é uma maneira fácil de obter pseudo-tabelas com estilo rápido e bonito.

O 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;}

O HTML:

<div class="huitCinqPts bord_inf_gc">
  <dl><dt>Term1</dt><dd>Definition1</dd></dl>
  <dl><dt>Term2</dt><dd>Definition2</dd></dl>
</div>
entusiasta123
fonte
1
Você não escreve quatreVingtCinqPts? :)
nicodemus13
2

Encontrei uma solução que me parece perfeita, mas precisa de <div>tags extras . Acontece que não é necessário usar <table>tag para alinhar, como em uma tabela, basta usar display:table-row;e display:table-cell;estilos:

<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>
Alexey
fonte
Por que não é compatível com XHTML?
Derick Schoonbee
8
@DerickSchoonbee - Porque dls só podem ter dts e dds quando crianças. dts só podem ter elementos embutidos como filhos. dds, por algum motivo, pode ter elementos em nível de bloco como filhos.
Anthony
6
-1 HTML 4, XHTML 1 ou HTML 5. inválido. Basicamente, você só quer o DIelemento, como eu . Mas com qualquer elemento desse tipo, você não precisa de nada esotérico, como tabelas CSS ... De qualquer forma, esse elemento não existe e, portanto, você não deve usá-lo.
Andreas Rejbrand
@AndreasRejbrand O elemento DI também não é válido em HTML5 #
AlexMorley-Finch
@ AlexMorley-Finch: Eu sei. É por isso que eu disse que queria esse elemento (o DI é do XHTML 2.0). Aliás, Ian Hickson, editor do WHATWG HTML 5, me fez perceber que o valor run-inCSS displayé exatamente o que eu quero (no meu caso, eu quero listas simples de metadados de valor-nome).
Andreas Rejbrand
2

Recentemente, precisei misturar pares dt / dd inline e não inline, especificando a classe dl-inlinenos <dt>elementos que devem ser seguidos pelos <dd>elementos inline .

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

>

Mike Godin
fonte
1

Isso funciona no IE7 +, é compatível com os padrões e permite alturas diferentes.

<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>        

Veja o JSFiddle .

Justin
fonte
1

isso funciona para exibi-los como tabela, com borda, e deve ser responsivo com 3em a largura da primeira coluna. A quebra de linha apenas quebra qualquer palavra mais larga que a coluna

 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; } 

Comparação de <table>com <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>

Mousey
fonte
0

Geralmente começo com o seguinte ao estilizar listas de definições como tabelas:

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 */
}
pinky00106
fonte
-8

A maior parte do que as pessoas sugeriram aqui funciona, no entanto, você só deve colocar código genérico na folha de estilos e colocar o código específico no código html, como mostrado abaixo. Caso contrário, você terminará com uma folha de estilo inchada.

Aqui está como eu faço isso:

Seu código da folha de estilo:

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

Seu código 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>

Se parece com isso

RoboTamer
fonte
1
Eu recomendaria não repetir a margem esquerda quando ela pode ser movida para a folha de estilos - elas estão lá para impedir a duplicação de código. O inchaço das folhas de estilo pode ser combatido com um design consistente; mas mesmo assim - se a prevenção de inchaço for para salvar o tráfego de rede, ele ainda será salvo colocando-o na folha de estilos em vez do HTML.
Iiridayn
2
-1 desculpe. Não use estilos embutidos, a menos que você REALMENTE não tenha outra opção; caso contrário, você terá uma marcação html muito confusa para começar.
MEM
Eu acho que isso é um anti-padrão.
Denis Ivanov