CSS布局之什么是圣杯布局与双飞翼布局

圣杯布局与双飞翼布局

在面试时,你会经常遇到那么一个考题,有leftrightcontainer三个盒子,要求leftright盒子宽度固定,分别固定于浏览器两侧,container位于中间,宽度随浏览器窗口自适应;说白了,就是要你进行两边定宽,中间自适应的三栏布局,并且中间栏要放在文档流前面以优先渲染。而圣杯布局与双飞翼布局就是用来解决这个问题最常见的布局方法。但两者在实现上有一些差异。

先给出一个常见的DOM结构:

 CSS布局之什么是圣杯布局与双飞翼布局

先说圣杯布局

第一步,设置如下样式:

 CSS布局之什么是圣杯布局与双飞翼布局

给三盒子都加:float:left; 这时,由于container的宽度为100%;所以,一行装不下这三个盒子,leftright会被往下挤:

 CSS布局之什么是圣杯布局与双飞翼布局

这时,给leftmargin-left:-100%; rightmargin-left:-200px; 两个盒子就分别到了自己的位置上去:

 CSS布局之什么是圣杯布局与双飞翼布局

看到这,有人就会说,这不是达到效果了吗?其实,你仔细看就会发现,表面上看是达到效果了,其实,这时的container的宽度是100%;撑满浏览器的,它的左右两边各被left
right盖住了一部分,这就尴尬了。

第二步,给父元素加padding

 CSS布局之什么是圣杯布局与双飞翼布局

结果是:

 CSS布局之什么是圣杯布局与双飞翼布局

我们发现,这时,虽然container的宽度是对的了,但是leftright也也被挤到里面去了,还是把container的内容盖住了。

第三 步,加定位:

 CSS布局之什么是圣杯布局与双飞翼布局

leftrightposition: relative; 然后left相对自己往左偏移自身宽度的距离,让出盖住的部分,right相对自己往右偏移自身宽度,让出盖住的部分,这就可以达到我们想要的效果了:

 CSS布局之什么是圣杯布局与双飞翼布局

至于这三个盒子的高度,就看需求而定了,主要好好利用浮动与定位,相信很简单。

再来看双飞翼布局

双飞翼布局前期思路与圣杯布局一样,都是利用浮动和margin将三个盒子弄到一行的位子,也就是说在第一步上是一样的。不同的是如何处理被遮盖的问题。
相对圣杯布局,双飞翼布局要在DOM结构上加一个元素:

 CSS布局之什么是圣杯布局与双飞翼布局
container内部加了一盒显示内容的盒子container_in的盒子,在布局时,只要leftright不盖住container_in就可以了。

所以,双飞翼布局的css代码如下:

 CSS布局之什么是圣杯布局与双飞翼布局

只要给container加上左右margin,我们就得到了想要的效果:

 CSS布局之什么是圣杯布局与双飞翼布局
相对于圣杯布局来说,双飞翼布局不用给leftright加定位于leftright属性,只要在container内部加一个盒子用于显示内容,并给它设置相应的左右margin就可以了。两种布局各有特点。

其实,只要熟练掌握css布局原理,实现这种效果有很多种方法:

针对第二种DOM结构:

1)、

 CSS布局之什么是圣杯布局与双飞翼布局

 

2)、

 CSS布局之什么是圣杯布局与双飞翼布局

针对第一种DOM结构:

1)、

 CSS布局之什么是圣杯布局与双飞翼布局

  这些布局方式,可能不使用与某些需求,但只要掌握布局原理,做一些适当的改变就可以了。。。