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

Tom*_*der 107 html html-lists

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

一种选择是这样的:

<h3>Fruits I Like:</h3>
<ul>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

但在语义上,<h3>标题没有明确地与<ul>

另一种选择是:

<ul>
    <li><h3>Fruits I Like:</h3></li>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

但这似乎有点脏,因为标题实际上不是列表项之一.

W3C不允许此选项:

<ul>
    <h3>Fruits I Like:</h3>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

<ul>'s只能含有一种或多种<li>

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

<ul>
    <lh>Fruits I Like:</lh>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

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

我听说它表明我们使用<label>的形式如下:

<ul>
    <label>Fruits I Like:</label>
    <li>Apples</li>
    <li>Bananas</li>
    <li>Oranges</li>
</ul>
Run Code Online (Sandbox Code Playgroud)

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

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

ul li:first-of-type {
    list-style: none;
    margin-left: -1em;
    /*some other header styles*/
}
Run Code Online (Sandbox Code Playgroud)

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

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

Alo*_*hci 72

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

  • 这很有道理; 谢谢.当然,如果我们要使用HTML5,标题应该是`<section>`里面的`<h1>`,因为它是这些标签中的顶级标题. (5认同)
  • 你肯定可以使用`<h1>`.但是`<h3>`也行.只要您不在同一部分中使用更高级别的标题. (4认同)
  • 我们应该坚持使用h1..h6标题(此处为h2和h3),只要浏览器,屏幕阅读器和其他辅助技术没有正确列出HTML5中所述的标题(请参阅http://coding.smashingmagazine.com/2011/) 08/16/html5-and-the-document-algorithm-algorithm/ - 搜索"眉毛"......).我不确定它在几个月内发展了多少,但对于浏览器的可访问性API可能没那么快:/ (3认同)
  • @Michele - 这取决于您的意思是在视觉上处于中间,还是在语义上处于中间。如果从视觉上看,那是 CSS 需要解决的问题,理想情况下不会更改您的标记。如果在语义上,那么我不确定你有什么样的列表。可能你有两个列表,而不是一个。 (3认同)
  • @davidjb - 小心,这不是那个建议所说的.它说h1-h6应该用于提供航向水平.即h1元素只应用于页面上最高级别的标题.它并没有说最高级别只能有一个标题.顺便提一下,浏览器制造商已明确表示他们无意实施大纲算法,因此情况几乎没有希望迅速改善. (2认同)

小智 50

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

<dl>
  <dt>Fruits I like:</dt>
  <dd>Apples</dd>
  <dd>Bananas</dd>
  <dd>Oranges</dd>
</dl>
Run Code Online (Sandbox Code Playgroud)

  • 对于标签所描述的无序列表,如上例所示,我认为这是最佳选择.语义完全匹配:这是一个术语或标签(我喜欢的水果),这里是与该标签对应的项目(每个水果). (5认同)
  • 好的.语法没有在这里吞噬语义. (4认同)
  • 它实际上是一个*描述列表*。这是最好的解决方案imo。 (2认同)

Fel*_*Als 9

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

顺便说一句,你的标题显然与以下内容相关联<ul>:它就在列表之前!;)

编辑:W3C HTML5和5.1的编辑之一Steve Faulkner 勾勒出了一个lt元素的定义.这是一个非正式的草案,他将讨论HTML 5.2,仅此而已.


Eve*_*ert 5

<div>是您内容中的逻辑分区,从语义上讲,如果我想将标题与列表分组,这将是我的第一选择:

<div class="mydiv">
    <h3>The heading</h3>
    <ul>
       <li>item</li>
       <li>item</li>
       <li>item</li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

然后你可以使用下面的css将所有内容组合在一起作为一个单元

.mydiv{}
.mydiv h3{}
.mydiv ul{}
.mydiv ul li{}
etc...
Run Code Online (Sandbox Code Playgroud)


小智 5

您还可以使用该<figure>元素将标题链接到列表,如下所示:

<figure>
    <figcaption>My favorite fruits</figcaption>    
       <ul>
          <li>Banana</li>
          <li>Orange</li>
          <li>Chocolate</li>
       </ul>
</figure>
Run Code Online (Sandbox Code Playgroud)

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