Семантика и структура пар именных значений

Это вопрос, с которым я боролся некоторое время. Каков правильный способ разметки пар имя/значение?

Я люблю <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. Укладка вышеупомянутой границы тривиальна. Однако, как упоминалось выше, семантика в лучшем случае нечеткая.

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

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

Ответ 1

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

Что такое пара? Два элемента вместе. Поэтому для этого нам нужен тег. Скажем, это тег 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 является семантически близким, для простых случаев ключа и значения, но трудно применять визуальные стили (например, чтобы отобразить пары inline или добавить красную границу только к паре с парой). Наиболее подходящим для 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>

Пара ключей и значений обычно хранится в базе данных, и обычно они хранят табличные данные, поэтому таблица будет соответствовать лучшим IMHO.

Как вы думаете?

Ответ 2

XHTML 2 вводит возможность группировать термины и определения с помощью элемента di

<!-- Do not us this code! -->
<dl>
    <di>
        <dt>Name</dt>
        <dd>John</dd>
    </di>
    <di>
        <dt>Age</dt>
        <dd>25</dd>
    </di>
</dl>

X/HTML 5 vs XHTML 2 > Расширение списков определений

unfortunatly XHTML 2 мертв, а HTML5 не имеет элемента di

Итак, вы можете комбинировать ul > li с dl > dt + dd:

<ul>    
    <li>
        <dl>
            <dt>Name</dt>
            <dd>John</dt>
        </dl>
    </li>
    <li>
        <dl>
            <dt>Age</dt>
            <dd>25</dt>
        </dl>
    </li>
</ul>

Ответ 3

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

A table - один из способов, но как насчет неупорядоченного списка?

<ul>
    <li class="key-value-pair">
        <span class="key">foo</span>
        <span class="value">bar</span>
    </li>
</ul>

Ответ 4

Это не мое предпочтительное решение, но это умное злоупотребление семантическим элементом:

Используйте новую пару <dl> per <dt>/<dd>:

<div class="terms">
    <dl><dt>Name 1</dt><dd>Value 1</dd></dl>
    <dl><dt>Name 2</dt><dd>Value 2</dd></dl>
</div>

Пример с float css и красной рамкой при наведении:

dt:after { content:":"; }
dt, dd { float: left; }
dd { margin-left: 5px }
dl { float: left; margin-left: 20px; border: 1px dashed transparent; }
dl:hover { border-color: red; }
<div class="terms">
    <dl>
        <dt>Name 1</dt>
        <dd>Value 1</dd>
    </dl><!-- etc -->
    <dl><dt>Name 2</dt><dd>Value 2</dd></dl>
    <dl><dt>Name 3</dt><dd>Value 3</dd></dl>
    <dl><dt>Name 4</dt><dd>Value 4</dd></dl>
    <dl><dt>Name 5</dt><dd>Value 5</dd></dl>
    <dl><dt>Name 6</dt><dd>Value 6</dd></dl>
</div>

Ответ 5

Хм. 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>

это может быть самым приятным способом.

Ответ 6

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

Остальные передо мной разобрались (довольно хорошо, я думаю) с проблемой предоставления визуального определения в коде. Что оставляет проблему рендеринга и 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:'→ '; }

Что работает для ключевых значений PAIRS, но представляет проблемы, если у вас есть несколько 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

Ответ 7

За исключением элемента <dl>, вы в значительной степени суммировали все варианты HTML: ограниченные.

Однако вы не потерялись, остается один вариант: использование языка разметки, который можно перевести в HTML. Очень хороший вариант - Markdown.

Используя расширение таблицы, которое предоставляют некоторые механизмы разметки, вы можете иметь такой код:

| Table header 1 | Table header 2 |
-----------------------------------
| some key       | some value     |
| another key    | another value  |

Это означает, что вам нужен шаг построения, чтобы, конечно, перевести Markdown в HTML.

Таким образом вы получаете значимую разметку (таблица для табличных данных) и поддерживаемый код.

Ответ 8

Конечно, вы можете просто использовать HTML-пользовательские элементы. (spec) Они полностью соответствуют HTML5.

К сожалению, поддержка браузеров не такая уж большая, но если мы редко заботимся о таких пешеходных вещах, как поддержка браузера, когда мы имеем дело с семантикой.: -)

Один из способов, которым вы могли бы это представить:

После регистрации вашего нового модного элемента, например:

var XKey = document.registerElement('x-key');
document.body.appendChild(new XKey());

Вы пишете разметку следующим образом:

<ul>
  <li>
    <x-key>Name</x-key>
    Value
  </li>
</ul>

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

<ul>
  <li>
    <auto-part>
      <serial-number>AQ12345</serial-number>
      <short-description>lorem ipsum dolor...</short-description>
      <list-price>14</list-price>
    </auto-part>
  </li>
</ul>

Вы не можете получить гораздо больше семантического, чем это!

Однако, есть шанс, что я зашел слишком далеко в semantic-shangri-la-la (реальное место), и у меня может возникнуть соблазн изменить его на нечто более общее:

<ul>
  <li class='auto-part' data-serial-number="AQ12345">
      <p class='short-description'>lorem ipsum dolor...</p>
      <p class='list-price'>14</p>
  </li>
</ul>

Или, возможно, это (если мне нужно было стилизовать и показать ключ визуально)

<ul>
  <li class='auto-part'>
      <x-key>AQ12345<//x-key>
      <p class='short-description'>lorem ipsum dolor...</p>
      <p class='list-price'>14</p>
  </li>
</ul>

Ответ 9

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

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

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

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

Ответ 10

Как просто разместить пустую строку между каждой парой?

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

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

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

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

Ответ 11

Как насчет использования списков?

упорядоченный:

<ol>
  <li title="key" value="index">value</li>
  …
</ol>

Или используйте <ul> для неупорядоченного списка и пропустите бит value="index".

Ответ 12

Строка из spec:

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

Я предполагаю использование элементов <dl>, <dt> и <dd>.