Як створити стиль dt та dd, щоб вони знаходилися на одній лінії?


212

Як я можу стилізувати наступне:

<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 Ці потужні теги роблять стилізаційні форми справді легкими та красивими.
Леніел Маккаферрі

Також см stackoverflow.com/questions/896815 / ... особливо обслуговується відповідь stackoverflow.com/a/896840/1037948
drzaus

1
Будь ласка , зверніть увагу зміна обслуговується відповідь на це: stackoverflow.com/a/44599527/3853934
Міхал Perłakowski

Відповіді:


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 без необхідності кодування класів декораторів форми.
devNoise

Здається, ви не зможете додати нижній запас або простір для буксирування з "рядків" за допомогою цього методу.
Грейк

7
Я рекомендую додати clear: leftстиль dt до того, щоб вони залишалися в рядку, навіть якщо їх потрібно завернути.
Саймон

1
* { ... }Заява робить все втратити поля і відступи, і видалення його деформує DL. Використання класу теж не зробить фокус. Здається, що якщо я хочу чогось, окрім DL, мені доведеться всюди проходити без запасів і прокладок ... Або?
Ерк

Це поводиться незручно, коли ви вибираєте (подвійним клацанням) перше слово в <dd>. Він також вибирає текст усередині <dt>, якщо між <dt> та <dd> не використовується пробіл (або & nbsp; якщо ви використовуєте htmlmin).
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: рішення , засноване я додав прогинається ящик для цієї проблеми. Перевірте це у пов'язаному кодексі та уточнити його відповідно до потреб. Дякую!

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
Ідеально! Цей злий поплавок просто вирішив одну проблему, даючи мені два нових (як, наприклад, вертикальне вирівнювання). Приємно, що зараз його немає.
грип

8
Це добре працює з коротким текстом у частині DD; якщо текст занадто довгий, він загортається і відображається під DT частиною.
Ріккардо Муррі

3
Це працює, навіть якщо деякі елементи списку порожні. Чудово!
Томаш Кубес

@ tjm1706: Я думаю, що рішення на основі флексу може обробляти більш тривалий текст. дякую :)
Navaneeth

@navaneeth Великий солн. Для отримання крапок між словом та визначенням я додав: dl.inline-flex dt: after {content: "................"} Я фактично використовую тут 150 крапок, щоб забезпечити там достатньо. Вам також потрібно додати пробіл: nowrap до dt
MERM

61

Макет сітки CSS

Як і таблиці, компонування сітки дозволяє автору вирівняти елементи у стовпці та рядки.
https://developer.mozilla.org/en-US/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 - не настільки універсальний, як хотілося б, але терпимо добре підтримується.
Ірідайн

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
Якщо ви подивитеся на CSS Bootstrap, ви можете отримати уявлення про те, як його стилізувати, навіть не використовуючи 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: зліва; ширина: 160px; ясно: зліва; вирівнювання тексту: право; перелив: приховано; переповнення тексту: еліпсис; пробіл: nowrap} .dl- horizontal dd {margin-left: 180px}
Тім Франклін

8
dl-horizontalбув фактично виключений з Bootstrap 4. У BS4, вам потрібно використовувати класи сітки замість цього.
Scribblemacher

21

Припускаючи, що ви знаєте ширину поля:

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

2
Я б не називав це чистою, тому що ви жорстко кодували поля.
Ліам Доусон

6
Чистий: має просту, чітко виражену і приємну форму. Відповідь коротка. Він вирішує проблему в трьох твердженнях. Невідома маржа не була вимогою як частина питання.
родовий

6
Очищення зазвичай використовується для розмітки в цих стилях питань. У будь-якому випадку, ласкаво просимо до 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-елементи після кожного DD:

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

Крім того, я хотів, щоб текст відображався праворуч від зображення, не загортаючись під плаваюче зображення (ефект псевдо колонки). Це можна досягти, додавши DIVелемент із CSS overflow: hidden;навколо вмісту DDтегу. Ви можете опустити це додаткове DIV, але вміст DDтегу буде обговорюватися під плаваючим DT.

Погравши з ним деякий час, я зміг підтримувати кілька DTелементів на DD, але не декілька DDелементів на DT. Я спробував додати ще один необов'язковий клас, який слід очистити лише після останнього DD, але наступні DDелементи, загорнуті під DTелементи (не мій бажаний ефект… Я хотів, щоб DTі DDелементи формували стовпці, а зайві DDелементи були занадто широкими).

За всіма правами, це має працювати лише в IE8 +, але завдяки химерності в IE7 вона працює і там.


Тут просто одна з найкращих відповідей.
Майкл Алерс

5

Ось ще один варіант, який працює, показуючи dt та dd inline, а потім додаючи розрив рядка після dd.

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

Це схоже на рішення Navaneeth, наведене вище, але, використовуючи такий підхід, вміст не буде вирівнюватися як у таблиці, але dd буде слідувати dt негайно у кожному рядку, незалежно від довжини.


5

Мені потрібно це зробити і мати <dt>вміст вертикально по центру, відносно <dd>змісту. Я використовував display: inline-blockразом зvertical-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". .

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 як дітей. dts може мати лише вбудовані елементи, як діти. dds, чомусь, може мати елементи блокового рівня як діти.
Ентоні

6
-1 Недійсний HTML 4, XHTML 1 або HTML 5. В основному, ви просто хочете DIелемент, як я . Але з будь-яким подібним елементом вам взагалі не потрібні езотеричні речі, такі як таблиці CSS ... Як би там не було, цей елемент не існує, тому не слід його використовувати.
Андреас Рейбранд

@AndreasRejbrand Елемент "DI" також недійсний HTML5
AlexMorley-Finch

@ AlexMorley-Finch: Я знаю. Тому я сказав, що хочу такий елемент (DI - від XHTML 2.0). До речі, Іен Хіксон, редактор WHATWG HTML 5, дав мені зрозуміти, що значення run-inCSS display- це саме те, що я хочу (у моєму випадку я хочу прості списки метаданих імен-значень).
Андреас Рейбранд

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>
    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
Я б радив не повторювати залишене поле, коли його можна перемістити до таблиці стилів - вони є там, щоб запобігти дублюванню коду. Стиль листівки стилю можна протидіяти послідовному дизайну; але навіть тоді - якщо запобігання здуття - це збереження мережевого трафіку, він все одно зберігається, вставляючи його в таблицю стилів замість HTML.
Ірідаїн

2
-1 вибачте. Не використовуйте вбудовані стилі, якщо у вас дійсно НЕ є інший варіант, інакше у вас вийде по-справжньому безладна розмітка html.
MEM

Я думаю, що це анти-закономірність.
Денис Іванов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.