我有一个像下面这样的网页:
<!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 无法将元素移动到新容器。这两个答案分为两类:
h2
属于 main
作为 h1
-- 在页面的标题中移动它是没有意义的。事实上,您是说您的标题与您的主要内容无关。在某些方面,这比使用您想要使用的那个 div 更糟糕,因为您通过将页面标题和站点标题分组到相同的语义上来建立错误的语义关系 header
.语义上无意义的容器,例如 div
, 用于 header
和 main
,在我看来实际上不那么反常。 所以,回到我所说的关于你为谁维护语义纯度的问题上,这是真正的哲学问题。通常有一个明显的、有效的和可维护的解决方案,而不会对现有语义元素或 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.
无论您的语义纯度是为了什么,这都是正确的做法
如果您认为 HTML 语义很重要,那么唯一可能的答案是 接受分层 HTML 语义对布局的限制 .问题是,CSS 无法重新创建布局层次结构。在此之前,您必须接受 HTML 既是一种表现语言又是一种语义语言 ,因此,语义永远是“更好”和“更坏”的问题。真正漂亮、丰富或完美的语义在许多(如果不是大多数)布局中是无法实现的。
关于css - 语义 HTML5 结构与 CSS 布局需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16767617/