圣杯布局
圣杯模型
圣杯模型就是分为三栏,中间一栏用来渲染自适应,左右两侧两栏是固定宽度。有三种办法可以实现三栏左右两栏宽度固定,中间自适应。
绝对定位法
左右两栏采用绝对定位,分别固定于页面的左右两侧,中间的主体栏用左右margin值撑开距离。于是实现了三栏自适应布局。
HTML代码:
1 | <body> |
CSS代码为:
1 | <style type="text/css"> |
HTML代码中的三个div顺序是可以调换的,这与其他两种方法就不同了。
此方法的优点是,理解容易,上手简单,受内部元素影响而破坏布局的概率低,就是比较经得起折腾。
缺点在于:如果中间栏含有最小宽度限制,或是含有宽度的内部元素,当浏览器宽度小到一定程度,会发生层重叠的情况。
margin负值法
这种方法是在实际的网站中应用的最多的。
步骤一:给出HTML结构
1 | <header><h4>头部</h4></header> |
写结构的时候要注意,父元素的的三栏务必先写中间盒子。因为中间盒子是要被优先渲染。并且设置其自适应,也就是width:100%。
步骤二:给出每个盒子的样式
1 | header,footer{ |
此时的效果是三栏并没有在父元素的一行显示,左右两个盒子才会被挤下来,就是因为中间盒子我们给了百分之百的宽度。
那么如何让它们呈现出一行三列的效果呢?那就要让左边的盒子要到中间盒子的最左边,右边的盒子到中间盒子的最右边。换个想法,如果中间盒子不是100%的宽度,那么按照文档流,左边的盒子一定会在中间盒子的后面显示,接着显示右边的盒子。但是现在中间盒子是满屏了的,所以左右两个盒子被挤到下一行显示。我们要做到的是让左右两个盒子都上去。此时,CSS的负边距(negative margin)该上阵了。
步骤四:利用负边距布局
1、让左边的盒子上去
需要设置其左边距为负的中间盒子的宽度,也就是.left {margin-left:-100%;}
。这样左盒子才可以往最左边移动。
2、让右边的盒子上去
需要设置其左边距为负的自己的宽度,也就是.right {margin-left:-200px;}
。这样右盒子才可以在一行的最右边显示出自己。
步骤五:让中间一栏自适应调整
我们现在的确是硬性的实现了固比固布局。但是要记住,中间盒子是自适应的宽度,所以中间盒子里的内容会被左右盒子给压住一部分。这样的后果就是当我们在中间一栏写的内容非常多的时候,可能会有一部分内容被压在了左右两边两栏下面不能显示出来。所有我们现在要设置让中间一栏自适应调整。
首先,利用父级元素设置左右内边距的值,把父级的三个子盒子往中间挤。代码如下:
1 | .container{ |
这里的200px是左右盒子的宽度。这样的话,在页面的左右两边就留出来了左右两栏宽度的空白,用来存放两栏内容。
左右两边的内边距是有了,但是中间盒子上的内容还是被压着。
其次,给左右两个盒子加一个定位,加了定位之后左右两个盒子就可以设置left和right值。
代码如下:
1 | .left{ |
现在,圣杯布局终于搞定了,也实现了我们要的效果,左右侧的盒子固定,中间盒子自适应,而且中间盒子的内容完全不受影响。
此方法的优点:三栏相互关联,可谓真正意义上的自适应,有一定的抗性——布局不易受内部影响。
缺点在于:相对比较难理解些,上手不容易,代码相对复杂。出现百分比宽度,过多的负值定位,如果出现布局的bug,排查不易。
自身浮动法
此方法代码最简单。应用了标签浮动跟随的特性。左栏左浮动,右栏右浮动,主体直接放后面,就实现了自适应。
HTML代码结构如下:
1 | <body> |
CSS代码如下:
1 | <style type="text/css"> |
这里三个div标签的顺序的关键是要把主体div放在最后,左右两栏div顺序任意。
此方法的优点是:代码足够简洁与高效
不足在于:中间主体存在克星,clear:both属性。如果要使用此方法,需避免明显的clear样式。