多列布局是从两列布局引申出来的,所以我们先来看两列布局
HTML结构如下所示:
<div class="parent">
<div class="left">
<p>leftp>
div>
<div class="right">
<p>r-leftp>
<p>r-rightp>
div>
div>
这里的left是定宽,right自适应
.left {
float: left;
width: 100px;
}
.right {
margin-left: 120px; /* 留出一部分空隙 */
}
clear:both
right中的文字会整体下移,解决这个问题可以用下面的方法我们需要变动一下上面的html结构,在right外套一个div
<div class="parent">
<div class="left">
<p>leftp>
div>
<div class="right-fix">
<div class="right">
<p>r-leftp>
<p>r-rightp>
div>
div>
div>
.right-fix {
float: right;
width: 100%;
margin-left: -100px;
}
.left {
float: left;
width: 100px;
position: relative;
}
.right {
margin-left: 120px;
}
这里我们让right-fix
右浮动,这时会使left
和right-fix
处于一个层上。指定width:100%
让right
充满父元素,这时right-fix
会在left
的下方。所以我们需要再指一个负的margin-left
让right-fix
覆盖在left
上面。同时right
指定margin-left
抵消掉right-fix
设置的负的margin。为了让left
显示在最上面,需要给left
指定一个position: relative
。真是够麻烦的。。。
.left {
float: left;
width: 100px;
margin-right: 20px;
}
.right {
overflow: hidden;
}
给一个块元素设置了overflow: hidden
会触发该块元素的BFC(Block Formating Context)
模式。在这里,right块就不会紧贴着它的父元素的左边框了。所以它会和left左右依次排列。
- 优点:兼容性好,只有IE6不支持。设置也比较简单。
.parent {
display: table;
width: 100%;
table-layout: fixed;
}
.left, .right {
display: table-cell;
}
.left {
width: 100px;
padding-right: 20px;
}
这种方式采用了表格布局。table-cell
布局的元素会左右依次排列。
- 给parent设置width: 100%
是因为默认表格布局的宽度是子元素的宽度。
- table-layout
属性可以提高渲染速度,以布局优先的原则
- 由于table-cell
布局的元素没法设置margin
,所以边距需要设置padding
.parent {
display: flex;
}
.left {
width: 100px;
margin-right: 20px;
}
.right {
flex: 1;
}
给right
设置flex: 1
是同时设置了flex-grow
和flex-shrink
都设置为1,这样以达到自适应。
- 优点:设置简单,容易理解
- 缺点:flex的兼容问题,性能问题
HTML结构如下所示:
<div class="parent">
<div class="left">
<p>leftp>
div>
<div class="center">
<p>centerp>
div>
<div class="right">
<p>rightp>
div>
div>
.left, .center {
float: left;
width: 100px;
margin-right: 20px;
}
.right {
overflow: hidden;
}
HTML结构如下所示:
<div class="parent">
<div class="left">
<p>leftp>
div>
<div class="right">
<p>rightp>
div>
div>
和定宽加自适应布局类似,不过这里的left不知道宽度
不定宽+自适应
布局可以由上面介绍的定宽+自适应
布局引伸过来。这里需要分析的地方使第二列的样式是否与第一列的宽度有耦合性。分析如下:
- float+margin
/float-fix
两种方法第二列需要设置margin
,而margin
的值是根据第一列的宽设定的,所以具有强耦合性,因而不能实现
- 同理float+overflow
可以实现
- table
布局可以实现,但同时需要注意
+ .parent
中去掉table-layout
样式。table-layout
是布局优先,而现在是不定宽。
+ left
中添加width: 0.1%
,设置此主要是为了兼容性考虑
代码如下:
.parent {
display: table;
width: 100%;
}
.left, .right {
display: table-cell;
}
.left {
width: 0.1%;
padding-right: 20px;
}
flex
可以实现HTML结构如下所示:
<div class="parent">
<div class="left">
<p>leftp>
div>
<div class="center">
<p>centerp>
div>
<div class="right">
<p>rightp>
div>
div>
不定宽+自适应
方式引申而来。 float+overflow
, table
, flex
都可以实现.left,.center {
float: left;
margin-right: 20px;
}
.right {
overflow: hidden;
}
/* p的宽度即是内容的宽度 */
.left p,.center p {
width: 100px;
}
.parent {
display: table;
width: 100%;
}
.left,.center,.right {
display: table-cell;
}
.left,.center {
width: 0.1%;
padding-right: 20px;
}
.left p,.center p {
width: 100px;
}
.parent {
display: flex;
}
.left,.center {
margin-right: 20px;
}
.right {
flex: 1;
}
.left p,.center p {
width: 100px;
}