11.1.1 总体设计
随意打开一个 word 文档一看,其布局便一目了然。它分为左、右两栏,左栏为文档的目录树,右栏为文档的内容。而内容区又被分为页眉、正文和页脚三个部分。
这里跟现实版的 word 保持一致,也采用相同的布局,并遵守HTML5结构化、语义化的要求。左栏为侧栏,用 aside 定义,其内容为目录树。右栏为主内容区,用 main 来定义,其内容为文章的正文。页眉和页脚用 header 和 footer 来定义,文章的正文用 article 来定义。并且,把所有的内容都放到一个容器中。HTML代码如下:
<html>
<body>
<div id="wrapper">
<main>
<header></header>
<article></article>
<footer></footer>
</main>
<aside>
</aside>
</div>
</body>
</html>
上述设计首先由 html 元素创建初始包含块,让 body 元素在初始包含块中布局。然后,在 body 元素中创建一个 id = "wrapper" 的元素,#wrapper 元素在 body 元素创建的包含块中布局,并把整个页面都放在 #wrapper 容器中。最后,把 #wrapper 容器分为 aside 和 main两栏。aside 为目录导航,main 为主内容区,main 又分为 header、article、footer 三部分。最终的布局效果如图 11‑1 所示:
细心的读者可能已经发现,在HTML代码中,主内容区的代码出现在侧栏代码的前面。其实,这是我们践行“内容优先”原则时所使用的一个技巧,这样做可以提问网站的易用性和可访问性。首先,内容是页面上最重要的东西,在文档中应该先出现。其次,对于使用小屏幕设备、或屏幕阅读器的用户,就可以先看到主要内容。最后,通过CSS,可以方便地控制它们的显示顺序,对网页的布局不会有任何影响。
由于所有内容都放在容器中,首先设置容器的样式。如果文本行很长,阅读起来就很困难,常常令人生厌,随着显示器的尺寸越来越大,屏幕可读性问题变得越来越重要。解决这个问题的一个方法是让整个内容居中,并只占据屏幕的一部分,而不是整个屏幕的宽度,这样就可以确保文本行不会太长。
为此,只需定义容器的宽度,并将水平外边距设置为 auto,即可让容器水平居中。另外,可以通过 max-width 属性来限制容器的最大宽度,以防止容器过宽,影响阅读。
#wrapper {
width: 90%;
max-width: 1080px;
margin: 10px auto;
}
接下来,再设计容器中内容的样式,内容采用两列布局。众所周知,word 文档的目录和内容区的宽度,会随着窗口尺寸的改变而自动调整。其实,这就是前面介绍的流式布局,因为这是非常人性化的布局方式,我们也采用这种布局方式。
CSS3中的弹性盒模型,就非常适合流式布局。只需把 wrapper 容器的display 属性设置为 flex,并通过子容器的 flex-grow 属性定义各自的份额即可。其中,aside 占总宽的1/5,main 占总宽的4/5。同时,还要在 aside 和 main 之间保留一定的间隙。因为是弹性布局,间隙要使用百分比来定义。
另外,因为在HTML中, aside 出现在 main 的前面,还要通过 oreder 属性来控制它们的显示顺序。这里,定义 main 的 order 值为 1,aside的 order 值为 2,因为 order 值越小的元素,越显示在前面。
#wrapper {
display: flex;
}
aside{
order: 1;
flex-grow: 1;
margin-right: 2%;
}
main {
order: 2;
flex-grow: 4;
}
虽然在最新版本的Chrome浏览器下,这种布局可以工作地很好。然而,现实的情况是, IE9版本以下的老浏览器,既不CSS3的弹性盒模型,也不支持HTML5新增的 aside、main、header、footer、article 等结构化元素。
关于弹性盒模型,只能退而求其次,重新回到 float 布局,并把CSS代码单独放到 ie.css中文件中。
aside {
width: 20%;
float: left;
}
main {
width: 78%;
float: right;
}
关于让老IE支持HTML5的结构化元素,网上有很多优秀的解决方案,可以随意选择。我们选择 html5shiv.js 脚本。使用该脚本,唯一要做的,就是在HTML文件的头部引用它,仅此而已。
样式表文件和脚本都准备好后,通过IE条件注释,让IE9以下的版本加载它们即可。
<!--[if lt IE 9]>
<script src="js/html5shiv.js"></script>
<link href="css/ie.css" rel="stylesheet" />
<![endif]-->
现在一切都完美了,我们的布局在所有浏览器下都正常工作。由于采用百分比布局,可以随意调整浏览器窗口的大小,也不必担心布局出现问题。