单栏布局
常见单栏布局有以下情况:
- header/content/footer等宽单栏布局
- header/footer等宽,content略窄单栏布局
第一种情况:1
2
3<div class="header"> header </div>
<div class="content"> content </div>
<div class="footer"> footer </div>
css部分1
2
3
4
5
6
7
8
9
10
11
12.header{
width:100%; // ①
background:#c0c0c0;
}
.content{
width:100%; // ①
background:#f1f1f1;
}
.footer{
width:100%; //①
background:#000
}
上述设置的width自适应充满屏幕。
如果设置width为固定值或者设置最大宽度(max-width),当屏幕小于当前设置固定宽度(width)时,会出现滚动条;
而设置的最大宽度(max-width),则不会出现滚动条。
如果实现居中,解决办法是添加居中属性(margin: 0 auto)即可。
1 | .header{ |
第二种情况:1
2
3<div class="header"> header </div>
<div class="content"> content </div>
<div class="footer"> footer </div>
css部分1
2
3
4
5
6
7
8
9
10
11
12
13
14
15.header{
max-width: 800px;
background: #c0c0c0;
margin: 0 auto; // ①
}
.content{
max-width: 700px;
background:#f1f1f1;
margin: 0 auto; // ①
}
.footer{
max-width: 800px;
background:#000;
margin: 0 auto; // ①
}
注意:
如果header/footer内容宽度不设置,块级元素会充满整个屏幕;
如果header/content/footer内容区域中有设置同一个宽度,通过margin:0 auto居中。
1 | <div class="header"> |
css部分1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20.header{
max-width: 800px;
background:#c0c0c0;
margin: 0 auto; // ①
}
.container{
max-width:600px; //宽度
background:#fff;
margin: 0 auto; // ①
}
.content{
max-width:600px; // 宽度
background:#f1f1f1;
margin: 0 auto; // ①
}
.footer{
max-width:800px;
background:#000;
margin: 0 auto; // ①
}
两栏布局
指一边栏固定宽度,另一边栏充满剩余宽度。
常见两栏布局有以下情况:
- 左栏固定宽度,右栏自适应
- 左栏自适应,右栏固定宽度
第一种情况1
2<div class="left"> left </div>
<div class="right"> right </div>
1 |
|
使用flex1
2<div class="left"> left </div>
<div class="right"> right </div>
1 | .body{ |
第二种情况:(注意DOM布局顺序)1
2<div class="right"> right </div>
<div class="left"> left </div>
1 | .right{ |
使用margin-right属性留出重叠区域。
使用flex1
2<div class="left"> left </div>
<div class="right"> right </div>
1 | .body{ |
如果是自适应两栏布局使用float + overflow1
2
3
4<div class="content">
<div class="left"> left </div>
<div class="right"> right </div>
</div>
1 | .content{ |
这种方式通过overflow触发BFC,这时zoom:1兼容IE6浏览器;如果侧边栏在右侧注意渲染顺序。
三栏布局
指两边栏固定宽度,中间栏自适应布局。
第一种圣杯
实现原理:
三栏都设置左浮动,设置中间栏宽度为100%;
这时左右两栏会掉下来,设置margin-left为负值,添加相对定位并设置left属性与right属性,与中间栏同一行;
设置padding留出间距。
1 | <div class="middle"> middle </div> |
1 |
|
第二种双飞翼
实现原理:
三栏左浮动,设置中间栏宽度为100%;
这时左右两栏会掉下来,设置margin-left为负值并设置left属性与right属性,与中间栏同一行;
在中间栏增加一个div,设置margin留出左右间距。
1 | <div class="middle"> |
1 | .middle{ |
圣杯布局与双飞翼布局对比:
圣杯布局是在父容器的左/右内边距配合两个从列相对定位。
双飞翼布局是把主列嵌套在一个父级块中配合主列左/右外边距。
第三种flex
1 | <div class="left"> left </div> |
1 | body{ |
补充flex:1
flex是flex-grow,flex-shrink, flex-basis的缩写;默认值:0 1 auto。后两者属性可选。
flex-grow:属性定义了该空间的放大比例,默认值0;表示如果存在剩余空间,也不放大。
flex-skrink:属性定义了该空间的缩小比例,默认值1;表示如果空间不足,该空间将缩小。
flex-basis:属性定义在分配多余空间之前,占据的主轴空间。浏览器根据这个属性,计算主轴是否有剩余空间,默认值auto,表示该空间本来的大小。
flex:属性由两个值:auto(1 1 auto) 和 none(0 0 auto)。