HTML5 结构 - <article>、<section> 和 <div> 的用法

11

大家好,

我刚开始学习HTML5 - 没有问题,一切都进行得很顺利。

我只有一个小问题,关于 <article><section><div> 标签的语义使用。

我知道 <div> 元素没有语义意义 - 在 HTML5 中,它主要用于脚本/样式目的。这对我来说很清楚。我在 SO 问题中找到了很多有用的信息:HTML5有新的文章(<article>)、节(<section>)和旁边(<aside>)标签。何时应该使用<div>标签?

然而,我对 <article><section> 的使用仍然有些困惑。 W3C HTML5 规范指出,<article> 标签:

  

指定独立的、自包含的内容,可能是新闻文章、博客文章、论坛帖子或其他可以独立于站点的其余部分分发的文章。

应该使用 <section> 标签的地方:

  

用于文档中的节。例如章节、页眉、页脚或文档的任何其他部分。

理论上,一切都很清楚。然而,在准备我的第一个 HTML5 网站代码时,我发现有点难以区分。

让我解释一下我的网站结构:

  1. 背景添加到 body 元素。非常完美。
  2. 我在我的每个 HTML/CSS 项目中都使用960.gs 网格系统。这次我也在使用它。正如您肯定知道的那样,它需要添加一个容器 (在我的情况下,是 class="container_12" 的容器)。

为了总结我的结构:

  1. 作为主要容器,我使用了 <div class="container_12">
  2. 我的文档中的第一个元素是一个 <header>。它包含几个元素:幻灯片和顶部栏。顶部栏是一个 <section>,它有两个子元素:左侧的电话号码和右侧的语言列表。对于这些元素,我也使用了 <section>。对于幻灯片(或内部页面上的短标语占位符),我使用了包含两个<section> 标签的 <section> 标记:左列和右列。
  3. 作为主页的主要内容包装器,我决定使用 <section> 元素。对于像关于我们等页面,我使用 <article>。对于博客列表,我使用一个 <section>,其中包含几个 <article> 标签。对于单个帖子,我使用 <article> 标记。
  4. 显然,对于页脚,我使用
    <div class="container_12">
        <div class="grid_12 header">
            <div class="bar grid_12 alpha omega">
                <div class="grid_6 alpha">
                    Phone number
                </div>
                <div class="grid_6 omega">
                    German - English - French
                </div>
            </div>
            <div class="grid_6 alpha">
                LOGOTYPE
            </div>
            <div class="grid_6 omega">
                <ul>
                    navigation
                </ul>
            </div>
            <div class="grid_12 alpha omega">
                <div class="grid_6 alpha">
                    Slider I col
                </div>
                <div class="grid_6 omega">
                    Slider II col
                </div>
            </div>
        </div>
        <div class="grid_12 content">
    
        </div>
        <div class="grid_12 footer">
            <div class="grid_4 alpha">
                Footer I col
            </div>
            <div class="grid_4">
                Footer II col
            </div>
            <div class="grid_4 omega">
                Footer III col
            </div>
        </div>
    </div>
    

    这是我将代码转换为HTML5后的结果:

    <div class="container_12">
        <header class="grid_12">
            <section class="bar grid_12 alpha omega">
                <section class="grid_6 alpha">
                    Phone number
                </section>
                <section class="grid_6 omega">
                    German - English - French
                </section>
            </section>
            <section class="grid_6 alpha">
                LOGOTYPE
            </section>
            <nav class="grid_6 omega">
                <ul>
                    navigation
                </ul>
            </nav>
            <section class="grid_12 alpha omega">
                <section class="grid_6 alpha">
                    Slider I col
                </section>
                <section class="grid_6 omega">
                    Slider II col
                </section>
            </section>
        </header>
    
        <section class="grid_12 content">
    
        </section>
        <footer class="grid_12">
            <section class="grid_4 alpha">
                Footer I col
            </section>
            <section class="grid_4">
                Footer II col
            </section>
            <section class="grid_4 omega">
                Footer III col
            </section>
        </footer>
    </div>
    

    我的方法正确吗?你能加入或者纠正一些什么吗?

    为了避免任何问题:我知道<section>不能替代<div>


我有同样的问题,这篇文章很有帮助:HTML5 结构 — div、section 和 article - Nick Alexeev
1个回答

7

好的,回答这个问题的一种方法是使用像http://gsnedders.html5.org/outliner/这样的工具查看文档的大纲。您会注意到每个部分都需要一个标题来使其有意义,因此没有一些内容很难说。如果每个部分都有一个合理的H1标签,则通常是正确的。如果一个部分不需要h1,则通常是错误的。

各个部分应该能够独立意义,没有上下文也可以明白。理解这一点的简单方法是想象一个RSS源-源上的每篇文章就像一个部分。如果您将其添加到RSS源中(或在那种情况下它有意义),那么它可能是一个部分。如果它只是页脚上的一列,则不会将其放在RSS源中,因此它可能不是一个部分。

基于此,我可能会做这样的事情(基于我对每个部分中数据的假设)。我还添加了WAI-ARIA landmark角色,因为它们非常简单,在使用屏幕阅读器时能起到很大的作用。

<div class="container_12">
    <header class="grid_12" role="banner">
        <div class="bar grid_12 alpha omega">
            <div class="grid_6 alpha">
                Phone number
            </div>
            <div class="grid_6 omega">
                German - English - French
            </div>
        </div>
        <div class="grid_6 alpha">
            LOGOTYPE
        </div>
        <nav class="grid_6 omega" role="navigation">
            <ul>
                navigation
            </ul>
        </nav>
        <div class="grid_12 alpha omega">
            <div class="grid_6 alpha">
                Slider I col
            </div>
            <div class="grid_6 omega">
                Slider II col
            </div>
        </div>
    </header>

    <section class="grid_12 content" role="main">
          <!-- Not sure what goes in here? Let's assume it's the main content. -->
    </section>
    <footer class="grid_12">
        <div class="grid_4 alpha">
            Footer I col
        </div>
        <div class="grid_4">
            Footer II col
        </div>
        <div class="grid_4 omega">
            Footer III col
        </div>
    </footer>
</div>

1
谢谢您的回复。您的代码为我解决了这个问题提供了很多启示。我同意,我误解了<section>元素属性的含义 :) - DaveW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接