圣杯布局跟双飞翼布局的实现,目的都是左右两栏固定宽度,中间部分自适应。
圣杯布局
整体布局,main 为外部容器,容器内 middle,left,right 依次排列(注意排列顺序)。
- 设置外部容器
.main {padding: 0 200px;}
; - 左中右部分,均设置
float: left;
; - middle 部分
.middle { 100%;}
占满; - 设置
.left{margin-left: -100%;}
使其占住 middle 的左侧; - 此时 left 覆盖了 middle 的部分,再设置
.left{position: relative;right: 200px; 200px;}
; - right 部分设置
.right{margin-right: -200px;}
即可。
.main {
padding: 0 200px 0 200px;
height: 300px;
}
.middle {
float: left;
100%;
height: 300px;
background: blue;
}
.left {
position: relative;
right: 200px;
float: left;
200px;
height: 300px;
background: red;
margin-left: -100%;
}
.right {
float: left;
200px;
height: 300px;
background: yellow;
margin-right: -200px;
}
<div class="main">
<div class="middle">middle</div>
<div class="left">left</div>
<div class="right">right</div>
</div>
双飞翼布局
如果把三栏布局比作一只大鸟,可以把 main 看成是鸟的身体,sub 和 extra 则是鸟的翅膀。
这个布局的实现思路是,先把最重要的身体部分放好,然后再将翅膀移动到适当的地方。
整体布局,main,sub,extra 依次排列。
- main,sub,extra 均设置
float: left;
; - main 设置宽度 100% 占满;
- 将 sub 拉至最左边,使用
margin-left: -100%;
,同理 extra 设置margin-right: -200px;
; - main 的内部增加一层
.main-inner{margin: 0 200px;}
;
.main,
.sub,
.extra {
float: left;
}
.main {
100%;
background: blue;
}
.main-inner {
margin: 0 200px;
}
.sub {
margin-left: -100%;
200px;
background: red;
}
.extra {
margin-left: -200px;
200px;
background: yellow;
}
<div class="main">
<div class="main-inner">
main
</div>
</div>
<div class="sub">sub</div>
<div class="extra">extra</div>
flex 实现类似布局
.main {
display: flex;
flex-direction: row;
}
.middle {
flex-grow: 1;
}
.left,
.right {
flex-grow: 0;
flex-basis: 200px;
}
<div class="main">
<div class="left">left</div>
<div class="middle">middle</div>
<div class="right">right</div>
</div>