Зачем использовать теги списков определений (DL, DD, DT) для HTML-форм вместо таблиц?


85

Недавно я наткнулся на несколько примеров, например:

<dl>
  <dt>Full Name:</dt>
  <dd><input type="text" name="fullname"></dd>
  <dt>Email Address:</dt>
  <dd><input type="text" name="email"></dd>
</dl>

для создания HTML-форм. Почему это? В чем преимущество использования таблиц?


5
Выбранный вами ответ является полностью недопустимой разметкой: в форме отсутствует «действие», «метод», вы не можете разместить там lebel и input таким образом. Пример также будет отображаться в одной строке, так как тегов <br> нет (что, вероятно, не является намерением). Код не только недействителен, но и является супом с точки зрения семантики. В этом случае список определений и таблица семантически эквивалентны. Разница в количестве кода, dl намного короче: pastie.org/1090219, в то время как с таблицей для работы требуется несколько, это неудобно: pastie.org/1090229 (продолжение ...)
srcspider

1
Если вас не волнует семантика, вот как сделать ее действительной и избежать использования идентификаторов: pastie.org/1090225
srcspider

8
srcspider, метод является обязательным, и технически, в зависимости от браузера, действие по умолчанию будет иметь значение self. Формат ответа полностью реализован в CSS. вам не нужны никакие <br />. Все полностью зависит от того, как вы хотите
стилизовать

Почему тег (ы) JavaScript (или CSS)? Теперь название этой страницы начинается с javascript - ...
ᴠɪɴᴄᴇɴᴛ

Ответы:


105

Думаю, семантику решать вам, но на мой взгляд:

Вместо списка определений следует использовать свойства, относящиеся к форме.

<form>
  <label for="fullname">Full Name:</label>
  <input type="text" name="fullname" id="fullname">
  <label for="email">Email Address:</label>
  <input type="text" name="email" id="email">
</form>

Атрибут «for» в теге <label> должен ссылаться на атрибут «id» тега <input>. Обратите внимание: когда метки связаны с полями, щелчок по метке переводит связанное поле в фокус.

Вы также можете использовать такие теги, как <fieldset>, чтобы кластеризовать разделы формы вместе, и <legend>, чтобы подписать набор полей.


26
Вы также можете поместить ввод внутри метки
nickf

17
+1 за то, что был единственным человеком, который предложил логический способ сделать это. «Таблица» обычно не является семантически точной или очень гибкой с точки зрения макета. «Список определений» ближе, но все же немного натянут. Но «входы» и «ярлыки»? Это именно то, что есть!
Чак,

4
Я считаю, что для многих форм таблица / может / быть семантически подходящей. Но не во всех случаях. И, как сказал Чак, таблицы не очень гибкие с точки зрения макета. Если вы собираетесь использовать таблицы для своей формы, убедитесь, что они семантически уместны, а также обязательно используйте метки.
sjstrutt

5
nickf: Да, но гораздо удобнее не вкладывать их, потому что тогда вы можете сделать метку {display: block;}, чтобы получить метки над полями, или label {clear: both; float: left; width: 300px;} для получить табличный вид.
svinto 06

1
svinto: ваш второй пример - это подход, который я обычно использую. Проблема в том, что вы ограничены в ширине ваших этикеток; добавление длинной метки или увеличение размера текста может привести к нежелательным результатам, и именно здесь табличное решение является более гибким.
jeroen

48

Я несколько раз успешно использовал технику, описанную в этой статье .

Я согласен с sjstrutt, что вы должны использовать теги, связанные с формой, такие как labelи formв ваших формах, но в HTML, описанном в его примере, часто не хватает кода, который вы можете использовать в качестве «крючков» для стилизации вашей формы с помощью CSS.

Как следствие этого, я размечу свои формы следующим образом:

<form name="LoginForm" action="thispage">
    <fieldset>
        <legend>Form header</legend>
        <ul>
            <li>
                <label for="UserName">Username: </label>
                <input id="UserName" name="UserName" type="text" />
            </li>
            <li>
                <label for="Password">Password: </label>
                <input id="Password" name="Password" type="text" />
            </li>
        </ul>
    </fieldset>
    <fieldset class="buttons">
        <input class="submit" type="submit" value="Login" />
    </fieldset>
</form>

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


2
Единственная проблема, которую я обнаружил при таком подходе, заключается в том, что иногда вам нужно поместить контент между двумя элементами формы, которые ни к чему не относятся. Семантически вы должны закрыть неупорядоченный список и начать заново, но тогда у вас может быть список, состоящий только из одного дочернего элемента.
Alex

а что насчет списка флажков, где вы его поставите?
Саша

@msony внутри <li>, как и другие входы.
DaveD 07

4
А? Если вам нужны хуки, используйте div. Вот для чего они нужны. Семантика прекрасна (и ее следует использовать!), Но когда вам нужна привязка для стиля, лучше всего использовать диапазон или div, не имеющие семантического значения. Div - это поле, и он предназначен для использования как таковой.
jedd.ahyoung

1
Если я думаю о своих формах как о наборе наборов полей с легендами, каждое из которых содержит список полей ввода с метками или без них, тогда не будет ли приведенный выше html иметь идеальное семантическое значение. Кроме того, у него есть дополнительный бонус в виде отсутствия необходимости в дополнительных именах классов для форматирования.
Hauge

23

Это подмножество проблемы семантики и форматирования. В списке определений указано, что это такое, список связанных атрибутов «ключ-значение», но не указано, как его отображать. Таблица говорит больше о компоновке и способах отображения данных, чем данные внутри. Это ограничивает способ форматирования списка, как за счет чрезмерного указания формата, так и за счет неполного указания того, что это такое.

HTML исторически смешивал семантику с форматированием. Теги шрифтов и таблицы - худшие примеры. Переход к CSS для форматирования и удаление множества тегов чистого форматирования из XHTML в некоторой степени восстанавливает разделение смысла и форматирования. Разделив форматирование на CSS, вы можете отображать один и тот же HTML разными способами, переформатируя его для широкого браузера, небольшого мобильного браузера, печати, обычного текста и т. Д.

Для просветления посетите CSS Zen Garden .


Я бы добавил, что это добавляет намерения, отношения. Позже поисковая система могла бы использовать эту страницу, обнаружить приведенный выше код и узнать, что все это связано.
Чак Конвей,

1
Для dlменя странно то , что он полагается на порядок тегов, чтобы передать связь между термином и его определениями.
ehdv

15

В этом случае метки и входные данные являются вашим семантическим значением, и они стоят сами по себе.

Представьте, что вам нужно прочитать эту веб-страницу слепому человеку. Вы бы не сказали: «Хорошо, у меня есть список определений . Первый термин -« имя »». Вместо этого, вы, вероятно , сказать : «Хорошо , мы имеем форму здесь , и это выглядит как есть набор полей , первый вход имеет маркировку „имя“.»

Вот почему важна семантическая сеть. Это позволяет содержимому страницы точно представлять себя как людям, так и технологиям. Например, есть много плагинов для браузера которые помогают людям быстро заполнять веб-формы с их стандартной информацией (имя, номер телефона и т. Д.). Они редко работают хорошо, если входы не имеют связанных меток.

Надеюсь, это поможет.


15

Использование dl dt, ddдля форм это просто еще один способ структурировать ваши формы, а также ul li, divи table. Вы всегда можете поместить labelв dt. Таким образом вы сохраните элемент формы labelна месте.

<form action="/login" method="post"> 
    <dl>
        <dt><label for="login">Login</label></dt>
        <dd><input type="text" name="login" id="login"/></dd>
        <dt><label for="password">Password</label></dt>
        <dd><input type="password" name="password" id="password"/></dd>  
        <dd><input type="submit" value="Add"/></dd>
    </dl>
</form>

9
Ваш пример противоречит спецификации, так как ваша кнопка отправки принадлежит паролю dt. У вас есть несколько dd, принадлежащих одному dt, и это то, что вы здесь делаете. Я бы поместил кнопку отправки под dl полностью, потому что dl предназначен только для групп «имя-значение», а не для элементов, которые стоят сами по себе, как кнопка отправки.
jedmao

6
Я не думаю, что это противоречит спецификации. У вас может быть столько описаний для каждого термина, сколько вы хотите (и наоборот) w3.org/TR/html401/struct/lists.html#h-10.3 Но вы правы, кнопку отправки следует переместить за пределы определения пароля.
ак.

submit просто не обязательно должен быть на dl. Это не элемент ввода (семантически), а элемент действия.
redben

1
Большой! Это наиболее гибкое и соответствующее стандартам решение. Действительно сложно стилизовать форму, используя только метки и поля ввода, но с помощью <dl> это намного проще.
Эдуардо Кобучи

@ Эдуардо Кобучи: +1 На самом деле это лучший подход. Семантически почти нормально, и мы можем стилизовать его более правильно. Я также могу добавить элемент fieldset.
MEM

14

Списки определений имеют семантическое значение. Они предназначены для перечисления терминов (<dt>) и связанных с ними определений (<dd>). Поэтому в этом случае <dl> отображает семантическое значение контента более точно, чем таблица.


1
Или меньше, так как большинство форм не запрашивают определения терминов (в то время как таблицы являются общими кортежными отношениями).
Quentin

4
Я не согласен с вами, Дэвид, когда в форме есть поле ввода, которое вы должны заполнить своим именем, она спрашивает: «Какое ваше имя?», Поэтому «Определите свое имя» является полностью действительным, поэтому dt> firstname dd> your ввод. Конечно, у определения есть контекст, ты.
redben

9
Правильно используемые теги inputи labelтеги уже однозначны, и включение их в список определений является в лучшем случае тавтологией. Как и фраза «семантическое значение» :)
Ян Маккиннон

@IanMackinnon Согласен с первой частью, но «семантическое значение» конкретно относится к значению за пределами самих элементов (что больше
похоже

6

Списки определений почти никогда не используются, потому что семантически они редко появляются в Интернете.

В вашем случае был опубликован правильный код:

<form>
    <label for="fullname">Full Name:</label>
    <input type="text" name="fullname" id="fullname">
    <label for="email">Email Address:</label>
    <input type="text" name="email" id="email">
</form>

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

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

<dl>
    <dt>HTML</dt>
    <dd>Hypertext Markup Language</dd>
    <dt>CSS</dt>
    <dd>Cascade Stylesheets</dd>
    <dt>PHP</dt>
    <dd>Hypertext Preprocessor</dd>
</dl>

Термин: Определение имени: укажите его в соответствующем поле.
J Wynia

Сожалею. Если вы думаете о термине (dt) как о таких вещах, как «Имя», «Фамилия» и т. Д., Определение (dd) можно рассматривать как предоставленное пользователем.
J Wynia,

4

Отчасти причина использования <dl> для разметки формы состоит в том, что с <dl> гораздо проще выполнять причудливые трюки с макетом CSS, чем с <table>. Во-вторых, он лучше отражает семантику формы (список пар метка / поле), чем таблица.

Хорошо, ненависть к столу тоже часть этого.


2

Иногда список определений просто представляет информацию желаемым образом, а таблица - нет. Лично я, вероятно, не стал бы использовать список определений для формы, если он не соответствует стилю сайта.


2

Практически все формы являются табличными. Вы когда-нибудь видели не табличную форму? В рекомендациях, которые я прочитал, предлагается использовать тег table для табличного представления, и именно для этого нужны формы, календари и электронные таблицы. А теперь вместо таблиц используют DD и DT? Куда идет Интернет ?! :)


7
Я думаю, что это пример табличной фобии;) Я видел табличные данные, состоящие из вложенных <ul>и <ol>стилизованных тоннами CSS только потому, что таблицы - зло .
el.pescado

1
или потому, что <ul> и <ol> обычно гораздо более гибкие с точки зрения стилизации и перекомпоновки макета без изменения структуры HTML.
Шон

0

Данные списка таблиц будут такими:

<table>
<tr>
	<td class="title">Name: </td>
	<td class="text">John Don</td>
</tr>
<tr>
	<td class="title">Age: </td>
	<td class="text">23</td>
</tr>
<tr>
	<td class="title">Gender: </td>
	<td class="text">Male</td>
</tr>
<tr>
	<td class="title">Day of Birth:</td>
	<td class="text">12th May 1986</td>
</tr>
</table>

И вы можете использовать данные списка тегов DL, DT, DD следующим образом:

<dl>
	<dt>Name: </dt>
	<dd>John Don</dd>
	
	<dt>Age: </dt>
	<dd>23</dd>
	
	<dt>Gender: </dt>
	<dd>Male</dd>
	
	<dt>Day of Birth:</dt>
	<dd>12th May 1986</dd>
</dl>


3
Спасибо за ссылку, но было бы лучше включить сюда и код, потому что в какой-то момент срок действия ссылки может истечь. Кстати, пример преувеличивает разницу, потому что они могли использовать <th/>элементы для этикеток ...
ᴠɪɴᴄᴇɴᴛ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.