这篇文章讲述使用 CSS Float 实现圣杯布局。
Float 浮动
float 是 CSS 中一种比较麻烦的属性,涉及到 BFC 和清除浮动。
float 特点
float 的影响
对自身的影响
- 形成“块”(BFC);
- 位置尽量靠上;
- 位置尽量靠左/右。
对兄弟元素的影响
- 不影响其他块级元素的位置;
- 影响其他块级元素的内部文本
对父级元素的影响
- 从父级的布局中“消失”;
- 造成父级元素的高度塌陷:父级元素撑开 div1
之后(父级元素里没有其他元素的情况下),如果设置 div1 为 float
之后,会让父级元素的高度变为0。
圣杯布局
圣杯布局(Holy Grail
Layout)指的是一种最常见的网站布局。页面从上到下,分成三个部分:头部(header),躯干(body),尾部(footer)。其中躯干又水平分成三栏,从左到右为:导航、主栏、副栏。

代码实现
全量代码如下,包括 Html 及 css 脚本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Holy Grail Float</title> <style type="text/css"> body { min-width: 550px; }
#header { background-color: #999999; } #middle{ padding-left: 200px; padding-right: 150px; } #middle .column{ float: left; height: 200px; } #left{ width: 200px; background-color: #FFFF00; margin-left: -100%; position: relative; right: 200px; } #center{ width: 100%; background-color: pink; } #right{ margin-right: -150px; width: 150px; background-color: #CCCCCC; } #footer { background-color: #999999; } .clearfix:after{ display: table; content: ''; clear: both; } </style> </head> <body> <div id="header">header</div> <div id="middle" class="clearfix"> <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> </body> </html>
|
页面架构
- 整体分为三个部分,分别是 header, middle 和 footer. 其中 middle
又分为三个部分,分别是 center, left 和 right 边栏;
- middle 中的 center 部分是页面的核心区,为了 SEO
优化,将其放在最前面,而不是中间;
- 使用 float 将 center, left 和 right 三部分浮动起来,同时借助
margin-left 和 margin-right 将 left 和 right 移到到 center 两旁;
- position: relative 的作用是将 left 移动到视图的最左边,给 center
腾出位置。
最终的效果如下所示: 
设计思路
初始页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| body { min-width: 550px; }
#header { background-color: #999999; }
#middle{
}
#middle .column{ float: left; height: 200px; }
#left{ width: 200px; background-color: #FFFF00; }
#center{ width: 100%; background-color: pink; }
#right{ width: 150px; background-color: #CCCCCC; }
#footer { background-color: #999999; }
.clearfix:after{ display: table; content: ''; clear: both; }
|
让 center, left 和 right 浮动起来,center 由于宽度占据了 middle
的所有空间,所以 center 占满了一行,将 left 和 right
挤到下一行,如下图所示: 
调整两侧空间
1 2 3 4 5
| #middle{ padding-left: 200px; padding-right: 150px; }
|
调整 middle 两侧空间,为 left 和 right 留出空间。如下图所示: 
left
向左移动 center 的宽度,来移动到 center 所在的行
1 2 3 4 5 6 7
| #left{ width: 200px; background-color: #FFFF00; margin-left: -100%; }
|
虽然不在同一行,float
的元素之间是紧紧挨着的,等同于在同一行。margin-left: -100%;
表示向左移动 center 的宽度,效果如下图所示: 
left
再向左移动自身宽度,露出被覆盖的 center
1 2 3 4 5 6 7 8 9 10 11
| #left{ width: 200px; background-color: #FFFF00; margin-left: -100%; position: relative; right: 200px; }
|
对于 relative
来说,right:200px;
意味当前元素的右边,距离原本的位置右边有 200px
的距离。效果就是往左移动 200px
的距离,效果如下图所示:

right 移到 center 的右侧
1 2 3 4 5 6
| #right{ margin-right: -150px; width: 150px; background-color: #CCCCCC; }
|
right 元素的定位设置只有简单的
margin-right: -2150px;
,就能实现准确定位,效果如下图所示:

参考:
1.
浮动
2.
CSS布局
3.【CSS】圣杯布局和双飞翼布局(包括完整代码)
4.
从圣杯布局中,我彻底了解float,margin