圣杯布局(经典三列布局)
布局要求:
1、三列布局,中间宽度自适应,两边定宽;
2、中间栏要在浏览器中优先展示渲染;(所以html中中间栏写在左右栏前面)
3、允许任意列的高度最高;
4、要求只用一个额外的DIV标签;
5、要求用最简单的CSS、最少的HACK语句;
实现方法:
1.利用浮动,margin负值,相对定位,一个额外div包住这三栏
|
|
Main的宽度100%,left和right定宽,我们设为经典的200px,150px,三者都加浮动,float: left;
此时由于main宽度为100%,所以left和right上不去,浮在它下面(注意给父级清浮动)
为left栏设置margin-left: -100%;
为右边栏设置 margin-left: -150px;
此时左右栏浮上去了,但是盖在main的上面,会遮住Main的内容
为这三栏的父级div设置padding-left: 200px; padding-right: 150px; 留出左右栏的宽度,但是此时由于父级的padding左右栏也缩进来了
为左右栏加相对定位,各自相对于自己把自己挪出去,即可得到圣杯布局
demo演示
2.利用相对父级绝对定位,margin值,一个额外div包住这三栏
|
|
Main的宽度为auto,left和right定宽,我们设为经典的200px,150px,此时按html结构顺序排列如下
为left栏和right栏设置相对于父元素的绝对定位 此时左右栏便上去了,但是盖在main的上面,会遮住Main的内容
main设置margin-left: 200px; margin-right: 150px;
留出左右栏的宽度,即可得圣杯布局
demo演示
2.双飞翼布局
圣杯布局的改良,效果一样,但是实现简单一些
利用浮动,margin负值,两个额外的div
|
|
|
|
Main的宽度100%,left和right定宽,我们设为经典的200px,150px,三者都加浮动,float: left;
此时由于main宽度为100%,所以left和right上不去,浮在它下面(注意给父级清浮动)
为left栏设置margin-left: -100%;
为右边栏设置 margin-left: -150px;
此时左右栏浮上去了,但是盖在main的上面,会遮住Main的内容
再在新加的类名为inner的div上设置margin-left: 200px; margin-right: 150px;
给出两边栏的宽度即可得到双飞翼布局
demo演示
与圣杯布局的实现不同在于:
- 双飞翼布局的HTML结构多了一个div(.inner),这个div是加给main内层的
- 不需要父级div的padding,不需要左右栏的相对定位,只需要浮动和margin负值
3.等高布局
布局要求:
多列的高度保持一致,任一列的高度变化,其他列也变化
使用正的padding值和负的margin值对冲实现
在所有列中使用正的padding-bottom和负的margin-bottom,在所有列外面加上一个div,并设置这个div的overflow:hiden把溢出背景切掉即可得到等高布局,一般会把padding的margin的值设的很大。原理可以参见负margin原理。
这个方法的缺陷是,那就是如果要实现每列四周有边框效果,那么每列的底部(或顶部)将无法有边框效果。
为所有列加浮动float: left
,顺便加上5px的border后,情况如下:
现在为所有列加上padding-bottom: 9999px;margin-bottom: -9999px;
变成了下面这样,等高布局就出来了
当然,它的缺陷也出来了,底部边框不见了,加了那么大的padding值,父级还overflow了当然看不到了。
解决这个边框问题可以在每一列里面加上一个div,然后对这个div相对于所有列的父级div进行绝对定位,并设置高度和背景颜色模拟边框。这里的高度注意IE下的最小高度bug。这种方法需要依赖每一列的宽度。
还有一种方法是在所有列外面加一层div,并做一张边框背景图来模拟边框
我们采用第一种,进行相关操作后,变成了下面这样
改变任一列的高度,可看到其他列也变化了
|
|
2.使用边框模仿等高列,并不是真的等高列
这种方法比较适合两列或者三列,主要思路是将left列的border-right设成right列的宽度,并设置该边框的颜色与right列的背景色相同,而列的父级div的背景颜色设置为与列left的背景色相同。具体实现还要用到浮动与margin负值。这种方法感觉也有许多局限性,但是兼容性没问题
为所有列加浮动float: left
将left列的border-right设成right列的宽度,并设置margin-right为border-right的负值,此时已经可以实现left列高度变化时right列高度也变化
再将父级div的背景色设为left列的背景色,以便实现right列高度变化时left列也变化,就完成了视觉上的等高布局
|
|
|
|
3.利用背景嵌套与相对定位(固定布局)
这种方法的实现的原则是:任何div元素的最大高度来撑大其他的div容器高度。看下面的原理图
不管哪一列的高度最高,外面那三层背景的高度都会随最高列变化而变化,从而实现视觉上的等高布局
背景层的宽度均为100%,从第二层背景div开始用相对定位往左偏移出自身右边的列的宽度。
背景层相对定位后会溢出,所以最外层容器还要加overflow,而且每一列还要相对定位,偏移量为最近父级的溢出宽度,相对定位完后再浮动到同一行。
这种方法是不需要借助其他东西(javascript,背景图等),而是纯CSS和HTML实现的等高列布局,并且能兼容所有浏览器(包括IE6),并且可以很容易创建任意列数。有多少列就要有多少层背景div。
|
|
4.利用背景嵌套与相对定位(适应布局)
将上面那个方法中的宽度改为百分比形式即可