【问题标题】:Semantic markup & responsive design – How to proceed in this specific situation?语义标记和响应式设计——在这种特定情况下如何进行?
【发布时间】:2013-11-30 14:38:39
【问题描述】:

我正在使用移动优先的方法构建一个小型网站,这意味着我从一个小屏幕开始,然后逐渐变大。为了节省空间,我在页面上显示/隐藏一些信息或根据屏幕大小替换信息。虽然这看起来很酷,但它确实让我头疼,试图让标记尽可能地符合语义。
让我们开始吧,这就是我目前所拥有的:

HTML

<header>
    <nav role="navigation">
        <a href="#navlist">☰</a>
        <a href="/">Page Title</a>
        <p class="hidden-s hidden-l">I the page's tagline</p>
        <ul id="navlist">
            <li><a href="/">Link 1</a></li>
            <li><a href="/">Link 2</a></li>
            <li><a href="/">Link 3</a></li>
            <li><a href="#">Close Menu</a></li>
        </ul>
    </nav>
</header>

<main role="main">
    <article>
        <header>
            <h1><a href="#">Blog Post 1</a></h1>
        </header>
        <p>Short excerpt of Blog Post 1</p>
    </article>
    <article>
        <header>
            <h1><a href="#">Blog Post 2</a></h1>
        </header>
        <p>Short excerpt of Blog Post 2</p>
    </article>
</main>

CSS

nav { background-color: rgba(255, 0, 0, .4); }

#navlist {
    display:none;
}

#navlist:target {
    display:block;
}

.hidden-s {
    display: none;
}

@media screen and (min-width: 500px) {
    .hidden-s {
        display: block;
    }
}

@media screen and (min-width: 700px) {
    .hidden-l {
        display: none;
    }
}

Fiddle

你看,标语在小屏幕上是隐藏的,在中等大小的屏幕上显示,在大屏幕上再次隐藏。我在大屏幕上隐藏了标语,因为我想在大屏幕上的不同位置添加更多信息,如下所示:

HTML

<main role="main">
<div class="more-info">
    <header>
        <h1>Page Title</h1>
        <p>Some more info over the page you are reading.</p>
    </header>
</div>
<article>
    <header>
        <h1><a href="#">Blog Post 1</a></h1>
    </header>
    <p>Short excerpt of Blog Post 1</p>
</article>
<article>
    <header>
        <h1><a href="#">Blog Post 2</a></h1>
    </header>
    <p>Short excerpt of Blog Post 2</p>
</article>

CSS

.hidden-s,
.more-info {
    display: none;
}

@media screen and (min-width: 700px) {
    .hidden-l {
        display: none;
    }

    .more-info {
        display: block;
    }
}

Fiddle

现在问题出在header 元素上。让我引用the spec

当最近的祖先分段内容或分段根元素是body元素时,则适用于整个页面。

所以通过将nav 包装在header 中,我基本上说导航及其内容适合整个页面,这是真的吗?因为与此同时,我觉得将nav 放在header 中只在中型屏幕上有意义,因为附加信息仅在那里可见。对于更大的屏幕,.more-info 的内容是页眉。在小屏幕上,我什至不知道在&lt;h1&gt; 中放什么。

我可以把页面标题放在那里,但是一旦页面标题变成图像(徽标或类似的东西),它又是一个糟糕的标记。

我应该如何继续 - 页面上有两个 headers?据我所知,这是允许的,但我真的不确定在我的情况下是否可以/有意?

【问题讨论】:

    标签: css html responsive-design semantics


    【解决方案1】:

    你不应该在一个页面上有两个header 元素,即使它是可能的。原因是搜索引擎使用header 来了解有关您的页面的更多信息。如果你有多个,他们会变得混乱。这也是您不希望您的导航成为标题的原因,因为它无助于搜索引擎更多地了解您的页面。 header 元素应包含页面的标题。因此,将h1 元素包装在标头中是明智的。此元素应包含您页面的名称/用途。

    【讨论】:

    • 感谢您的回答,但您确定这是真的吗?我认为你可以在一个页面上拥有任意数量的标题元素——你只需要注意在什么上下文中。该标头的内容也由上下文决定。请参阅我的 Fiddles 中的 article 元素。它们都有一个带有h1 的标题元素,但h1 元素仅标记每篇文章的标题。
    • 您可以拥有任意数量的资源,但您会受到谷歌等搜索引擎的惩罚,而这正是它的设计初衷。因此,最佳做法是只有一个 header 元素。
    【解决方案2】:

    首先,我认为到目前为止,您在语义方面做得很好。

    可以在一页上有多个&lt;header&gt;标签,因为&lt;header&gt;标签(和&lt;footer&gt;就此而言)只代表它最近的祖先部分的标题区域(无论这个从字面上看是&lt;section&gt;,或者在你的情况下是&lt;main&gt;)。

    确实,如果您在全局标题中使用&lt;nav&gt; 标记,那么您就是在说该导航是您的全局网站导航。但是,从语义上讲,是否在某些断点处隐藏它是无关紧要的。

    毫无疑问,语义很重要,但我认为您不应将其视为项目的全部和结束,当然也不应为此感到压力。只要尽力而为,并且知道将来可以改进它。您可以将时间花在新网站上的许多更重要的事情上,例如在 SEO 中变得越来越重要的页面加载速度以及内容质量。

    如需进一步阅读,我建议查看 Smashing Magazine 的这篇文章,地址为 SEO for Responsive Websites

    【讨论】:

    • 感谢您的回答!您链接的文章是我很长一段时间以来阅读过的内容最丰富的文章。很高兴听到拥有良好的语义更多的是一个过程,而不是你简单地做的事情。但我有一个问题:你确定如果header 直接列在main 中,那么header 代表main 中所有内容的标题吗?因为section 是对内容进行分段,而main 是对内容进行分组,不会引入新的部分。
    • 我强烈推荐阅读 Smashing Magazine 的文章,它们总是写得很好。他们的书也很棒。这是你问的一个非常有趣的问题。由于main 元素相当新,因此还没有太多关于它的文章。但是,header 元素更适合 section 可能是对的,所以也许您可以在 main 内创建一个 section 并将您的标题放在那里。它确实取决于项目,就像我说的那样,当有更多关于main 元素的文章时,它总是可以在未来改变。祝你的项目好运!
    • @Sven - 你是对的。主要元素不是分段内容或分段根元素,因此在这种情况下,标题适用于正文元素 - 即整个页面。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2011-08-08
    相关资源
    最近更新 更多