名值对的语义和结构

Rya*_*nal 71 html css semantic-web semantic-markup semantics

这是我一直在努力解决的问题.标记名称/值对的正确方法是什么?

我喜欢<dl>元素,但它提出了一个问题:没有办法将一对与另一对分开 - 它们没有唯一的容器.在视觉上,代码缺乏定义.但从语义上讲,我认为这是正确的标记.

<dl>
    <dt>Name</dt>
    <dd>Value</dd>
    <dt>Name</dt>
    <dd>Value</dd>
</dl>
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,很难在视觉上和代码中正确地偏移对.例如,如果我想,但每对的边界,这将是一个问题.

我们可能会指向表格.可以说,名称 - 值对是表格数据.这似乎对我不正确,但我看到了这个论点.但是,除了位置或添加类名外,HTML不会将名称与值区分开来.

<table>
    <tr>
        <td>Name</td>
        <td>Value</td>
    </tr>
    <tr>
        <td>Name</td>
        <td>Value</td>
    </tr>
</table>
Run Code Online (Sandbox Code Playgroud)

从视觉角度来看,这在代码和CSS中都更有意义.设计上述边界是微不足道的.然而,如上所述,语义最多是模糊的.

想法,评论,问题?

编辑/更新 也许这是我应该在结构方面明确提到的,但是定义列表也存在不对语义进行分组的问题.a dd和a 之间的排序和隐含边界dt很容易理解,但它们对我来说仍然感觉有些偏差.

tak*_*hin 52

谢谢你这个有趣的问题.这里还有很多事情需要考虑.

什么是一对?两个元素在一起.所以我们需要一个标签.让我们说它是pair标签.

 <pair></pair>
Run Code Online (Sandbox Code Playgroud)

该对包含密钥和相应的值:

 <pair><key>keyname</key><value>value</value></pair>
Run Code Online (Sandbox Code Playgroud)

然后,我们需要列出对:

<pairlist>
     <pair><key>keyname</key><value>value</value></pair>
     <pair><key>keyname</key><value>value</value></pair>
</pairlist>
Run Code Online (Sandbox Code Playgroud)

接下来要考虑的是对的显示.通常的布局是表格式:

key value
key value
Run Code Online (Sandbox Code Playgroud)

和可选的分隔符,通常是冒号:

key : value
key : value
Run Code Online (Sandbox Code Playgroud)

冒号可以通过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>
Run Code Online (Sandbox Code Playgroud)

多一个:

<ul>
  <li><strong>key</strong> value</li>
  <li><strong>key</strong> value</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

要么:

<ul>
  <li><b>key</b> value</li>
  <li><b>key</b> value</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

或者,当钥匙可以链接时:

<ul>
  <li><a href="/key1">key1</a> value</li>
  <li><a href="/key2">key1</a> value</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

键和值对通常存储在数据库中,而这些通常存储表格数据,因此表格最适合恕我直言.

你怎么看?

  • 非常彻底的回答.我喜欢你表现出你的思路.+1 (4认同)
  • 我相信(好吧,几乎*知道*)`<strong>`应根据HTML5语义替换为`<b>`. (2认同)

Yuk*_*élé 11

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>
Run Code Online (Sandbox Code Playgroud)

X/HTML 5与XHTML 2>对定义列表的增强

不幸的是,XHTML 2已经死了,HTML5没有 di元素

所以,你可以结合ul > li使用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>
Run Code Online (Sandbox Code Playgroud)

  • 天啊.哇.我想要`<di>`元素.我现在就想要.太糟糕了我不能拥有它.谢谢你的信息! (7认同)
  • 根据规范,`div`扮演`di`的角色。详见我的答案。 (2认同)

Dan*_*Lin 9

规范(和进一步的细节由亚历山大安东诺夫提供):使用dldtdd,和任选的div

的组合dldtdd在语义罚款键-值对:

<dl>
    <dt>Key1</dt>
    <dd>Value1</dd>
    <dt>Key2</dt>
    <dd>Value2</dd>
</dl>
Run Code Online (Sandbox Code Playgroud)

为了简化样式设置或解析,div可以将s用作dl组合键值对的子项(以及dtdd成为的子项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; }
Run Code Online (Sandbox Code Playgroud)
<dl>
  <div>
    <dt>Key1</dt>
    <dd>Value1</dd>
  </div>
  <div>
    <dt>Key2</dt>
    <dd>Value2</dd>
  </div>
</dl>
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案,恕我直言,应该被接受的答案,特别是考虑到规范中包含的示例完全适合这个问题。CSS 网格也将是一种相当令人惊奇的简单而有效地格式化它的方式。 (5认同)

gpm*_*dam 6

我认为定义列表可能是一个坏主意.从语义上讲,它们用于定义.其他键值列表通常与定义标题和说明不同.

A table是一种方法,但无序列表怎么样?

<ul>
    <li class="key-value-pair">
        <span class="key">foo</span>
        <span class="value">bar</span>
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

  • 在当前的[HTML5规范](http://www.w3.org/TR/2011/WD-html-markup-20110405/dl.html#dl)中,dl已被重新命名为描述列表,在此处使用看起来更正确. (3认同)
  • 定义列表在这方面的命名可能稍差一些,但它们并非纯粹用于定义(如果是的话,它们的用例将相当有限)——W3C 规范。定义它们实际上有一个使用它们来标记对话的例子。 (2认同)

Mic*_*rth 5

dl {
  display: grid;
  grid-template-columns: auto auto;
}

dd {
  margin: 0
}
Run Code Online (Sandbox Code Playgroud)
<dl>
  <dt>key</dt>
  <dd>value</dd>
  <dt>key</dt>
  <dd>value</dd>
</dl>
Run Code Online (Sandbox Code Playgroud)

我用<dl> <dt> <dd>网格使用和样式化它们