我有一个类似以下的网页:
<!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 标记的流顺序不同(并且嵌套以便灵活的框布局顺序属性获胜不够)。你会如何解决这个问题?用非语义元素(例如 div)重写 HTML5 标记,使其更符合视觉布局,然后尽可能使用新结构通过语义元素(例如页脚或主)交换非语义元素?