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

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

Сам список подробно разобран на странице про тег dl, а урок Термин dt: как записать название в списке dl объясняет, когда вместо обычного списка нужна такая пара. Здесь только то, что относится к dt: где его можно записать, что допустимо внутри, как закрепить, пронумеровать и дать ему якорь.

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

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

Тег dt блочный: display: block, margin: 0, жирность обычная (400), отступа слева нет. Это отличает его от dd, который сдвинут вправо на 40px. Все остальные свойства (шрифт, цвет, рамка) dt наследует от родителя, поэтому вид названия настраивается только в CSS.

CSS браузера
dt {
  display: block;
}

Пример: название в dt и его стили по умолчанию

Результат

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

Где записать тег dt: прямо в dl или в div внутри dl

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

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

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

Результат

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

Несколько тегов dt подряд: синонимы и общее описание

Несколько dt подряд означают синонимы: у них одно общее описание в dd. Так записывают сокращение и полное название, термин и его перевод. По умолчанию каждый dt выводится на своей строке. Чтобы собрать их в одну, dt делают display: inline, а разделитель добавляют псевдоэлементом dt + dt::before: он срабатывает только для второго и следующих названий.

HTML
<dl>
  <dt>CSS</dt>
  <dt>Каскадные стили</dt>
  <dd>Язык оформления страниц</dd>
</dl>
CSS
dt {
  display: inline;
}
dt + dt::before {
  content: ' / ';
}

Пример: синонимы в одной строке

Результат

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

Что допустимо внутри тега dt: span, strong, abbr, a, img

Правило стандарта: внутри dt допустим любой поток, но без заголовков (h1-h6, hgroup) и без секций (header, footer, nav, section, article). Всё остальное проходит проверку: span, strong, abbr, a, img, code, button, а также p, ul и div. Но название должно оставаться короткой строкой. Если в dt попадает абзац или список, пара «название и значение» теряет смысл.

HTML
<dt>
  <strong>Цвет</strong>
  <span>(основной)</span>
</dt>

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

Результат

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

Тег dfn внутри dt: термин и abbr с расшифровкой

Термин, который тут же определяется, отмечают тегом dfn: так в разметке видно, что в этом месте объясняется само слово. Если у термина есть расшифровка, abbr записывают внутри dfn (или наоборот). Оба порядка допустимы. Сам dfn нельзя вкладывать в другой dfn. Если на термин будут ссылаться, id задают у dfn, а ссылку a можно обернуть вокруг dfn.

HTML
<dt>
  <dfn>
    <abbr title="HyperText Markup Language">HTML</abbr>
  </dfn>
</dt>
<dd>Язык разметки страниц</dd>

Пример: dfn и abbr в dt

Результат

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

Закрывающий тег dt: что его заканчивает и когда dd теряется

Закрывающий </dt> можно не писать, если сразу за названием идёт dt или dd. Браузер сам закроет открытое название. Опасность в другом: p и div внутри dt закрываются тегом dd, а вот ul и li не закрываются. Незакрытый ul поглощает dd, и тот оказывается внутри li, а пара теряется. Поэтому всё, что глубже обычной строки, закрывают явно.

HTML
<dl>
  <dt>A
  <dt>B
  <dd>D
</dl>

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

Результат

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

Стили тега dt: жирность, цвет и двоеточие

Название можно выделить любыми свойствами: жирность, цвет, размер, регистр, рамка. Двоеточие после названия лучше добавлять псевдоэлементом dt::after, чтобы не засорять разметку: тогда его не нужно копировать в текст, а при смене оформления оно убирается одним правилом. Вместе с жирностью (font-weight: 700) такой dt уверенно отделяется от dd.

CSS
dt {
  font-weight: 700;
}
dt::after {
  content: ':';
}

Пример: стили названия dt

Результат

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

Нумерация тегов dt через counter: группы и синонимы

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

CSS
dl {
  counter-reset: t;
}
dt:first-child::before,
dd + dt::before {
  counter-increment: t;
  content: counter(t) '. ';
}

Пример: номера у групп и у синонимов

Результат

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

Ширина тега dt в сетке: max-content и обрезка многоточием

Когда dl разложен по сетке, ширина колонки названий зависит от самого длинного dt. Её можно задать числом (110px), а можно доверить браузеру: max-content растягивает колонку по самому длинному названию и не переносит его. Если длинные названия нужно уместить в узкую колонку, их обрезают многоточием (white-space: nowrap, overflow: hidden, text-overflow: ellipsis), а полный текст записывают в атрибут title.

CSS
dl {
  display: grid;
  grid-template-columns: max-content 1fr;
  gap: 0 12px;
}
dd {
  margin: 0;
}

Пример: ширина колонки названий

Результат

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

Закреплённый тег dt: sticky внутри dl и внутри div

Название можно закрепить при прокрутке: position: sticky и top: 0. Но результат зависит от разметки. Если все dt записаны прямо в dl, закрепляющей областью служит весь список, и все названия собираются на одном месте друг на друге. Если каждую группу обернуть в div, название закреплено только в пределах своей группы и уходит вместе с ней.

CSS
dt {
  position: sticky;
  top: 0;
  background: #fff;
}

Пример: закреплённый dt с div и без

Результат

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

Якорь на теге dt: id, :target и scroll-margin-top

Название удобно использовать как якорь: id у dt даёт ссылку вида #цвет, а псевдокласс :target подсвечивает такой термин. Отдельно подсвечивают и описание через dt:target + dd. Если у страницы есть закреплённая шапка, она перекрывает название, к которому перешли. Исправляет это scroll-margin-top у dt: он оставляет место сверху.

HTML
<dt id="color">Цвет</dt>
<dd>Зелёный</dd>

<a href="#color">К названию Цвет</a>
CSS
dt:target {
  background: #fff1ea;
  scroll-margin-top: 36px;
}

Пример: якорь на названии под закреплённой шапкой

Результат

Выберите вариант отступа и нажмите «К названию»: под результатом положение названия относительно шапки.

Тег dt в JavaScript: фильтр глоссария по названию

Фильтр глоссария скрывает не только dt, но и все идущие за ним dd, иначе от скрытого названия остаётся одно описание. Для этого после каждого названия берут nextElementSibling и скрывают его, пока он остаётся dd. Скрытие делают атрибутом hidden: он работает, пока у dt и dd нет собственного display (например, grid), иначе правило CSS его перебивает.

JavaScript
const q = input.value.toLowerCase();
for (const dt of dl.querySelectorAll('dt')) {
  const show = dt.textContent.toLowerCase().includes(q);
  let n = dt;
  do {
    n.hidden = !show;
    n = n.nextElementSibling;
  } while (n && n.tagName === 'DD');
}

Пример: фильтр глоссария по названию

Результат

Введите текст или нажмите кнопку: под результатом сколько названий показано.

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

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

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

Вопросы про тег dt: раскрытие по клику и язык термина

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

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

Внутрь dt записывают button с атрибутом aria-expanded, а dd скрывают через hidden. Название остаётся dt. Роль и tabindex у самого dt не нужны: кнопка внутри уже доступна с клавиатуры.

HTML
<dt>
  <button type="button" aria-expanded="false">
    Можно ли вернуть товар?
  </button>
</dt>
<dd hidden>Да, в течение 14 дней.</dd>
JavaScript
button.onclick = () => {
  const open = button.getAttribute('aria-expanded') !== 'true';
  button.setAttribute('aria-expanded', open);
  dd.hidden = !open;
};

Пример: вопросы и ответы с раскрытием

Результат

Нажмите на вопрос или на кнопку над списком: под результатом сколько ответов открыто и какой aria-expanded.

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

Английским терминам задают lang="en": программы чтения могут переключить голос на английский, а в CSS такие названия выбирает dt:lang(en). Без lang селектор не отличает английское название от русского. Метку языка можно добавить псевдоэлементом dt:lang(en)::after.

HTML
<dt lang="en">margin</dt>
<dd>Внешний отступ</dd>
CSS
dt:lang(en) {
  font-style: italic;
}
dt:lang(en)::after {
  content: ' (англ.)';
}

Пример: выделение английских терминов

Результат

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

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

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

ОшибкаЧто происходитКак исправить
dt без dd после негоОшибка валидатора: у названия нет описанияЗаписать dd или убрать dt
dt в div, section или li вне dlОшибка валидатора, браузер не считает это списком определенийЗаписать dt в dl или в div внутри dl
dt внутри dddt закрывает открытый dd, список ломается, валидатор выдаёт ошибкуДля вложенных названий записать внутри dd отдельный dl
h1–h6, hgroup, header, footer, nav или section внутри dtОшибка валидатора: заголовки, секции, header и footer в dt запрещеныЗаписать название текстом или в strong
dfn внутри dfnОшибка валидатораОставить один dfn
Незакрытый ul внутри dtdd оказывается внутри li, пара потерянаЗакрыть </li>, </ul> и </dt>
Абзацы и списки в dtНазвание разрастается до нескольких строкПеренести пояснение в dd
Считают, что dt по умолчанию жирныйНазвание выводится обычным шрифтомЗадать font-weight в CSS
Двоеточие записано в тексте dtОно попадает в текст, фильтр и ссылкиДобавить его через dt::after
sticky у dt без divВсе названия закреплены друг на другеОбернуть каждую группу в div
Нумерация dt::before для всех названийУ синонимов разные номераСчитать dt:first-child и dd + dt
Якорь на dt под закреплённой шапкойШапка перекрывает названиеДобавить scroll-margin-top
role="button" или tabindex у dt для раскрытияrole="button" — ошибка валидатора; tabindex без обработчика клавиш не даёт раскрыть описание с клавиатурыЗаписать button внутри dt
role="term" у dtПредупреждение валидатора: роль лишняяУбрать role
Категория
Поделиться в социальных сетях

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

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

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

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

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