Semantics and Structure of Name-Value Pairs
Thanks for this interesting question. There are few more things to consider here.
What is a pair? Two elements together. So we need a tag for this.
Let's say it is pair
tag.
<pair></pair>
The pair contains the key, and the corresponding value:
<pair><key>keyname</key><value>value</value></pair>
Then, we need to list the pairs:
<pairlist>
<pair><key>keyname</key><value>value</value></pair>
<pair><key>keyname</key><value>value</value></pair>
</pairlist>
The next thing to consider, is the display of the pairs. The usual layout is the tabular one:
key value
key value
and the optional separator, which is usually colon:
key : value
key : value
The colons can be easily added via CSS, but this certainly won't work in IE.
Case described above is the ideal one. But there is no valid HTML markup to fit in this easily.
To sum up:
dl
is semantically closest, for simple cases of key and value, but is hard to apply visual styles
(eg. to display the pairs inline or to add red border to just hovered pair). The case which fits most for dl
is glossary. But this is not the case we discuss.
The only alternative I can see in this case is to use table
, like this:
<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>
One more:
<ul>
<li><strong>key</strong> value</li>
<li><strong>key</strong> value</li>
</ul>
or:
<ul>
<li><b>key</b> value</li>
<li><b>key</b> value</li>
</ul>
or, when the keys may be linked:
<ul>
<li><a href="/key1">key1</a> value</li>
<li><a href="/key2">key1</a> value</li>
</ul>
The key and value pairs are usually stored in database, and those usually store tabular data, so the table would fit best IMHO.
What do you think?
Following the specification (and further details) provided by Alexandr Antonov: use dl
, dt
, dd
, and optionally div
.
A combination of dl
, dt
, and dd
is semantically fine for key-value pairs:
<dl>
<dt>Key1</dt>
<dd>Value1</dd>
<dt>Key2</dt>
<dd>Value2</dd>
</dl>
For easier styling or parsing, div
s can be used as children of dl
to group the key-value pairs (and makes dt
and dd
be grandchildren of dl
):
dl { display: table; }
dl > div { display: table-row; }
dl > div > dt, dl > div > dd { display: table-cell; border: 1px solid black; padding: 0.25em; }
dl > div > dt { font-weight: bold; }
<dl>
<div>
<dt>Key1</dt>
<dd>Value1</dd>
</div>
<div>
<dt>Key2</dt>
<dd>Value2</dd>
</div>
</dl>
XHTML 2 introduces the ability to group terms and definitions using the di
element
<!-- 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 > Enhancement To Definitions Lists
Unfortunately though, XHTML 2 is dead and HTML5 doesn't have di
element
So, you can combine ul > li
with dl > dt + dd
:
<ul>
<li>
<dl>
<dt>Name</dt>
<dd>John</dd>
</dl>
</li>
<li>
<dl>
<dt>Age</dt>
<dd>25</dd>
</dl>
</li>
</ul>
I think a definition list is probably a bad idea. Semantically, they are used for definitions. Other key-value lists will often differ from definition titles and descriptions.
A table
is one way to go, but what about an unordered list?
<ul>
<li class="key-value-pair">
<span class="key">foo</span>
<span class="value">bar</span>
</li>
</ul>
dl {
display: grid;
grid-template-columns: auto auto;
}
dd {
margin: 0
}
<dl>
<dt>key</dt>
<dd>value</dd>
<dt>key</dt>
<dd>value</dd>
</dl>
I used <dl>
<dt>
<dd>
and styled them with grid