布局总结2——三栏布局
三栏布局,左右定宽,中间自适应
- 1.flex布局–父级display:flex,左右定宽,中间flex:1
<style>
.san1_parent{
display: flex;
}
.san1_parent .left{
width: 200px;
background: pink;
}
.san1_parent .middle{
flex:1;
background: #CCFFFF;
}
.san1_parent .right{
width: 200px;
background: pink;
}
</style>
<div class="san1_parent">
<div class="left">left 200</div>
<div class="middle">middle 自适应</div>
<div class="right">right 200</div>
</div>
- 2.table布局–父级display:table,左中右display:table-cell,左右定宽,中间不设宽
<style>
.san2_parent{
display: table;
width: 100%;
}
.san2_parent .left{
display: table-cell;
width: 200px;
background: pink;
}
.san2_parent .middle{
display: table-cell;
background: #CCFFFF;
}
.san2_parent .right{
display: table-cell;
width: 200px;
background: pink;
}
</style>
<div class="san2_parent">
<div class="left">left 200</div>
<div class="middle">middle 自适应</div>
<div class="right">right 200</div>
</div>
- 3.流式布局–左右中,左侧左浮动,右侧右浮动,中间margin-left,margin-right
<style>
.san3_parent .left{
float: left;
width: 200px;
background: pink;
}
.san3_parent .right{
float: right;
width: 200px;
background: pink;
}
.san3_parent .middle{
margin-left:200px;
margin-right:200px;
background: #CCFFFF;
}
</style>
<div class="san3_parent">
<div class="left">left 200</div>
<div class="right">right 200</div>
<div class="middle">middle 自适应</div>
</div>
- 4.BFC布局–左右中,左侧左浮动,右侧右浮动,中间overflow:hidden(BFC)
<style>
.san4_parent .left{
float: left;
width: 200px;
background: pink;
}
.san4_parent .right{
float: right;
width: 200px;
background: pink;
}
.san4_parent .middle{
overflow: hidden;
background: #CCFFFF;
}
</style>
<div class="san4_parent">
<div class="left">left 200</div>
<div class="right">right 200</div>
<div class="middle">middle 自适应</div>
</div>
- 5.圣杯布局–中左右,中间100%宽,左右定位
1.将三者都 float:left , 再加上一个position:relative (因为相对定位后面会用到)
2.middle部分 width:100%占满
3.此时middle占满了,所以要把left拉到最左边,使用margin-left:-100%
4.这时left拉回来了,但会覆盖middle内容的左端,要把middle内容拉出来,所以在外围container加上 padding:0 220px 0 200px
5.middle内容拉回来了,但left也跟着过来了,所以要还原,就对left使用相对定位 left:-200px 同理,right也要相对定位还原 right:-220px
6.到这里大概就自适应好了。如果想container高度保持一致可以给left middle right都加上min-height:130px
<style>
.san5_parent{
padding:0 220px 0 200px;
overflow:hidden;
}
.san5_parent .middle,.san5_parent .left,.san5_parent .right{
float:left;
position: relative;
min-height: 130px;
}
.san5_parent .middle{
width:100%;
background: #CCFFFF;
}
.san5_parent .left{
margin-left: -100%;
left:-200px;
width: 200px;
background: pink;
}
.san5_parent .right{
margin-left: -220px;
right: -220px;
width: 220px;
background: pink;
}
</style>
<div class="san5_parent">
<div class="middle">middle 自适应</div>
<div class="left">left 200</div>
<div class="right">right 220</div>
</div>
===================2018-06-19 新增flex实现==========================
- 5.2 圣杯布局 flex实现
<body class="HolyGrail">
<header>...</header>
<div class="HolyGrail-body">
<main class="HolyGrail-content">...</main>
<nav class="HolyGrail-nav">...</nav>
<aside class="HolyGrail-ads">...</aside>
</div>
<footer>...</footer>
</body>
.HolyGrail {
display: flex;
min-height: 100vh;
flex-direction: column;
}
header,
footer {
flex: 1;
}
.HolyGrail-body {
display: flex;
flex: 1;
}
.HolyGrail-content {
flex: 1;
}
.HolyGrail-nav, .HolyGrail-ads {
/* 两个边栏的宽度设为12em */
flex: 0 0 12em;
}
.HolyGrail-nav {
/* 导航放到最左边 */
order: -1;
}
/*如果是小屏幕,躯干的三栏自动变为垂直叠加。*/
@media (max-width: 768px) {
.HolyGrail-body {
flex-direction: column;
flex: 1;
}
.HolyGrail-nav,
.HolyGrail-ads,
.HolyGrail-content {
flex: auto;
}
}
- 6.双飞翼布局–中左右,中间padding/margin
1.html代码中,main要放最前边,sub extra
2.将main sub extra 都float:left
3.将main占满 width:100%
4.此时main占满了,所以要把sub拉到最左边,使用margin-left:-100% 同理 extra使用margin-left:-220px
(这时可以直接继续上边圣杯布局的步骤,也可以有所改动)
5.main内容被覆盖了吧,除了使用外围的padding,还可以考虑使用margin。
给main增加一个内层div– main-inner, 然后margin:0 220px 0 200px
6.main正确展示
<style>
.san6_parent{
}
.san6_parent .middle,.san6_parent .left,.san6_parent .right{
float:left;
min-height:130px;
}
.san6_parent .middle{
width:100%;
background: #CCFFFF;
}
.san6_parent .middle .middle-inner{
margin:0 220px 0 200px;
}
.san6_parent .left{
margin-left: -100%; /*拉到最左,100% 不能写为px*/
width: 200px;
background: pink;
}
.san6_parent .right{
margin-left: -220px; /*拉到最右,不能写成100%*/
width: 220px;
background: pink;
}
</style>
<div class="san6_parent">
<div class="middle">
<div class="middle-inner">middle 自适应</div>
</div>
<div class="left">left 200</div>
<div class="right">right 220</div>
</div>
- 7.绝对定位
<style>
.san7_parent{
position: relative;
}
.san7_parent .left{
position: absolute;
top:0;
left:0;
width:200px;
background: #FFFF99;
}
.san7_parent .middle{
margin: 0 200px 0 200px;
background: #993399;
}
.san7_parent .right{
position: absolute;
top:0;
right:0;
width:200px;
background: #FFFF99;
}
</style>
<div class="san7_parent">
<div class="left">left 200</div>
<div class="right">right 200</div>
<div class="middle">middle 自适应</div>
</div>