首页 > 代码库 > css布局之圣杯布局和双飞翼布局

css布局之圣杯布局和双飞翼布局

圣杯布局和双飞翼布局

今天看了很多圣杯布局和双飞翼布局的技术博客,通过自己的理解总结一下吧。

  • 1.二者相同点: 
    实现的都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的固比固布局。它们实现的效果是一样的。

  • 2.不同点: 
    圣杯布局知识点:浮动,负边距,相对定位,不需要添加额外标签。 
    双飞翼:只用到浮动,负边距,不需要使用相对定位,需要添加一个额外的标签。 

  • 注意html结构中中间部分要写在左右布局之前,为了优先渲染。 


  • 下面就先来看一下圣杯布局的实现过程吧: 
    先写出基本DOM结构:
    <div class="header"></div>
<div class="body">
<div class="middle">middle</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
<div class="footer"></div>

然后给出基本的样式:

      * {
margin:0;
padding:0;
}

.header {
width: 800px;
height: 60px;
background-color: #ccc;
}

.body {
width: 800px;
}

.middle{
width: 100%;
background-color: #cc0;
}

.left{
width: 100px;
background-color: #c0c;
}

.right {
width: 150px;
background-color: #0c0;
}

.footer {
width: 800px;
height: 60px;
background-color: #ccc;
}

实现效果如图:

 

技术分享

 

接着给body部分三个块加上浮动 float:left,别忘了footer部分清除浮动clear:both

因为middle部分宽度100%,所以left和right挤到下面,如图示:

技术分享

 

那么怎么使left和right块跑到middle上呢,关键的一步来了,给left一个负边距margin-left:-100%; 对的,你没有看错,注意是-100%也就是middle的自适应宽度值,这样left块就跑到middle最左边了,同理,给right一个负边距margin-right: -150px;(right块的自身宽度值),这样right块就跑到middle最右边了,效果如图:

技术分享

 

当然这样还不行,因为middle盒子里的内容会被left和right挡住,如图:

技术分享

 

 

所以,我们先给这三个块的父级容器即body加一个padding值: 
padding-left: 100px; padding-right:150px;,同时body的宽度值800px减去padding改为 550px;可以看到:

技术分享

最后压轴部分来了,要使用相对定位把左右块分别拉到左右边,给left一个position:relative; left: -100px; 给right 一个position:relative; right:-150px; 就大功告成了:

技术分享

总体css代码如下:

      * {
margin:0;
padding:0;
}

.header {
width: 800px;
height: 60px;
background-color: #ccc;
}

.body {
width: 550px;
padding-left:100px;
padding-right:150px;
}

.middle{
float:left;
width: 100%;
background-color: #cc0;
}

.left{
float:left;
width: 100px;
position: relative;
left: -100px;
margin-left:-100%;
background-color: #c0c;
}

.right {
float:left;
width: 150px;
position: relative;
right:-150px;
margin-left:-150px;
background-color: #0c0;
}

.footer {
clear:both;
width: 800px;
height: 60px;
background-color: #ccc;
}

其实双飞翼布局相比圣杯布局就只是改动了一小点,在middle标签里加一个内部标签,基本实现过程也相差不大,直接看代码吧: 
DOM结构部分:

        <div class="header"></div>
<div class="body">
<div class="middle">
<div class="inner">main</div>
</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
<div class="footer"></div>

样式部分:

*{
padding:0;
margin:0;
}

.container {
width: 800px;
margin:0 auto;
}

.header,.footer {
height: 60px;
clear:both;
background-color: #888;
}

.middle{
width: 100%;
float:left;
background-color: #cc0;
}

.left {
float:left;
width: 100px;
margin-left:-100%;
background-color: #c0c;
}

.right {
float:left;
width: 150px;
margin-left: -150px;
background-color: #0cc;
}

.inner {
margin-left:100px;
margin-right:150px;
}

双飞翼布局是淘宝UED团队提出的,淘宝网的头部部分就使用了此布局:

 

技术分享

css布局之圣杯布局和双飞翼布局