本文章主要系统性讲解和汇总css与布局相关的知识,便于大家后续查阅和讨论。
整体而言,css布局的技术,主要与display、table、float相关,如果去除table布局,则核心是display与float属性之间的结合使用,来达到多样化的页面布局效果。
布局的核心是处理纵向和横向分布的问题,对于纵向而言,直接使用块级元素,按照标准文档流进行布局即可。对于横向而言,因为原则性块级元素独占一行,故本质需要通过触发BFC机制实现,即让某些块级元素脱离正常文档流(其实正常文档流本身是一个根BFC),然后实现一行多列的布局效果,至于触发BFC的方法,则主要是通过display、float和position完成,当然overflow也可以触发BFC,但一般不会作为主要布局机制使用,仅仅用来辅助解决因子元素脱离文档流导致父元素高度塌陷、margin传递等问题时使用。
整体而言,主要有以下7种页面布局方式和机制:
说明:常用布局方法,主要使用float形成BFC实现一行多列布局。
效果:实现一行三列布局,左右固定宽度,中间自适应宽度
css样式:
#float{
width:100%;
height: 300px;
clear:both;
}
.float-l{
width:200px;
height: 100%;
float: left;
}
.float-c{
width:calc(100% - 400px);
height: 100%;
float: left;
}
.float-r{
width:200px;
height: 100%;
float: left;
}
HTML结构:
说明:不经常使用,主要使用inline-block行排列特性,且因为是inline-block,需在父容器内将默认font-size设置为0px;
效果:实现一行三列布局,左右固定宽度,中间自适应宽度
css样式:
#inline-block{
width: 100%;
height: 300px;
font-size: 0px;
clear: both;
}
.inline-l{
width:200px;
height: 100%;
display:inline-block;
}
.inline-c{
width:calc(100% - 400px);
height: 100%;
display:inline-block;
}
.inline-r{
width:200px;
height: 100%;
display:inline-block;
}
HTML结构:
说明:经常使用,主要使用flex特性,且在多列按比例分配横向宽度时,不用计算,非常方便。
效果:实现一行三列布局,左右固定宽度,中间自适应宽度
css样式:
#flex{
width: 100%;
height: 300px;
display:flex;
clear: both;
}
.flex-l{
width:200px;
height: 100%;
}
.flex-c{
flex:1;/*为1时,会自动填充横向剩余宽度*/
height: 100%;
}
.flex-r{
width:200px;
height: 100%;
}
HTML结构:
说明:css3中网格系统,非常强大,能高效实现很复杂的多行多列布局,类似使用table布局,但更为直观和方便,可通过设置grid-template-areas并与grid-area结合来实现布局,而不用使用colspan属性,并有很多其他丰富功能,此处不展开讲解,可自行深入学习。使用grid能很方便的实现常规的多列布局。
其结合了table和flex的所有优点,可使用相对单位fr很方便的进行多列宽度自适应分配。
效果:实现一行三列布局,左右固定宽度,中间自适应宽度
css样式:
#grid{
width: 100%;
height: 300px;
display:grid;
clear: both;
grid-template-columns:200px 1fr 200px; /*1fr会自动填充横向剩余宽度*/
grid-template-areas:'a1' 'a2' 'a3';
}
.grid-l{
grid-area:'a1';
}
.grid-c{
grid-area:'a2';
}
.grid-r{
grid-area:'a3';
}
HTML结构:
说明:该display类型主要是模拟了古老的table标签布局,可以搭配display中的table-cell、table-column、table-row进行详细布局,类似table中的td、tr,但是使用起来更加直观。
效果:实现一行三列布局,左右固定宽度,中间自适应宽度
css样式:
#display-table{
width: 100%;
height: 300px;
display:table;
clear: both;
}
.table-l{
display:table-cell;
width:200px;
}
.table-c{
display:table-cell;
width:calc(100% - 400px);
}
.table-r{
display:table-cell;
width:200px;
}
HTML结构:
说明:该种布局方式,直接使用table标签,但因table标签本来是用来展示表格类,故此种方法现在较少使用,推荐使用以上几种布局方式,而让table标签回归其本位。
效果:实现一行三列布局,左右固定宽度,中间自适应宽度
css样式:
table{
width:100%;
border-spacing:0px; /*去除table列间距*/
border-collapse: collapse;
}
#table{
height: 300px;
}
.t-l{
width:200px;
}
.t-c{
width:calc(100% - 400px); /*通过计算自适应宽度*/
}
.t-r{
width:200px;
}
HTML结构:
说明:该种布局方式,主要使用position的relative与absolute,通过定位来实现布局,不建议使用该布局方法进行页面整体布局,可作为局部区域布局的方案。
效果:实现一行三列布局,左右固定宽度,中间自适应宽度
css样式:
#position{
height: 300px;
width:100%;
position:relative; /*让子div相对父div进行定位*/
}
.p-l{
position:absolute;
width:200px;
height:100%;
left:0px;
}
.p-c{
position:absolute;
left:200px;
width:calc(100% - 400px); /*通过计算自适应宽度*/
height:100%;
}
.p-r{
position:absolute;
width:200px;
height:100%;
right:0px;
}
HTML结构:
以上为页面整体布局相关方案和机制,当然,以上均可以进行相互嵌套实现更复杂的布局,但整体来说,核心机制是一样的。
当然,如果能把css3中的grid网格系统熟练掌握,则再复杂的布局也能快速搞定,且通过布局知识,可以更加深入理解文档流和BFC核心概念。
以上布局机制,总结为表格如下:
布局方案\属性 | 标签 | 父元素display |
父元素position | 子元素float |
子元素postion |
子元素margin |
子元素width | 子元素其他 | 备注 |
方案1
|
div |
block |
|
left or right |
|
位置微调 | 指定宽度px或% |
|
常用 |
方案2 |
div |
inline-block |
|
|
|
位置微调 | 指定宽度px或%或calc |
|
不太常用 |
方案3 |
div |
flex |
|
|
|
位置微调 | 指定宽度px或%或flex1 |
|
常用--自适应流式布局 |
方案4 |
table |
|
|
|
|
|
指定类宽px或% |
|
不建议使用 |
方案5 | div | grid-划分区域 |
|
|
|
|
指定宽度px或%或fr |
grid-area |
最强大,各种布局均可轻松实现 |
方案6 | div |
table |
|
|
|
|
|
|
不太常用 |
方案7 |
div |
|
reative |
|
absolute |
|
|
|
在需要精准定位布局时使用 |
说明: | 以上方案一般都是用于页面整体布局,但也可以嵌套使用, |
后续可再熟练掌握对齐等相关操作,则HTML页面布局便能轻松搞定。