Как стилизовать 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 Эти мощные теги делают формы стилей действительно простыми и красивыми.
Лениэль Маккаферри

Также смотрите stackoverflow.com/questions/896815/… в частности, принятый ответ stackoverflow.com/a/896840/1037948
drzaus

1
Пожалуйста, рассмотрите возможность изменения принятого ответа на этот вопрос: stackoverflow.com/a/44599527/3853934
Михал Перлаковский

Ответы:


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

Похоже, что вы не можете добавить нижнее поле или отступ для буксировки "строк", используя этот метод.
Грэк

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: решение , основанное я добавил прогибается ящик для этой проблемы. Проверьте это в связанном 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
Отлично! Этот злой поплавок только что решил одну проблему, дав мне две новые (вроде без вертикального выравнивания). Приятно, что это прошло.
грипп

8
Это хорошо работает с коротким текстом в части DD; если текст слишком длинный, он обернется и отобразится под частью DT.
Риккардо Мурри

3
Это работает, даже если некоторые элементы списка пусты. Большой!
Томас Кубес

@ tjm1706: Я думаю, что решение на основе flex может обрабатывать более длинные текстовые регистры. спасибо :)
Navaneeth

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

61

CSS Grid layout

Как и таблицы, макет сетки позволяет автору выравнивать элементы по столбцам и строкам.
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 - не такой универсальный, как хотелось бы, но сносно поддерживается.
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
Если вы посмотрите на 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: left; ширина: 160px; очистить: left; выравнивание текста: right; переполнение: скрытое; переполнение текста: многоточие; пробел: nowrap} .dl- горизонтальный dd {margin-left: 180px}
Тим Франклин,

8
dl-horizontalбыл фактически исключен из Bootstrap 4. В BS4, вам нужно использовать классы сетки вместо этого.
Scribblemacher

22

Предполагая, что вы знаете ширину поля:

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». (это эквивалентно использованию 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?
Дерик Шунби

8
@DerickSchoonbee - потому что dls могут иметь только dts и dds как дети. dtВ качестве дочерних элементов могут быть только встроенные элементы. 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

Я недавно нужно смешивать встроенные и не рядный дт / дд пар, указав класс 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
Я бы посоветовал не повторять поле margin-left, когда его можно переместить в таблицу стилей - они предназначены для предотвращения дублирования кода. Раздражению таблиц стилей можно противостоять с последовательным дизайном; но даже тогда - если предотвращение вздутия означает сохранение сетевого трафика, оно все равно сохраняется, помещая его в таблицу стилей вместо HTML.
Иридайн

2
-1 прости. Не используйте встроенные стили, если у вас действительно ДЕЙСТВИТЕЛЬНО нет другого выбора, в противном случае вы получите действительно грязную HTML-разметку для начала.
MEM

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