如何在语义上将标题添加到列表中

时间:2012-01-20 00:17:13

标签: html html-lists

这困扰了我一段时间,我想知道如何正确地做到这一点是否有任何共识。当我使用HTML列表时,如何在语义上包含列表的标题?

一种选择是:

<h3>Fruits I Like:</h3>
<ul>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

但从语义上讲,<h3>标题未与<ul>

明确关联

另一种选择是:

<ul>
    <li><h3>Fruits I Like:</h3></li>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

但这看起来有点脏,因为标题实际上并不是列表项之一。

W3C不允许使用此选项:

<ul>
    <h3>Fruits I Like:</h3>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

因为<ul>只能包含一个或多个<li>

旧的“列表标题”<lh>最有意义

<ul>
    <lh>Fruits I Like:</lh>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

但当然它不是HTML的正式部分

我听说它建议我们像表格一样使用<label>

<ul>
    <label>Fruits I Like:</label>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>

但这有点奇怪,无论如何都不会验证。

在尝试设置列表标题样式时很容易看到语义问题,我最终需要将<h3>标记放在第一个<li>内,并将其定位为样式,如:< / p>

ul li:first-of-type {
    list-style: none;
    margin-left: -1em;
    /*some other header styles*/
}

恐怖!但至少通过这种方式,我可以通过设置<ul>标记的样式来控制整个ul,标题和所有内容。

这样做的正确方法是什么?有什么想法吗?

8 个答案:

答案 0 :(得分:71)

正如Felipe Alsacreations已经说过的那样,第一种选择很好。

如果您想确保列表下方没有任何内容被解释为属于该标题,那么这正是HTML5分区内容元素的用途。所以,比如你可以做

<h2>About Fruits</h2>
<section>
  <h3>Fruits I Like:</h3>
  <ul>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
  </ul>
</section>
<!-- anything here is part of the "About Fruits" section but does not 
     belong to the "Fruits I Like" section. -->

答案 1 :(得分:49)

在这种情况下,我会使用定义列表:

<dl>
  <dt>Fruits I like:</dt>
  <dd>Apples</dd>
  <dd>Bananas</dd>
  <dd>Oranges</dd>
</dl>

答案 2 :(得分:9)

你的第一个选择是好的选择。这是问题最少的一个,你已经找到了正确的理由,为什么你不能使用其他选项。

顺便说一下,你的标题明确与<ul>相关联:它就在列表前面! ;)

编辑:W3C HTML5和5.1的编辑之一Steve Faulkner已经概述了lt element的定义。这是他将讨论HTML 5.2的unofficial draft,仅此而已。

答案 3 :(得分:5)

a&lt; div&gt;在你的内容中是一个逻辑划分,从语义上来说,如果我想将标题与列表分组,这将是我的第一选择:

<div class="mydiv">
    <h3>The heading</h3>
    <ul>
       <li>item</li>
       <li>item</li>
       <li>item</li>
    </ul>
</div>

然后您可以使用以下css将所有内容组合为一个单元

.mydiv{}
.mydiv h3{}
.mydiv ul{}
.mydiv ul li{}
etc...

答案 4 :(得分:1)

您还可以使用<lxml.etree._ElementTree object at 0x10e95bcc8> 元素将标题链接到列表,如下所示:

<figure>

来源:https://www.w3.org/TR/2017/WD-html53-20171214/single-page.html#the-li-element(例162)

答案 5 :(得分:0)

尝试在css中定义一个新类ulheader。 p.ulheader~ul选择紧跟在My Header

之后的所有内容
p.ulheader ~ ul {
   margin-top:0;
{
p.ulheader {
   margin-bottom;0;
}

答案 6 :(得分:-1)

根据w3.org(请注意此链接位于long-expired draft HTML 3.0 spec):

  

无序列表通常是项目符号列表。 HTML 3.0   使您能够自定义项目符号,无需项目符号   并为多列水平或垂直包装列表项   列表。

     

开场清单标记必须为<UL>。随后是一个可选列表   标题(<LH>标题</LH>),然后是第一个列表项(<LI>)。对于   例如:

<UL>
  <LH>Table Fruit</LH>
  <LI>apples
  <LI>oranges
  <LI>bananas
</UL>
     

可以呈现为:

     

餐桌水果

     
      
  • 苹果
  •   
  • 桔子
  •   
  • 香蕉
  •   
     

注意:以前的某些旧文档可能包含标题或纯文本   第一个LI元素。建议使用HTML 3.0用户代理的实现者   以满足这种可能性,以处理糟糕的遗产   文档。

答案 7 :(得分:-9)

我把标题放在ul里面。没有规则说UL必须只包含LI元素。