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


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


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>


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

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>


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

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

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="#">example@example.com</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.


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


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.


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

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>

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>

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

>


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 .


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>


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 */
}

-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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.