圣杯布局的实现

经典三列布局,也叫圣杯布局(Holy Grail of Layouts ),在国内也叫双飞翼布局。它的布局有几点要求:

1、三列布局,两边宽度固定,中间宽度自适应;

2、中间栏要在浏览器中优先展示渲染;

3、允许任意列的高度最高;

4、要求只用一个额外的div标签;

5、要求用最简单的CSS、最少的HACK语句。

实现方式:

首先需要进行三列布局,因为中间栏要优先渲染,所以要写在最前面。假定需要实现的是左侧宽度为200px,右侧宽度为150px,中间自适应宽度。HTML代码如下:

<div id="header">#header</div>

<div id="container">
     <div id="center" class="column">#center</div>
     <div id="left" class="column">#left</div>
     <div id="right" class="column">#right</div>
</div>

<div id="footer">#footer</div>

只多了一层额外的div,即id=container。它的CSS代码如下:

body {
min-width:550px; /*2LC width + RC width*/
}
#container {
padding-left:200px; /*LC width*/
padding-right:150px; /*RC width*/
}
#container .column {
height:200px;
position:relative;
float:left;
}
#center {
background-color:#e9e9e9;
width:100%;
}
#left {
background-color:red;
width:200px; /*LC width*/
right:200px; /*LC width*/
margin-left:-100%;
}
#right {
background-color:blue;
width:150px;
margin-right:-150px;
}
#footer {
clear:both;
}
#header,#footer {
background-color: #c9c9c9;
}
/** IE6 Fix **/
* html #left {
left:150px; /* RC width */
}

 下面我们来分布观察它的实现逻辑:

第一步:建立框架 


 先写header、container、footer三个div。

<div id="header">#header</div>
<div id="container"></div>
<div id="footer">#footer</div>

 将container的左右内边距分别设置为200px和150px。此时页面看起来就是这样:

第二步:加入三栏


此时有了基本的框架,可以把三栏塞进去。

<div id="header">#header</div>

<div id="container">
      <div id="center" class="column">#center</div>
      <div id="left" class="column">#left</div>
      <div id="right" class="column">#right</div> 
</div>

<div id="footer">#footer</div>

 注意:这里center栏要写在前面,然后依次是左栏和右栏。

接着给每栏添加上合适的宽度,并将它们设置为浮动。同时要清楚footer的浮动,以免它跟上面三栏一起浮动。

#contianer .column {
       float:left;
}

#center {
       width:100%;
}

#left {
       width:200px;

#right {
       width:150px;
}

#footer {
       float:both;
}

注意:这里中间栏的100%宽度是基于它的父容器container的宽度而言的。由于container设置类内边距,因此中间栏向左浮动到碰到container的内边距。 但左右两栏由于排在中间栏的后面,且因为空间不够被挤到了中间栏的下面,此时页面如下图所示:

第三步:把左侧栏放上去


 中间栏已经就位,剩下的就是把左右两栏放上去。先让左栏上去。

 首先,将左栏的外边距设为-100%(相对父容器container而言),此时左栏负外边距等于中间栏的宽度,这样一来,如果中间栏宽度(即100%对应的宽度)≥左栏宽度(200px),左栏将会向上浮动。这就是为什么开头要将body最小宽度设为550的原因。因为左栏上去后,页面最小宽度=200(左内边距)+100%(中间栏宽度)+150(右内边距)+200(左栏宽度)-100%(左栏负边距)=550px。

左栏上浮,与中间栏交叠在一起,并占据了左边。而右栏由于左栏上浮,自动向前浮动到了原先左栏的位置。此时页面样式如下:

接着我们要用到相对定位的属性(relative),并设置一个与左栏等宽的偏移量:

#container .column{
      float:left;
      position:relative;
}

#left {
      width:200px;               /* LC width */
      margin-left:-100%;
      right:200px;                /* LC width */
}
 

可以看到,因为所有栏目都是相对定位,左栏设置right属性,使得它相对自己向左偏移了200px。此时页面如下图所示:

第四步:把右栏放上去


 最后,我们把右栏放上去。给右栏设置一个与它等宽的负右边距即可,右栏就可以上去到右外边距的位置。

 右栏上去后,页面最小宽度=200(左内边距)+100%(中间栏宽度)+150(右内边距)+200(左栏宽度)-100%(左栏负边距)+150(右栏宽度)-150(右栏右负外边距)=550px。

 从这里也可以知道,为什么要设置 body的min-width=550px。

#right {
      width:150px;                 /* RC width */
      margin-right:-150px;     /* RC width */
}

此时页面如下:

 

本文完全参考自:

关于「圣杯布局」

特此感谢。

posted @ 2017-05-08 22:40  海盗洁哥  阅读(350)  评论(0编辑  收藏  举报