【问题标题】:How to semantically add heading to a list如何在语义上将标题添加到列表中
【发布时间】:2012-02-14 15:44:04
【问题描述】:

这一直困扰着我一段时间,我想知道对于如何正确执行此操作是否有任何共识。当我使用 HTML 列表时,如何在语义上包含列表的标题?

一个选项是这样的:

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

但从语义上讲,&lt;h3&gt; 标题与 &lt;ul&gt; 没有明确关联

另一种选择是:

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

因为&lt;ul&gt;'s 只能包含一个或多个&lt;li&gt;'s

旧的“列表标题”&lt;lh&gt; 最有意义

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

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

我听说它建议我们使用 &lt;label&gt; 就像一个表单:

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

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

在尝试设置列表标题样式时很容易看到语义问题,我最终需要将我的 &lt;h3&gt; 标记放在第一个 &lt;li&gt; 中,并使用以下内容将它们定位为样式:

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

恐怖!但至少通过这种方式,我可以通过设置ul 标签的样式来控制整个&lt;ul&gt;、标题和所有内容。

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

【问题讨论】:

标签: html html-lists


【解决方案1】:

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

【讨论】:

  • 这很有意义;谢谢。当然,如果我们要使用 HTML5,标题应该是 &lt;h1&gt;&lt;section&gt; 内,因为它是这些标签中的顶级标题。
  • 你可以在那里使用&lt;h1&gt;,当然。但是&lt;h3&gt; 也可以。只要您不在同一部分中使用更高级别的标题。
  • 我们应该坚持使用 h1..h6 标题(这里是 h2 和 h3),只要浏览器、屏幕阅读器和其他辅助技术没有按照 HTML5 中的说明正确勾勒标题(参见 coding.smashingmagazine.com/2011/08/16/… -搜索“眉毛”...)。我不确定它在几个月内发展了多少,但在浏览器的可访问性 API 方面可能没有那么快:/
  • @davidjb - 小心,这并不是该建议所说的。它说应该使用 h1-h6 来提供标题级别。即 h1 元素只能用于页面上最高级别的标题。它并不是说在那个最高级别上只能有一个标题。顺带一提,浏览器厂商已经明确表示无意实施大纲算法,因此情况迅速改善的希望不大。
  • @Michele - 这取决于您是指视觉上的中间,还是语义上的中间。如果在视觉上,那么这对 CSS 来说是一个问题,理想情况下不会改变你的标记。如果在语义上,那么我不确定你有什么样的列表。您可能有两个列表,而不是一个。
【解决方案2】:

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

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

【讨论】:

  • 对于一个标签描述的事物的无序列表,比如上面的例子,我认为这是最好的选择。语义完全匹配:这是一个术语或标签(我喜欢的水果),这是与该标签对应的项目(每个水果)。
  • 它实际上是一个描述列表。这是 imo 的最佳解决方案。
  • display: list-item ...CSS 来显示项目符号。很好的答案。
【解决方案3】:

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

顺便说一句,您的标题明确与 &lt;ul&gt; 相关联:它就在列表之前! ;)

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

【讨论】:

  • 我同意,其他解决方案根本没有意义
  • 没错,有点像在&lt;p&gt; 上使用标题。但我仍然想要一些更明确的东西,比如forattribute 用于表的&lt;label&gt;' or the `。我认为 &lt;lh&gt; 选项如果得到 W3C 的实际支持,将是最有意义的。
【解决方案4】:

a

是您内容中的逻辑划分,如果我想将标题与列表分组,从语义上讲,这将是我的首选:
<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...

【讨论】:

  • 不错的选择,至少对于造型而言。
  • 从语义上讲 div 没有任何意义,我不明白为什么它会是您的首选(出于样式问题)? :x
  • @Rambobafet,伟大的死灵术!这个答案来自 2012 年,在 html5 引入部分和其他语义上更正确的选项之前。一些浏览器已经支持部分,但有些没有。 “div”是内容中“逻辑划分”的缩写,因此在当时这是划分内容以进行样式设置的最佳方式。
  • 你说的完全正确,没有看到“'12”部分:)
【解决方案5】:

您还可以使用&lt;figure&gt; 元素将标题链接到您的列表,如下所示:

<figure>
    <figcaption>My favorite fruits</figcaption>    
       <ul>
          <li>Banana</li>
          <li>Orange</li>
          <li>Chocolate</li>
       </ul>
</figure>

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

【讨论】:

    【解决方案6】:

    尝试在 css 中定义一个新类 ulheader。 p.ulheader ~ ul 选择紧跟在 My Header 之后的所有内容

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

    【讨论】:

      【解决方案7】:

      根据w3.org(注意这个链接在long-expired draft HTML 3.0 spec):

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

      开始列表标签必须是&lt;UL&gt;。它后面是一个可选列表 标题(&lt;LH&gt;caption&lt;/LH&gt;),然后是第一个列表项(&lt;LI&gt;)。为了 示例:

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

      可以呈现为:

      食用水果

      • 苹果
      • 橙子
      • 香蕉

      注意:一些旧文档可能包含标题或纯文本 第一个 LI 元素。建议 HTML 3.0 用户代理的实现者 迎合这种可能性,以处理形成不良的遗产 文件。

      【讨论】:

      • 投反对票,因为这个“根据”链接指向 1995 年的 3.0 规范草案,该规范从未脱离草案。 “lh”标签从未成为非草案 HTML 规范。
      • HTML 3.0 哇,这是一个非常古老的文件。
      【解决方案8】:

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

      【讨论】:

      猜你喜欢
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多