Семантика и структура пар "имя-значение"

Это - вопрос, с которым я боролся некоторое время. Что надлежащий путь состоит в том, чтобы повысить пары имя/значение?

Я люблю <dl> элемент, но он представляет проблему: нет никакого способа разделить одну пару от другого - у них нет уникального контейнера. Визуально, код испытывает недостаток в определении. Семантически, тем не менее, я думаю, что это - корректная разметка.

<dl>
    <dt>Name</dt>
    <dd>Value</dd>
    <dt>Name</dt>
    <dd>Value</dd>
</dl>

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

Мы можем указать на таблицы. Можно было утверждать, что пары "имя-значение" являются табличными данными. Это кажется неправильным мне, но я вижу аргумент. Однако HTML не дифференцирует имя от значения, кроме положения, или с добавлением имен классов.

<table>
    <tr>
        <td>Name</td>
        <td>Value</td>
    </tr>
    <tr>
        <td>Name</td>
        <td>Value</td>
    </tr>
</table>

Это имеет намного больше смысла с визуальной точки зрения, и в коде и в CSS. Моделирование вышеупомянутой границы тривиально. Однако, как упомянуто выше, семантика нечетки в лучшем случае

Мысли, комментарии, вопросы?

Редактирование/Обновление, Возможно, это было чем-то, которое я должен был явно упомянуть относительно структуры, но список определения также имеет проблему семантической группировки пар. Упорядочивание и неявная граница между a dd и a dt понятно, но они все еще чувствуют немного прочь мне.

71
задан Ryan Kinal 19 July 2010 в 13:37
поделиться

6 ответов

Спасибо за этот интересный вопрос. Здесь есть еще несколько моментов, которые следует рассмотреть.

Что такое пара? Два элемента вместе. Поэтому нам нужен тег для этого. Допустим, это будет тег pair.

 <pair></pair>

Пара содержит ключ и соответствующее значение:

 <pair><key>keyname</key><value>value</value></pair>

Затем нам нужно перечислить пары:

<pairlist>
     <pair><key>keyname</key><value>value</value></pair>
     <pair><key>keyname</key><value>value</value></pair>
</pairlist>

Следующее, что нужно рассмотреть, это отображение пар. Обычная схема - табличная:

key value
key value

и необязательный разделитель, которым обычно является двоеточие:

key : value
key : value

Двоеточие можно легко добавить с помощью CSS, но это, конечно, не будет работать в IE.

Описанный выше случай является идеальным. Но не существует валидной HTML-разметки, которая бы легко в него вписалась.


Подведем итоги:

dl семантически наиболее близок, для простых случаев ключа и значения, но к нему трудно применить визуальные стили (например, чтобы отобразить пары в линию или добавить красную рамку к только что наведенной паре). Случай, который больше всего подходит для dl - это глоссарий. Но это не тот случай, который мы обсуждаем.

Единственная альтернатива, которую я вижу в этом случае - использовать table, например, так:

<table summary="This are the key and value pairs">
    <caption>Some notes about semantics</caption>
    <thead class="aural if not needed">
        <tr><th scope="col">keys</th><th scope="col">values</th></tr>
    </thead>
    <tbody class="group1">  
        <tr><th scope="row">key1</th><td>value1</td></tr>
        <tr><th scope="row">key2</th><td>value2</td></tr>
    </tbody>
    <tbody class="group2">
        <tr><th scope="row">key3</th><td>value3</td></tr>
        <tr><th scope="row">key4</th><td>value4</td></tr>
    </tbody>
</table>

Еще один:

<ul>
  <li><strong>key</strong> value</li>
  <li><strong>key</strong> value</li>
</ul>

или:

<ul>
  <li><b>key</b> value</li>
  <li><b>key</b> value</li>
</ul>

или, когда ключи могут быть связаны:

<ul>
  <li><a href="/key1">key1</a> value</li>
  <li><a href="/key2">key1</a> value</li>
</ul>

Пары ключ-значение обычно хранятся в базе данных, а те обычно хранят табличные данные, так что таблица подойдет лучше всего ИМХО.

Что вы думаете?

52
ответ дан 24 November 2019 в 13:07
поделиться

Мне нравится идея Unicron поместить их все в одну строку, но другой вариант - сделать отступ для значения под именем определения:

<dl>
    <dt>Name</dt>
       <dd>Value</dd>
    <dt>Name</dt>
       <dd>Value</dd>
</dl>

Этот способ может быть немного проще для глаз в смехотворно длинных определениях (хотя, если вы используете смехотворно неправильные определения, то, возможно, список определений - это не то, что вам действительно нужно в конце концов).

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

-1
ответ дан 24 November 2019 в 13:07
поделиться

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

Таблица - один из возможных вариантов, но как насчет неупорядоченного списка?

<ul>
    <li class="key-value-pair">
        <span class="key">foo</span>
        <span class="value">bar</span>
    </li>
</ul>
6
ответ дан 24 November 2019 в 13:07
поделиться

Как насчет того, чтобы просто поместить пустую строку между каждой парой?

Это не требует специальной обработки для длинных значений.

<dl> 
    <dt>Name</dt> 
    <dd>Value</dd> 

    <dt>Name</dt> 
    <dd>Value</dd> 

    <dt>Name</dt> 
    <dd>Value</dd> 
</dl> 
0
ответ дан 24 November 2019 в 13:07
поделиться

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

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

Вы можете сделать:

dt,dd{ border:solid; }
dt{ margin:10px 0 0 0; border-width:1px 1px 0 1px; }
dd{ margin:0 0 10px 0; border-width:0 1px 1px 1px; padding:0 0 0 10px; }
dd::before{ content:'→ '; }

Что работает для парных ключей-значений, но создает проблемы, если у вас есть несколько dds в одном "наборе", например:

<dt>Key1</dt>
  <dd>Val1.1</dd>
  <dd>Val1.2</dd>
<dt>Key2</dt>
  <dd>Val2.1</dd>
  <dd>Val2.2</dd>

Однако, если отбросить ограничения на стилизацию границ, все остальное для объединения наборов (фон, нумерация и т.д.) вполне возможно с помощью CSS. Здесь есть хороший обзор: http://www.maxdesign.com.au/articles/definition/


Еще один момент, который, на мой взгляд, стоит отметить: если вы хотите оптимально стилизовать списки определений, чтобы обеспечить визуальное разделение - функции CSS по автоматической нумерации (counter-increment и counter-reset) могут оказаться весьма кстати: http://www.w3.org/TR/CSS2/generate.html#counters

2
ответ дан 24 November 2019 в 13:07
поделиться

Хм. dt / dd лучше всего подходят для этого, и можно компенсировать их визуально, хотя я согласен, это сложнее, чем для таблицы.

Что касается читабельности исходного кода, как насчет того, чтобы поместить их в одну строку?

<dl>
    <dt>Name</dt> <dd>Value</dd>
    <dt>Name</dt> <dd>Value</dd>
</dl>

Я согласен, что это не на 100% идеально, но, поскольку вы можете использовать символы пробела для отступов:

<dl>
    <dt>Property with a looooooooooong name</dt>   <dd>Value</dd>
    <dt>Property with a shrt name</dt>             <dd>Value</dd>
</dl>

это может быть самый лучший способ.

1
ответ дан 24 November 2019 в 13:07
поделиться