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


120

这困扰了我一段时间,我想知道在如何正确执行此操作方面是否存在共识。当我使用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>'s只能含有一种或多种<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>并使用以下方式将它们作为样式目标:

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

恐怖!但是至少通过这种方式,我可以<ul>通过对ul标签进行样式控制来控制整个标题。

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


5
有些人正在使用LH,但可能没有意识到他们实际上并没有在使用“真实的” HTML标签,而只是在使用随机标签名称。浏览器将此类标记视为内联元素。有些可以让您在上面放一个类和CSS。
Glen Little


Answers:


81

正如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. -->

6
这很有道理;谢谢。当然,如果我们要使用HTML5,则标题应<h1>位于内,<section>因为它是这些标记中的顶级标题。
Tomas Mulder 2012年

6
您可以<h1>在那里使用。但是<h3>也可以。只要您不在同一部分中使用较高级别的标题即可。
Alohci 2012年

4
只要浏览器,屏幕阅读器和其他辅助技术未正确显示HTML5中所述的标题,我们就应该坚持使用h1..h6标题(此处为h2和h3)(请参阅encoding.smashingmagazine.com/2011/08/16/ … -搜索“浏览” ...)。我不确定它在几个月后发展了多少,但是关于浏览器的可访问性API可能不那么快:/
FelipeAls

3
@davidjb-注意,这并非该建议所说的。它说h1-h6应该用于提供航向级别。即,h1元素仅应用于页面上最高级别的标题。并不是说最高的级别上只有一个标题。顺便说一句,浏览器制造商已经明确表示他们无意实施Outline算法,因此,希望这种情况迅速改善的希望很小。
Alohci 2015年

2
@Michele-这取决于您在视觉上是指中间还是在语义上指中间。如果从视觉上看,那对CSS来说就是一个问题,理想情况下不会改变您的标记。如果从语义上讲,那么我不确定您获得的是哪种列表。可能您有两个列表,而不是一个。
Alohci

53

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

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

5
对于标签所描述的事物的无序列表,例如上面的示例,我认为这是最佳选择。语义完全匹配:这是一个术语或标签(我喜欢的水果),这是与该标签相对应的项(每个水果)。
安德鲁(Andrew)

1
它实际上是一个描述列表。这是imo的最佳解决方案。
德里克·朕会功夫,

display:list-item ... CSS显示项目符号。好答案。
Mycah

9

您的第一个选择是好的。这是问题最少的一个,您已经找到了不能使用其他选项的正确原因。

顺便说一句,您的标题与 <ul>:就在列表之前!;)

编辑:史蒂夫福克纳,W3C HTML5的编辑之一和5.1已经勾勒出一个定义一个的lt元件。那是他将针对HTML 5.2讨论的非正式草案,仅此而已。


1
我同意,其他解决方案完全没有意义

是的,有点像在上使用标题<p>。但是我仍然想要一些更明确的内容,例如表for<label>' or the <th>` 属性。我认为,<lh>如果W3C确实支持该选项,则将是最有意义的。
Tomas Mulder 2012年

5

<div>是内容中的逻辑划分,从语义上来说,如果要将标题与列表分组,这将是我的首选:

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

不错的选择,至少出于样式目的。
Tomas Mulder 2012年

语义div毫无意义,我不明白为什么它将是您的首选(出于样式问题)?:x
Rambobafet18年

@Rambobafet,伟大的巫术!该答案来自2012年,当时html5引入了各节以及其他在语义上更正确的选项。一些浏览器已经支持该部分,但有些则不支持。“ div”是内容中“逻辑划分”的缩写,因此,当时这是划分内容以进行样式划分的最佳方法。
埃弗特

您说得很对,没有看到“ 12”部分:)
Rambobafet19年


0

尝试在CSS中定义新类ulheader。p.ulheader〜ul选择紧随“我的标题”之后的所有内容

p.ulheader ~ ul {
   margin-top:0;
{
p.ulheader {
   margin-bottom;0;
}

-2

根据w3.org(请注意,此链接在已过期的HTML 3.0规范草案中):

无序列表通常是项目的项目符号列表。HTML 3.0使您能够自定义项目符号,不使用项目符号,以及水平或垂直包装多列列表的列表项。

开幕名单标记必须为<UL>。它后面是一个可选的列表标题(<LH> caption </LH>),然后是第一个列表项(<LI>)。例如:

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

可以表示为:

餐桌水果

  • 苹果
  • 橘子
  • 香蕉

注意:某些旧版文档可能在第一个LI元素之前包含标题或纯文本。建议HTML 3.0用户代理的实现者应考虑这种可能性,以便处理格式不正确的旧文档。


8
拒绝投票是因为该“根据”链接指向1995年以来的3.0规范草案,但从未使它脱离草案。“ lh”标记从未使它成为非草稿HTML规范。
Brooks Moses

HTML 3.0哇,那是一个非常古老的文件。
Derek朕会功夫

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.