【发布时间】:2013-05-21 23:34:15
【问题描述】:
我有一个类似下面的网页:
<!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 设置此文档的样式。我想成为顶部的页眉和底部的页脚,这当然很容易做到。在标题内,我想将徽标放在右侧,将导航放在中间,这也可以(例如,通过使用现代浏览器以一种或另一种方式支持的灵活框布局模型,或者通过使用浮动)。
当我想将主要的内容标题(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 标记的流顺序不同(并且嵌套以便灵活的框布局order 属性是不够的)。你会如何解决这个问题?用非语义元素(例如 div)重写 HTML5 标记,使其更符合视觉布局,然后尽可能使用新结构通过语义元素(例如页脚或主)交换非语义元素?
【问题讨论】:
-
我认为您提出的解决方案非常好。用于演示目的的
<div>标签应该与语义标签结合使用。不过,我很想看看那些比我更精通这些问题的人的答案...... -
使用 flexbox,您可以拥有源顺序独立性。您可以使用
order属性(在IE10 中为flex-order,在旧WebKit 和Firefox 中为box-ordinal-group)。有关更多信息,请参阅我文章的源顺序独立部分coding.smashingmagazine.com/2013/05/22/… -
@David Storey:感谢您分享您的文章。我知道 flexbox 的 order 属性,但这不允许我在不同的 flex 容器之间打乱,是吗?在我的第一个语义标记中,标题位于主容器内,但我不想将主容器放在标题之前,而只是将主容器的一个元素放在标题内(或在标题的其他元素之前)。
标签: css html accessibility semantic-markup wai-aria