css - 语义 HTML5 结构与 CSS 布局需求

标签 css html accessibility semantic-markup wai-aria

我有一个像下面这样的网页:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Title</title>
    </head>
    <body>
        <header>
            <span>Logo</span>
            <nav>Navigation</nav>
        </header>
        <main>
            <h1>Page heading</h1>
            <div>
                Page content
            </div>
        </main>
        <footer>
            Content information
        </footer>
    </body>
</html>

页面结构类似于当前 HTML5 草案中的一个示例:http://www.w3.org/html/wg/drafts/html/master/grouping-content.html#the-main-element我认为它在语义上是正确的。

现在我想使用 CSS 来设置这个文档的样式。我想成为顶部的页眉和底部的页脚,这当然很容易实现。在标题内,我想将 Logo 放在右侧,将导航放在中间,这也可以(例如,通过使用灵活的框布局模型,现代浏览器以一种或另一种方式支持,或者通过使用 float )。

当我想将主要的内容标题(h1 元素)直观地放在标题的左侧时,我的问题就开始了。我可以使用 position: absolute ,但这样的布局不是很灵活,一旦标题或标题的大小发生变化就会中断。建议的 CSS 网格布局 http://www.w3.org/TR/css3-grid-layout/也许能够完全按照我的意愿去做,但据我所知,它仅在 IE 10 中(以某种方式)受支持。

一种简单而有效的解决方案是简单地重组我的页面:
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Title</title>
    </head>
    <body>
        <div>
            <h1 id="heading">Page heading</h1>
            <header>
                <span>Logo</span>
                <nav>Navigation</nav>
            </header>
        </div>
        <main aria-labelledby="heading">
            <div>
                Page content
            </div>
        </main>
        <footer>
            Content information
        </footer>
    </body>
</html>

这种解决方案虽然易于布局,但其完整语义仅通过 aria-* 属性表达,似乎违背了 HTML5 语义(尤其是主元素)的精神。

虽然我的示例页面可能很简单,但您可以轻松想象一个更复杂的页面,其中更多元素的视觉位置与 HTML5 标记的流顺序不同(并且嵌套以便灵活框布局顺序属性获胜不够)。你会如何解决这个问题?用非语义元素(例如 div)重写 HTML5 标记,使其更多地对应于视觉布局,然后在可能的情况下使用新结构通过语义元素(例如页脚或主要)交换非语义元素?

最佳答案

我遇到了和你一样的难题,我很感激你的挫败​​感。我将尝试否定答案,因为我觉得这两个积极的答案(即您可以实现两个目的)都没有捕获要点。

首先,在我看来,您的主要困难在于 CSS 无法将元素移动到新容器。这两个答案分为两类:

  • 有些是超特定的 hack(主观地说),涉及 float 、负边距和/或绝对定位,可以将元素从其容器中移出。这些可能是有效的,但仅限于非常特殊的情况。随着您的需求的增长,它变得难以维护,并且需要设置一个相当大的思维上限来解决您之前错过的每个新需求或边缘情况。 @jennifit 的回答试图让你朝这个方向前进。我相信,这是那些努力遵循语义HTML5精神的人所采取的正常路线,令人钦佩。但这可能是一个泥潭,让您开始问到底是为谁维护您的语义纯度?是为了搜索引擎、屏幕阅读器还是易于维护?我会在下一次分类后回到这一点。
  • 有些是语用合理化,声称在语义上是等效的,但实际上是不同的语义。在我看来,这些确实是语义黑客。 @volker-e 的回答就是一个例子。他是对的,这是一个可以工作的替代标记——但是,它不等于相同的语义。 h2属于 main作为 h1 -- 在页面的标题中移动它是没有意义的。事实上,您是说您的标题与您的主要内容无关。在某些方面,这比使用您想要使用的那个 div 更糟糕,因为您通过将页面标题和站点标题分组到相同的语义上来建立错误的语义关系 header .语义上无意义的容器,例如 div , 用于 headermain ,在我看来实际上不那么反常。

  • 所以,回到我所说的关于你为谁维护语义纯度的问题上,这是真正的哲学问题。通常有一个明显的、有效的和可维护的解决方案,而不会对现有语义元素或 CSS '技巧' 进行合理化的误用。在你的情况下,有一个元素在语义上是一个 child 但目前不是一个 child ,答案是你已经提出的问题:

    Rewrite the HTML5 markup with non-semantic elements (e.g. divs) so that it corresponds more to the visual layout and then exchange the non-semantic elements by[sic] semantic ones (e.g. footer or main) wherever possible with the new structure.



    无论您的语义纯度是为了什么,这都是正确的做法
  • 可访问性:在这种情况下,您可以使用 ARIA Angular 色以非分层方式实现这一点。
  • 搜索引擎:搜索引擎仍然理解旧的做事方式,所以如果你遵循旧的语义方法,你就不会陷入搜索引擎优化的麻烦。
  • 维护:这就是大多数人被吸引的原因——但问题是,可维护的 HTML 但不可维护的 CSS 有什么意义,或者相反?您别无选择,只能将您的维护视为 CSS 和 HTML 的组合,并且您必须找到中间立场,当您遇到困难的表示问题时,它们都将同样困惑。

  • 如果您认为 HTML 语义很重要,那么唯一可能的答案是 接受分层 HTML 语义对布局的限制 .问题是,CSS 无法重新创建布局层次结构。在此之前,您必须接受 HTML 既是一种表现语言又是一种语义语言 ,因此,语义永远是“更好”和“更坏”的问题。真正漂亮、丰富或完美的语义在许多(如果不是大多数)布局中是无法实现的。

    关于css - 语义 HTML5 结构与 CSS 布局需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767617/

    相关文章:

    jQuery 添加 css 到动态添加的 html 元素

    html - Bootstrap 3 的样式与他们自己的文档示例不同

    ios - ios5 是否有任何 api 可以通过编程方式说出选定的文本以实现可访问性?

    accessibility - aria-label 和 label 不能同时读取

    javascript - 父 css 文件处理上的 TinyMCE 和多个 CSS 选择器

    css - 如何更改 Aurelia 对话框中的边框颜色?

    html - 如何在 NavBar 的媒体查询中居中对齐/对齐菜单项?

    javascript - 用颜色选择中的选定值

    jquery - 如何使标题高度相对于(制表符)内容高度?

    android - 在 Scroll 上获取当前字母?