Тег dd в HTML: что это, что записать внутри и как оформить

Тег dd (от английского description details, «детали описания») записывает описание, значение или определение для названия dt. Это парный тег, а закрывающий </dd> можно опустить, если сразу за описанием идёт другой dd или dt либо заканчивается родитель. Браузер выводит описание с новой строки со сдвигом вправо на 40px, шрифт у него обычный.

Весь список разобран на странице про тег dl, название на странице про тег dt, а урок Описание dd: когда использовать список определений вместо обычного списка объясняет, когда вместо обычного списка нужны пары. Здесь только то, что относится к dd: что допустимо внутри, как он закрывается, как задать расстояния и нумерацию и как выбрать нужные описания в CSS.

HTML
<dl>
  <dt>Цвет</dt>
  <dd>Зелёный</dd>
</dl>

Тег dd в HTML: что это и как браузер выводит описание

Тег dd блочный: display: block, вертикальные отступы нулевые, слева задан отступ margin-inline-start: 40px. Жирности у описания нет, вид задают в CSS. Пустой dd проходит проверку и занимает 0px высоты, а dd с атрибутом hidden скрывается целиком: display: none.

CSS браузера
dd {
  display: block;
  margin-inline-start: 40px;
}

Пример: описание в dd, пустой dd и dd с hidden

Результат

Выберите запись: под результатом показано, как браузер вывел dd.

Где записать тег dd: после dt, в dl или в div группы

Родитель у dd один из двух: dl или div, который сам находится прямо в dl и вмещает одну группу. Порядок тоже важен: группа начинается с dt, поэтому dd первым и dd без dt валидатор считает ошибкой. Запись dd в div вне dl, в li или в другом dd тоже неверна: для вложенных описаний внутри dd записывают отдельный dl.

HTML
<dl>
  <div>
    <dt>Цвет</dt>
    <dd>Зелёный</dd>
  </div>
</dl>

Пример: где допустим dd

Результат

Выберите запись: вверху её код, под результатом написано, допустима ли она.

Несколько тегов dd подряд: значения одного термина

Несколько dd подряд записывают, когда у одного названия несколько значений: языки, телефоны, цвета. Каждое значение получает свой dd, а не общий абзац с <br>: так значения можно выбрать, оформить и пересчитать по отдельности. По умолчанию каждый dd выводится на своей строке. Чтобы собрать их в одну, делают display: inline, обнуляют margin (у inline-описания остаётся отступ слева 40px) и добавляют запятую через dd + dd::before. Обратный случай, когда одно описание у нескольких названий, разобран в разделе про синонимы в теге dt.

HTML
<dl>
  <dt>Языки</dt>
  <dd>HTML</dd>
  <dd>CSS</dd>
  <dd>JavaScript</dd>
</dl>
CSS
dd {
  display: inline;
  margin: 0;
}
dd + dd::before {
  content: ', ';
}

Пример: три значения одного названия

Результат

Выберите вариант: вверху правила, под результатом написано, на скольких строках три dd.

Что допустимо внутри тега dd: p, ul, table, form, details

Внутри dd допустим любой поток: абзацы p, списки, таблицы table, формы, картинки, figure, цитаты blockquote, блоки pre, details и hr. Не подходят main, dt, другой dd и теги, которым нужен свой родитель, например li или td. Поэтому dd подходит для длинных ответов, примеров и даже форм, а не только для одной строки текста.

HTML
<dd>
  <p>Первый абзац</p>
  <ul>
    <li>красный</li>
    <li>зелёный</li>
  </ul>
</dd>

Пример: что допустимо внутри dd

Результат

Выберите запись: вверху код, под результатом написано, допустима ли она. Картинка в примере нарисована квадратом.

Заголовки и секции внутри тега dd: отличие от dt

В dt заголовки и секции запрещены, а в dd допустимы: h1-h6, section, article, header, footer, nav, aside и address. Не проходит только main. Заголовок внутри dd получает свои стили: h3 при шрифте 16px имеет размер 18.72px и такие же отступы сверху и снизу. Такая запись оправдана, когда описание само как раздел с подзаголовками. Для обычного значения достаточно текста или p.

HTML
<dd>
  <h3>Состав</h3>
  <p>Вода, соль, сахар</p>
</dd>

Пример: заголовки и секции в dd

Результат

Выберите запись: вверху код, под результатом написано, допустима ли она, и размер заголовка, который вывел браузер.

Абзацы p внутри тега dd: лишние отступы и как их убрать

У абзаца p внешний отступ 1em (16px при шрифте 16px), а у dd вертикальных отступов нет, поэтому отступ абзаца проходит наружу. Между названием и описанием появляется зазор 16px, которого без p нет, а такой же зазор остаётся снизу перед следующим dt. Лишнее убирают у первого и последнего абзаца: dd p:first-child и dd p:last-child. Между самими абзацами отступ остаётся.

CSS
dd p:first-child {
  margin-top: 0;
}
dd p:last-child {
  margin-bottom: 0;
}

Пример: зазор от абзаца внутри dd

Результат

Выберите правило: вверху код, под результатом расстояние от названия до первого абзаца и от последнего абзаца до следующего названия.

Вложенный dl внутри тега dd: накопление отступов

Вложенный список определений записывают внутри dd, а не рядом с ним. Каждый уровень сдвигает описание ещё на 40px: на втором уровне отступ 80px, на третьем 120px, и на узком экране для текста остаётся мало места. Отступ уменьшают одним правилом: dd dd меняет только вложенные описания, а dd без уточнения меняет все уровни, включая первый.

HTML
<dl>
  <dt>Фронтенд</dt>
  <dd>
    <dl>
      <dt>React</dt>
      <dd>Библиотека интерфейсов</dd>
    </dl>
  </dd>
</dl>
CSS
dd dd {
  margin-inline-start: 16px;
}

Пример: три уровня вложенных dl

Результат

Выберите правило: вверху код, под результатом отступ слева у dd на каждом уровне.

Закрывающий тег dd: что закрывается само, а что поглощает dt

Закрывающий </dd> можно не писать, если сразу за описанием идёт dd или dt либо кончается родитель. Но следующий dt закрывает dd только тогда, когда внутри не осталось открытых тегов, кроме p и div: они закрываются сами. Всё остальное остаётся открытым и поглощает следующий dt вместе с его dd: ul с li, form, blockquote, details, pre, figure, заголовки, секции, таблица и вложенный dl. Поэтому после такого содержимого закрывающие теги пишут явно.

HTML
<dl>
  <dt>A
  <dd><ul><li>Пункт
  <dt>B
  <dd>D
</dl>

Пример: какое дерево построил браузер

Результат

Выберите запись: вверху код, под результатом дерево, которое построил браузер, и число названий dt прямо в dl.

Расстояние между группами: margin у тега dd и схлопывание

У dd и dt вертикальных отступов нет, поэтому расстояния между группами задают сами, а правила для отступов по умолчанию описаны в разделе про тег dl. Вертикальные margin соседних dd схлопываются: margin-bottom: 20px и margin-top: 30px дают 30px, а не 50px. Если зазор нужен только между группами, а не между значениями одной группы, его задают последнему dd группы: dd:has(+ dt). Для списка с div-обёртками проще задать margin-bottom самому div.

CSS
dd:has(+ dt) {
  margin-bottom: 12px;
}

Пример: расстояние между dd и между группами

Результат

Выберите правило: вверху код, под результатом расстояние между dd одной группы и между группами.

Выбор тега dd в CSS: dt + dd, first-of-type и группы

Чтобы выбрать первое описание каждой группы, подходит dt + dd. А вот dd:first-of-type и dd:last-of-type считают соседей в одном родителе, и без div-обёрток родитель у всех групп общий: выбирается один dd на весь dl. Последний dd группы выбирают так: dd:has(+ dt) и dd:last-child для последней группы. Если каждая группа в своём div, работают и dd:last-child, и dd:last-of-type.

CSS
dt + dd {
  font-weight: 600;
}
dd:has(+ dt),
dd:last-child {
  margin-bottom: 12px;
}

Пример: выбор одного dd в каждой группе

Результат

Выберите селектор: вверху код, под результатом сколько dd выбрано и в скольких из трёх групп выбран ровно один.

Маркеры и нумерация тегов dd: list-item и counter

Маркеры у описаний появляются, если задать display: list-item и list-style. Но нумерация decimal идёт через весь dl и не начинается заново с новой группы: получаются номера 1, 2, 3, 4. Чтобы каждая группа считала с единицы, используют свой счётчик: counter-reset на dt и counter-increment на dd, а номер выводят в dd::before.

CSS
dt {
  counter-reset: v;
}
dd {
  counter-increment: v;
}
dd::before {
  content: counter(v) ') ';
}

Пример: маркеры и нумерация описаний

Результат

Выберите вариант: вверху код, под результатом номера описаний по порядку.

Длинное содержимое в теге dd: слово, pre, таблица, картинка

Длинное слово, блок pre, таблица и картинка шире экрана выходят за край dd и дают горизонтальную прокрутку страницы. Для слова подходит overflow-wrap: anywhere, для кода overflow-x: auto у pre, для таблицы обёртка с overflow-x: auto, для картинки max-width: 100%. Прокрутка остаётся только внутри блока.

CSS
dd {
  overflow-wrap: anywhere;
}
dd pre {
  overflow-x: auto;
}
dd img {
  max-width: 100%;
  height: auto;
}

Пример: длинное содержимое dd и прокрутка страницы

Результат

Выберите вариант: вверху правило, под результатом написано, появилась ли горизонтальная прокрутка у страницы.

Тег dd в JavaScript: словарь «термин и значения» из dl

Название и описания в dl стоят рядом как братья, а не вложены друг в друга. Поэтому словарь «название и значения» собирают одним проходом по dl.children: dt создаёт ключ с пустым массивом, а каждый следующий dd добавляет значение в этот массив. Если группы обёрнуты в div, вместо children берут dl.querySelectorAll('dt, dd'), но тогда вложенный dl тоже попадёт в выборку.

JavaScript
const data = {};
let key;
for (const el of dl.children) {
  if (el.tagName === 'DT') {
    key = el.textContent;
    data[key] = [];
  } else {
    data[key].push(el.textContent);
  }
}

Пример: словарь из названий и описаний dl

Результат

Нажмите кнопку: под результатом словарь, который собрал скрипт из текущего списка.

Атрибуты тега dd: только глобальные

У dd нет собственных атрибутов, работают только глобальные.

АтрибутСтатусЧто делаетПример записи
id, class, title, lang, tabindex, hidden, data-*актуаленГлобальные атрибуты: hidden скрывает описание, lang задаёт язык значения, id даёт якорь<dd lang="en">
itempropс условиемРаботает только внутри элемента с itemscope, иначе валидатор считает это ошибкой<dd itemprop="description">
role="definition"лишнийУ dd такая роль задана самим тегом, валидатор выдаёт предупреждение<dd role="definition">
role="listitem"недопустимВалидатор считает эту роль ошибкой для dd, а ещё требует список-родитель<dd role="listitem">
align, nowrapнедопустимДля dd такие атрибуты не определены, выравнивание и перенос задают в CSS<dd nowrap>

Вопросы про тег dd: details без JavaScript и подсветка группы

Два вопроса, которых нет в разделах выше: как сделать раскрывающееся описание без скриптов и как подсветить всё описание группы при наведении на название.

Как сделать раскрывающееся описание без JavaScript?

Внутрь dd записывают details с summary. Название dt остаётся на виду, а текст описания раскрывается по клику, при этом скрипт и атрибут aria-expanded не нужны: браузер сам считает состояние. Такой вариант проще кнопки внутри dt, но кликать нужно по summary, а не по названию.

HTML
<dt>Доставка</dt>
<dd>
  <details>
    <summary>Сроки</summary>
    От 1 до 3 дней.
  </details>
</dd>

Пример: описание в details внутри dd

Результат

Нажмите на заголовок описания или на кнопку: под результатом число раскрытых блоков.

Как подсветить описание группы при наведении на название?

Правило dt:hover ~ dd подсвечивает все описания после названия, включая чужие группы. Правило dt:hover + dd подсвечивает только первый dd, а остальные значения группы остаются без фона. Подсветка всей группы получается, когда она обёрнута в div: dl > div:hover > dd. Подсвечивается при наведении на любую часть группы, а не только на название. Запись div:hover dd без dl > опасна: она сработает и при наведении на любой внешний div, в который вложен список.

CSS
dl > div:hover > dd {
  background: #fff1ea;
}

Пример: подсветка группы при наведении

Результат

Выберите правило и наведите курсор на название A: под результатом сколько dd подсветилось и сколько их у этой группы.

Частые ошибки с тегом dd

Типичные ошибки с тегом dd и как их исправить.

ОшибкаЧто происходитКак исправить
dd первым или без dtОшибка валидатора: группа начинается с dtЗаписать dt перед описанием
dd в div, li или section вне dlОшибка валидатора, браузер не считает это списком определенийЗаписать dd в dl или в div внутри dl
dd внутри ddБраузер закрывает первый dd, валидатор выдаёт ошибкуДля вложенных описаний записать отдельный dl
main или dt внутри ddОшибка валидатораУбрать main, для вложенных названий записать dl
Значения одного названия через br в одном ddЗначения слиты, их нельзя выбрать по отдельностиЗаписать каждое значение в свой dd
Незакрытые ul, form, blockquote, details, table или вложенный dl в ddСледующий dt оказывается внутри ddЗакрыть вложенные теги явно
p в dd без правки отступовМежду названием и описанием зазор 16pxОбнулить margin у dd p:first-child и dd p:last-child
dd:first-of-type для первого описания группыВыбран один dd на весь dlИспользовать dt + dd
dd:last-of-type для последнего описания группыВыбран один dd на весь dlИспользовать dd:has(+ dt) или обёртки div
list-style: decimal у dd для нумерацииНомера идут через все группыСвой счётчик со сбросом на dt
display: inline у dd без margin: 0Остаётся отступ слева 40pxДобавить margin: 0
Длинное слово, pre или таблица в ddСтраница получает горизонтальную прокруткуЗадать overflow-wrap или overflow-x: auto
dt:hover ~ dd для подсветки группыПодсвечены описания всех следующих группОбернуть группу в div и взять dl > div:hover > dd
role="definition", nowrap или align у ddПредупреждение или ошибка валидатораУбрать атрибуты, остальное задать в CSS
Категория
Поделиться в социальных сетях

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×