Jak stylizować dt i dd, aby były na tej samej linii?

212

Używając CSS, jak mogę stylizować następujące elementy:

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

więc treść dtprzedstawienia w jednej kolumnie i zawartość ddinnej kolumny, z których każda dti odpowiadająca ddjej linia znajdują się w tym samym wierszu? Tj. Produkuję coś, co wygląda:

format tabeli

avernet
źródło
Przydatna uwaga: jeśli chcesz kontrolować odstępy między wierszami dts i dds, sprawdź to: stackoverflow.com/q/896815/114029 Te potężne tagi sprawiają, że formy stylowe są naprawdę łatwe i piękne.
Leniel Maccaferri
Zobacz także stackoverflow.com/questions/896815/... szczególnie zaakceptowana odpowiedź stackoverflow.com/a/896840/1037948
drzaus
1
Proszę rozważyć zmianę zaakceptowanej odpowiedzi na to: stackoverflow.com/a/44599527/3853934
Michał Perłakowski

Odpowiedzi:

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
źródło
2
Dzięki! Ta wskazówka CSS pomogła mi sformatować mój formularz Zend bez konieczności kodowania klas dekoratorów formularzy.
devNoise
Wydaje się, że nie można dodać dolnego marginesu ani odstępu między wierszami za pomocą tej metody.
Graeck
7
Polecam dodanie a clear: leftdo stylu dt, aby upewnić się, że pozostaną w linii, nawet jeśli będą musiały się zawijać.
Simon
1
* { ... }Zestawienie sprawia, że wszystko stracić marginesu i dopełnienie, a usunięcie go zniekształca DL. Korzystanie z klasy też nie załatwi sprawy. Wygląda na to, że jeśli chcę czegoś oprócz DL, będę musiał przejść wszędzie bez marginesów i wypełnień ... Lub?
Erk
Zachowuje się to niezręcznie po wybraniu (podwójne kliknięcie) pierwszego słowa w <dd>. Zaznacza także tekst wewnątrz <dt>, chyba że pomiędzy <dt> a <dd> jest spacja (lub & nbsp; jeśli używasz htmlmin).
KFunk
122

Mam rozwiązanie bez użycia pływaków!
sprawdź to na codepen

Mianowicie.

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



Aktualizacja - 3 rd stycznia 2017: rozwiązanie oparte Dodałem flex-box dla problemu. Sprawdź to w połączonym codepen i popraw go zgodnie z potrzebami. Dzięki!

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
źródło
2
Idealny! Ten pływak zła właśnie rozwiązał jeden problem, dając mi dwa nowe (jak żadne pionowe wyrównanie). Fajnie, że już go nie ma.
grypa
8
Działa to dobrze z krótkim tekstem w części DD; jeśli tekst jest zbyt długi, zostanie zawinięty i wyświetlony pod częścią DT.
Riccardo Murri,
3
Działa to nawet wtedy, gdy niektóre elementy listy są puste. Wspaniały!
Tomas Kubes
@ tjm1706: Wydaje mi się, że rozwiązanie oparte na fleksie mogłoby obsłużyć dłuższe litery. dzięki :)
Navaneeth,
@navaneeth Great sol'n. Aby uzyskać kropki między słowem a definicją, dodałem: dl.inline-flex dt: after {content: "................}} Właściwie używam tutaj 150 kropek, aby się upewnić są wystarczające. Musisz także dodać spację: nowrap do dt
MERM
61

Układ siatki CSS

Podobnie jak tabele, układ siatki umożliwia autorowi wyrównywanie elementów w kolumnach i wierszach.
https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout

Aby zmienić rozmiary kolumn, spójrz na grid-template-columnswłaściwość.

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
źródło
To jest dokładnie to, co chcę. caniuse.com/#feat=css-grid - nie tak uniwersalny, jak bym chciał, ale akceptowalnie dobrze obsługiwany.
Iiridayn
59

Jeśli używasz Bootstrap 3 (lub wcześniejszego) ...

<dl class="dl-horizontal">
    <dt>Label:</dt>
    <dd>
      Description of planet
    </dd>
    <dt>Label2:</dt>
    <dd>
      Description of planet
    </dd>
</dl>
silvster27
źródło
14
Jeśli spojrzysz na CSS Bootstrap, możesz dowiedzieć się, jak go stylizować, nawet bez korzystania z Bootstrap, choć uwielbiam ten framework. Oto fragment, ignorujący zapytania o media dla responsywnego projektowania dla uproszczenia przykładu: 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: ellipsis; white-space: nowrap} .dl- horizontal dd {margin-left: 180px}
Tim Franklin
8
dl-horizontalfaktycznie spadła z Bootstrap 4. W BS4, trzeba zamiast użyć klas siatki.
Scribblemacher
21

Zakładając, że znasz szerokość marginesu:

dt { float: left; width: 100px; }
dd { margin-left: 100px; }
rodowy
źródło
2
Nie nazwałbym tego czystym, ponieważ na stałe zapisałeś marginesy.
Liam Dawson,
6
Czysty: o prostym, dobrze zdefiniowanym i przyjemnym kształcie. Odpowiedź jest krótka. Rozwiązuje problem w trzech stwierdzeniach. Nieznajomość marginesu nie była wymogiem w ramach pytania.
przodków
6
Czyste jest zwykle używane do znaczników w tych stylach pytań. W każdym razie witamy w StackOverflow, i zalecam, aby umieścić takie założenia w treści pytania, tylko dla jasności.
Liam Dawson,
8

Ponieważ jeszcze nie widziałem przykładu, który działa w moim przypadku użycia, oto najbardziej kompletne rozwiązanie, jakie udało mi się zrealizować.

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

O dziwo, to nie działa display: inline-block. Podejrzewam, że jeśli chcesz ustawić rozmiar któregokolwiek z dtelementów lub ddelementów, możesz ustawić dlwyświetlanie jako display: flexbox; display: -webkit-flex; display: flex;oraz flexskrót ddelementów i dtelementów jako coś podobnego flex: 1 1 50%i displayjako display: inline-block. Ale nie testowałem tego, więc podejdź ostrożnie.

Tyler Crompton
źródło
6

Screenshot jsFiddle

Zobacz demo jsFiddle

Potrzebowałem listy dokładnie takiej, jak opisano dla projektu, który pokazywał pracownikom firmy, ich zdjęcie po lewej stronie i informacje po prawej stronie. Udało mi się to osiągnąć, stosując elementy psuedo po każdym DD:

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

Ponadto chciałem, aby tekst był wyświetlany tylko po prawej stronie obrazu, bez zawijania pod pływającym obrazem (efekt pseudokolumny). Można to osiągnąć przez dodanie DIVelementu z CSS overflow: hidden;wokół zawartości DDznacznika. Możesz pominąć to dodatkowe DIV, ale zawartość DDtagu zawinie się pod zmiennoprzecinkową DT.

Po dłuższej zabawie byłem w stanie obsłużyć wiele DTelementów na DD, ale nie wiele DDelementów na DT. Próbowałem dodać kolejną opcjonalną klasę do wyczyszczenia dopiero po ostatnim DD, ale kolejnych DDelementach zawiniętych pod DTelementy (nie mój pożądany efekt… Chciałem, aby elementy DTi DDtworzyły kolumny, a dodatkowe DDelementy były zbyt szerokie).

Według wszystkich praw powinno to działać tylko w IE8 +, ale z powodu dziwactwa w IE7 to również tam działa.

Trzeci
źródło
Łatwo jedna z najlepszych odpowiedzi tutaj.
Michael Ahlers
5

Oto kolejna opcja, która działa, wyświetlając dt i dd w linii, a następnie dodając podział linii po dd.

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

Jest to podobne do powyższego rozwiązania Navaneeth, ale przy takim podejściu zawartość nie będzie zgodna jak w tabeli, ale dd będzie podążać za dt natychmiast w każdej linii, niezależnie od długości.

Andrew Downes
źródło
5

Muszę to zrobić, a <dt>zawartość powinna być wyśrodkowana pionowo względem <dd>zawartości. Użyłem display: inline-blockrazem zvertical-align: middle

Zobacz pełny przykład na Codepen tutaj

.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
źródło
3

W zależności od stylu elementów dt i dd możesz napotkać problem: ustawienie ich na tej samej wysokości. Na przykład, jeśli chcesz, ale widoczna ramka na dole tych elementów, najprawdopodobniej chcesz wyświetlić ramkę na tej samej wysokości, jak w tabeli.

Jednym z rozwiązań jest oszustwo i uczynienie każdego wiersza elementem „dl”. (jest to równoważne z użyciem tr w tabeli) Tracimy pierwotne zainteresowanie listami definicji, ale w odpowiedniku jest to łatwy sposób na uzyskanie pseudo-tabel, które są szybko i ładnie zaprojektowane.

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>
entuzjastycznie123
źródło
1
Nie piszesz quatreVingtCinqPts? :)
nicodemus13
2

Znalazłem rozwiązanie, które wydaje mi się idealne, ale wymaga dodatkowych <div>tagów. Okazuje się, że nie trzeba używać <table>tagu do wyrównywania jak w tabeli, wystarczy użyć display:table-row;i display:table-cell;stylów:

<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
źródło
Dlaczego nie jest zgodny z XHTML?
Derick Schoonbee
8
@DerickSchoonbee - Bo dly mają mieć tylko dtS i ddS, jak dzieci. dtjako dzieci mogą mieć tylko elementy wbudowane. dds, z jakiegoś powodu, może mieć elementy na poziomie bloku jako dzieci.
Anthony
6
-1 Niepoprawny HTML 4, XHTML 1 lub HTML 5. Zasadniczo po prostu chcesz tego DIelementu, tak jak ja . Ale z każdym takim elementem wcale nie potrzebujesz ezoterycznych rzeczy, takich jak tabele CSS ... W każdym razie ten element nie istnieje, więc nie powinieneś go używać.
Andreas Rejbrand
@AndreasRejbrand Element DI również nie jest prawidłowy HTML5
AlexMorley-Finch
@ AlexMorley-Finch: Wiem. Dlatego powiedziałem, że chcę taki element (DI pochodzi z XHTML 2.0). Nawiasem mówiąc, Ian Hickson, edytor WHATWG HTML 5, uświadomił mi, że wartość run-inCSS displayjest dokładnie tym, czego chcę (w moim przypadku chcę prostych list metadanych nazwa-wartość).
Andreas Rejbrand
2

Niedawno potrzeby mieszać rolki i bez rolki dt / dd pary poprzez określenie klasy dl-inlineod <dt>elementów, które powinny być stosowane przez wbudowanymi <dd>elementami.

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
źródło
1

Działa na IE7 +, jest zgodny ze standardami i pozwala na różne wysokości.

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

Zobacz JSFiddle .

Justin
źródło
1

to działa, aby wyświetlić je jako tabelę, z ramką, powinno reagować z 3em szerokości pierwszej kolumny. Zawijanie wyrazów dzieli tylko słowa szersze niż kolumna

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

Porównanie <table>z <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>

Mysi
źródło
0

Zwykle zaczynam od następujących czynności, gdy style definiuje listy jako tabele:

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
źródło
-8

Większość sugerowanych przez ludzi tutaj działa, jednak należy umieszczać tylko ogólny kod w arkuszu stylów, a konkretny kod w kodzie HTML, jak pokazano poniżej. W przeciwnym razie skończysz z rozdętym arkuszem stylów.

Oto jak to robię:

Twój kod arkusza stylów:

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

Twój kod 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>

Wygląda tak

RoboTamer
źródło
1
Odradzam powtarzanie marginesu po lewej stronie, kiedy można go przenieść do arkusza stylów - mają one zapobiegać powielaniu kodu. Nadęciu arkusza stylów można przeciwdziałać dzięki spójnemu projektowi; ale nawet wtedy - jeśli zapobieganie wzdęciom ma na celu zaoszczędzenie ruchu sieciowego, nadal jest zapisywane poprzez umieszczenie go w arkuszu stylów zamiast HTML.
Iiridayn
2
-1 przepraszam. Nie używaj stylów wbudowanych, chyba że naprawdę NAPRAWDĘ nie masz innej opcji, w przeciwnym razie skończysz z naprawdę niechlujnym znacznikiem HTML.
MEM
Myślę, że to jest anty-wzór.
Denis Ivanov