作用:
圣杯布局和双飞翼布局解决的问题是相同的,就是两边定宽,中间自适应的三栏布局,中间栏要在文档流前面以优先渲染。
区别:
-
圣杯布局:为了让中间div内容不被遮挡,将中间div设置了左右padding-left和padding-right后,将左右两个div用相对布局position: relative并分别配合right和left属性,以便左右两栏div移动后不遮挡中间div。
-
双飞翼布局:为了让中间div内容不被遮挡,直接在中间div内部创建子div用于放置内容,在该div里用margin-left和margin-right为左右两栏div留出位置。
1. 圣杯布局
优点:不需要添加dom节点
缺点:正常情况下是没有问题的,但是特殊情况下就会暴露此方案的弊端,如果将浏览器无限放大时,「圣杯」将会「破碎」掉。当middle部分的宽小于left部分时就会发生布局混乱。(middle<left即会变形)
<div class='wrap'>
<div class="header">header</div>
<div class="content">
<div class="middle">中间的</div>
<div class="left">左边的</div>
<div class="right">右边的</div>
</div>
<div class="footer">footer</div>
</div>
{
min-width: 600px;
color: #ffff;
}
.header,
.footer {
height: 50px;
width: 100%;
background: grey;
}
.middle,
.left,
.right {
float: left;
}
.content {
overflow: hidden;
padding: 0 200px;
}
.left,
.right {
width: 200px;
height: 200px;
background: pink;
}
.middle {
width: 100%;
height: 200px;
background: yellowgreen;
}
.left {
margin-left: -100%;
//margin相对于上一个浮动盒子进行移动,margin-left的意思是子元素的左边框距离父元素右边框的距离
position: relative;
left: -200px;
}
.right {
margin-left: -200px;
position: relative;
left: 200px;
}
2. 双飞翼布局
优点:不会像圣杯布局那样变形
缺点:多加了一层dom节点
<div class='wrap'>
<div class="header">header</div>
<div class="content">
<div class="middle">
<div class="middle-inner">
middle-inner
</div>
</div>
<div class="left">左边的</div>
<div class="right">右边的</div>
</div>
<div class="footer">footer</div>
</div>
* {
margin: 0;
padding: 0;
}
body {
min-width: 600px;
color: #ffff;
}
.header,
.footer {
height: 50px;
width: 100%;
background: grey;
}
.middle,
.left,
.right {
float: left;
}
.content {
overflow: hidden;
}
.left,
.right {
width: 200px;
height: 200px;
background: pink;
}
.middle {
width: 100%;
height: 200px;
background: yellowgreen;
}
.left {
margin-left: -100%;
position: relative;
}
.right {
margin-left: -200px;
position: relative;
}
.middle-inner {
margin: 0 200px;
}