一、两列布局

1.1 左列定宽,右列自适应


1)利用float + margin实现 (方法1)

HTML代码:

<div class="two-col-1">
  <div class="left">左列定宽</div>
  <div class="right">右列自适应</div>
</div>

CSS代码:

.left {
  width: 600px;
  height: 400px;
  background-color: pink;
  float: left;
}
.right {
  height: 400px;
  background-color: skyblue;
  margin-left: 600px;
}



2)利用float + margin实现 (方法2)

HTML代码:

<div class="two-col-2">
  <div class="left">左列定宽</div>
  <div class="right-fix">
    <div class="right">右列自适应</div>
  </div>
</div>

CSS代码:

.left {
  width: 100px;
  height: 400px;
  background-color: #33cccc;
  float: left;
}
.right-fix {
  margin-left: -100px;
  width: 100%;
  float: right;
}
.right {
  margin-left: 100px;
  height: 400px;
  background-color: #876ed7;
}



3)利用float + overflow实现

HTML代码:

<div class="two-col-3">
   <div class="left">左列定宽</div>
   <div class="right">右列自适应</div>
</div>

CSS代码:

.left {
  width: 100px;
  height: 400px;
  background-color: #d25fd2;
  float: left;
}
.right {
  height: 400px;
  background-color: #d235d2;
  overflow: hidden;
}
解析: div.right设置overflow: hidden形成BFC,不与div.left的float box重叠,宽度达到自适应。
BFC(block formatting context,块级格式化上下文)

创建BFC的情况:
1、浮动元素(float: left | right);
2、绝对定位元素(position: absolute | fixed);
3、行内块元素(display: inline-block);
4、表格的单元格(display: table-cells,td、th);
5、表格的标题(display: table-captions | table-caption);
6、'overflow' 特性不为visible 的元素;
7、弹性盒 (display: flex | inline-flex);

BFC布局规则:
1、内部的Box会在垂直方向,一个接一个地放置。
2、Box垂直方向的距离由margin决定。属于同一个BFC的两个相邻Box的margin会发生重叠。
3、每个元素的margin box的左边, 与包含块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此。(#)
4、BFC的区域不会与float box重叠。(#)
5、BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素。反之亦然。
6、计算BFC的高度时,浮动元素也参与计算(清除浮动)。

因为BFC内部的元素和外部的元素绝对不会互相影响,因此,本例中当BFC外部存在浮动时,它不应该影响BFC内部Box的布局,BFC会通过变窄,而不与浮动有重叠。

1)和3)的异同:
相同点:两者的 div.left 都采用float浮动
不同点:
1)的 div.right 使用 margin-left 改变宽度。
3)的 div.right 使用 overflow: hidden 自身形成BFC自适应宽度,不需要关注 div.left 的定宽。



4)利用table实现

HTML代码:

<div class="two-col-4">
   <div class="left">左列定宽</div>
   <div class="right">右列自适应
      <div></div>
      <div></div>
   </div>
</div>

CSS代码:

.two-col-4 {
  width: 100%;
  height: 400px;
  display: table;
}
.left, .right {
  display: table-cell; /* 利用单元格自动分配宽度 */
}
.left {
  width: 100px;
  background-color: #ff9040;
}
.right {
  background-color: #ffb273;
}
.right div{
  background-color: red;
  width: 100px;
  height: 100px;
  margin: 30px;
}
缺点:display: table-cell形成BFC,造成margin collapse。属于同一个BFC的两个相邻Box的margin会发生重叠。



5)使用position实现

HTNML代码:

<div class="two-col-5">
  <div class="left">左列定宽</div>
  <div class="right">右列自适应</div>
</div>

CSS代码:

.two-col-5 {
  position: relative;
}
.left {
  width: 100px;
  height: 400px;
  background-color: #f7fe00;
  position: absolute;
  top: 0;
  left: 0;
}
.right {
  height: 400px;
  background-color: #52e93a;
  position: absolute;
  top: 0;
  left: 100px;
  right: 0;
}



6)使用flex实现

HTML代码:

<div class="two-col-6">
   <div class="left">左列定宽</div>
   <div class="right">右列自适应</div>
</div>

CSS代码:

.two-col-6 {
  width: 100%;
  height: 400px;
  display: flex;
}
.left {
  width: 100px;
  background-color: #39e639;
}
.right {
  flex: 1;
  background-color: #67e667;
}
解析:flex 是 flex-grow、flex-shrink 和 flex-basis 的简写。
flex-grow:用来“瓜分”父项的“剩余空间”
flex-shrink: 设置子项的缩小比例,默认为1,即如果父项空间不足,该项目将缩小。
flex-basis:用于设置子项的占用空间。如果设置了值,则子项占用的空间为设置的值;如果没设置或者为auto,那子项的空间为width/height 的值。


1.2 右侧定宽,左侧自适应


1)使用float + overflow 实现

HTML代码:

<div class="two-col-r-2">
   <div class="right">右列定宽</div> <!-- 先写div.right -->
   <div class="left">左列自适应</div>
</div>

CSS代码:

.left {
  height: 400px;
  background-color: pink;
  overflow: hidden; /* BFC */
}
.right {
  width: 100px;
  height: 400px;
  background-color: skyblue;
  float: right;
}


1.3 一列不定,一列自适应



1)使用float + overflow实现

HTML代码:

<div class="two-col-lr-1">
  <div class="left">左列不定宽</div>
  <div class="right">右列自适应</div>
</div>

CSS代码:

.left {
  height: 400px;
  background-color: #ff9040;
  float: left; /* 只设浮动,不设宽度 */
}
.right {
  height: 400px;
  background-color: #ffb273;
  overflow: hidden; /* 触发BFC */
}



2)使用flex实现

HTML代码:

<div class="two-col-lr-2">
  <div class="left">左列不定宽</div>
  <div class="right">右列自适应</div>
</div>

CSS代码:

.two-col-lr-2 {
  display: flex;
}
.left { /* 不设宽度 */
 height: 400px;
 background-color: #f63e62;
}
.right {
 height: 400px;
 background-color: #f66f89;
 flex: 1; /* 均分父项剩余部分 */
}


二、三列布局

2.1 两列定宽,一列自适应



1)使用float + margin实现

HTML代码:

<div class="tri-col-1">
   <div class="left">左列定宽</div>
   <div class="center">中间定宽</div>
   <div class="right">右列自适应</div>
</div>

CSS代码:

.tri-col-1 {
  min-width: 300px;
}
.left {
  width: 100px;
  height: 400px;
  background-color: #ed002f;
  float: left;
}
.center {
  width: 200px;
  height: 400px;
  background-color: #f63e62;
  float: left;
}
.right {
  margin-left: 300px;
  height: 400px;
  background-color: #f66f89;
}



2)使用float + overflow实现

HTML代码:

<div class="tri-col-2">
   <div class="left">左列定宽</div>
   <div class="center">中间定宽</div>
   <div class="right">右列自适应</div>
</div>

CSS代码:

.tri-col-2 {
  min-width: 300px;
}
.left {
  width: 100px;
  height: 400px;
  background-color: #ff7400;
  float: left;
}
.center {
  width: 200px;
  height: 400px;
  background-color: #ff9640;
  float: left;
}
.right {
  height: 400px;
  background-color: #ffb273;
  overflow: hidden; /* 触发BFC */
}



3)使用table实现

HTML代码:

<div class="tri-col-3">
  <div class="left">左列定宽</div>
  <div class="center">中间定宽</div>
  <div class="right">右列自适应</div>
</div>

CSS代码:

.tri-col-3 {
  width: 100%;
  height: 400px;
  display: table;
}
.left {
  width: 100px;
  background-color: #ffc900;
  display: table-cell;
}
.center {
  width: 200px;
  background-color: #ffd640;
  display: table-cell;
}
.right {
  background-color: #ffe173;
  display: table-cell;
}


4)使用flex实现

HTML代码:

<div class="tri-col-4">
   <div class="left">左列定宽</div>
   <div class="center">中间定宽</div>
   <div class="right">右列自适应</div>
</div>

CSS代码:

.tri-col-4 {
  height: 400px;
  display: flex;
}
.left {
  width: 100px;
  background-color: #00cc00;
}
.center {
  width: 200px;
  background-color: #39e639;
}
.right {
  background-color: #67e667;
  flex: 1; /* 均分父项剩余部分达到自适应 */
}


2.2 两侧定宽,中间自适应


1)使用flex实现

HTML代码:

<div class="tri-col-lr-1">
   <div class="left">左列定宽</div>
   <div class="center">中间自适应</div>
   <div class="right">右列定宽</div>
</div>

CSS代码:

.tri-col-lr-1 {
  height: 400px;
  display: flex;
}
.left{
  width: 100px;
  background-color: #bc008d;
}
.center {
  flex: 1; /*均分父项剩余的部分*/
  background-color: #dd37b4;
}
.right {
  width: 200px;
  background-color: #dd64bf;
}



2)使用position实现

HTML代码:

<div class="tri-col-lr-2">
   <div class="left">左列定宽</div>
   <div class="center">中间自适应</div>
   <div class="right">右列定宽</div>
</div>

CSS代码:

.tri-col-lr-2 {
  position: relative;
}
.left {
  width: 100px;
  height: 400px;
  position: absolute;
  top: 0;
  left: 0;
  background-color: #00af64;
}
.center {
  margin-left: 100px;
  margin-right: 200px;
  height: 400px;
  background-color: #37dc74;
}
.right {
  width: 200px;
  height: 400px;
  position: absolute;
  top: 0;
  right: 0;
  background-color: #63dc90;
}


三、多列等宽布局



1)利用table实现

HTML代码:

<div class="multi-col-1">
   <div class="col">1</div>
   <div class="col">2</div>
   <div class="col">3</div>
   <div class="col">4</div>
   <div class="col">5</div>
</div>

CSS代码:

.multi-col-1 {
  width: 100%;
  height: 400px;
  display: table;
}
.col {
  display: table-cell; /* 无需关注列数,单元格自动平分 */
}
.col:nth-child(odd) {
  background: pink;
}
.col:nth-child(even) {
  background: lightgreen;
}



2)利用flex实现

HTML代码:

<div class="multi-col-2">
   <div class="col">1</div>
   <div class="col">2</div>
   <div class="col">3</div>
   <div class="col">4</div>
   <div class="col">5</div>
</div>

CSS代码:

.multi-col-2 {
  height: 400px;
  display: flex;
}
.col {
  flex: 1; /* 无需关注列数,自动平分 */
}
.col:nth-child(odd) {
  background: lightcoral;
}
.col:nth-child(even) {
  background: yellow;
}


四、九宫格布局



1)使用table实现

HTML代码:

<div class="squ-1">
  <div class="row">
     <div class="item">1</div>
     <div class="item">2</div>
     <div class="item">3</div>
  </div>
  <div class="row">
     <div class="item">4</div>
     <div class="item">5</div>
     <div class="item">6</div>
  </div>
  <div class="row">
     <div class="item">7</div>
     <div class="item">8</div>
     <div class="item">9</div>
  </div>
</div>

CSS代码:

.squ-1 {
  width: 100%;
  height: 400px;
  border: 1px solid black;
  display: table;
}
.row {
  display: table-row;
}
.item {
  display: table-cell;
  border: 1px solid red;
}



2)使用flex实现

HTML代码:

<div class="squ-1">
  <div class="row">
     <div class="item">1</div>
     <div class="item">2</div>
     <div class="item">3</div>
  </div>
  <div class="row">
     <div class="item">4</div>
     <div class="item">5</div>
     <div class="item">6</div>
  </div>
  <div class="row">
     <div class="item">7</div>
     <div class="item">8</div>
     <div class="item">9</div>
  </div>
</div>

CSS代码:

.squ-2 {
  width: 100%;
  height: 400px;
  border: 1px solid black;
  display: flex;
  flex-direction: column;
}
.row {
  display: flex;
  flex: 1;
}
.item {
  flex: 1;
  border: 1px solid skyblue;
}

SJJ0330
69 声望1 粉丝

Hello, my dream!