Bootstrap

【CSS 布局】-多列布局

一、两列布局

两列布局:一列定宽(也有可能由子元素决定宽度),一列自适应的布局。

创建一个父盒子,和子盒子


<div class="container clearfix">
  <div class="left ">定宽</div>
  <div class="right ">自适应</div>
</div>

基本CSS样式如下

body {
  margin: 0;
}

.container {
  height: 50px;
  background-color: #fff;
}

.left {
  height: 50px;
  width: 200px;
  background-color: antiquewhite;
  font-size: 12px;
  line-height: 50px;
  text-align: center;
}

.right {
  height: 50px;
  background-color: azure;
  font-size: 12px;
  line-height: 50px;
}

.mt5 {
  margin-top: 5px;
}

/* 清除浮动 */
.clearfix:after {
  content: '';
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

1.定宽浮动: float +calc()函数

(1)左边列开启浮动

(2)右边列开启浮动

(3)右边列宽度为父级 100%减去左列的宽度


<div class="container clearfix">
  <div class="left left-float-left">定宽 float-left</div>
  <div class="right right-float-left">自适应 float-left + calc(100% - 200px)</div>
</div>

基本CSS样式如下

.left-float-left {
  float: left;
}

.right-float-left {
  /* 右边列开启浮动 */
  float: left;
  /* 宽度减去左列的宽度 */
  width: calc(100% - 200px);
}

2.定宽浮动:float + margin-left

(1)左边列开启浮动

(2)通过外边距的方式使该容器的左边有左边列容器的宽度的外边距

<!-- 2.定宽块级元素水平居中: 设置宽度,设置margin:0 auto; -->
<div class="container clearfix mt5">
  <div class="left left-float-left">定宽 float-left</div>
  <div class="right  right-margin-left">自适应 margin-left</div>
</div>

基本样式如下

.left-float-left {
  float: left;
}

/* 通过外边距的方式使该容器的左边有200px */
.right-margin-left {
  margin-left: 200px;
}

3.定宽定位 : absolute + margin-left

(1)开启定位脱离文档流

(2)通过外边距的方式使该容器的左边有左边列容器的宽度的外边距


<div class="container clearfix mt5">
  <div class="left left-position-absolute">定宽:position:absolute</div>
  <div class="right right-margin-left">自适应 margin-left</div>
</div>

css基本样式如下

.left-position-absolute {
  position: absolute;
}

.right-margin-left {
  margin-left: 200px;
}

4.浮动 :float + overflow

(1)左侧元素开始浮动

(2)右侧自适应元素设置overflow会创建一个BFC完成自适应


<div class="container clearfix mt5">
  <div class="left left-float-left">float-left</div>
  <div class="right right-overflow-hidden">overflow-hidden</div>
</div>

基本样式如下

.left-float-left {
  float: left;
}

.right-overflow-hidden {
  overflow: hidden;
}

5.flex布局 : flex-1

Flex布局通过 flex 属性实现:
flex: 1; (表示 flex-grow: 1; 即该项占所有剩余空间)


<div class="container clearfix mt5 container-flex">
  <div class="left ">left</div>
  <div class="right flex-1">flex-1</div>
</div>

基本样式如下

.container-flex {
  display: flex;
}

.flex-1 {
  flex: 1;
}

6.Grid布局 : grid-template-columns属性

Grid 布局通过template属性实现:
grid-template-columns: auto 1fr;(将其划分为两行,其中一列有本身宽度决定, 一列占剩余宽度)


<div class="container clearfix mt5  container-grid-1fr">
  <div class="left ">定宽</div>
  <div class="right ">grid</div>
</div>

基本样式如下

.container-grid-1fr {
  display: grid;
  grid-template-columns: auto 1fr;

}

二、三列布局

三列布局主要分为两种:

1.第一种:
前两列定宽,最后一列自适应,这一种本质上与两列布局没有什么区别,可以参照两列布局实现。

2.第二种 前后两列定宽,中间自适应。

创建一个父盒子,和子盒子

<!-- 解决高度塌陷 -->
<div class="container clearfix mt5">
  <div class="left ">左边</div>
  <div class="content">内容</div>
  <div class="right">右边</div>
</div>

公共的 CSS 代码如下

body {
  margin: 0;
}

.container {
  height: 50px;
  background-color: antiquewhite;
}

.left {
  height: 50px;
  width: 100px;
  background-color: azure;
}

.content {
  height: 50px;
  background-color: floralwhite;
}

.right {
  height: 50px;
  width: 100px;
  background-color: #ccc;
}

.left,
.content,
.right {
  font-size: 12px;
  line-height: 50px;
  text-align: center;
}

/* 清除浮动 */
.clearfix:after {
  content: '';
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

.mt5 {
  margin-top: 5px;
}

1.左右浮动:float + overflow: hidden

(1)左列容器开启左浮动

(2)右列容器开启右浮动

(3)自适应元素设置overflow会创建一个BFC完成自适应

<!-- 解决高度塌陷 -->
<div class="container clearfix mt5">
  <div class="left left-float-left">左边</div>
  <div class="right right-float-right">右边</div>
  <div class="content content-overflow-hidden">内容</div>
</div>

基本样式如下

.left-float-left {
  float: left;
}

/* 自适应元素设置 overflow 会创建一个BFC 完成自适应 */
.content-overflow-hidden {
  overflow: hidden;
}

.right-float-right {
  float: right;
}

2.左右浮动:float + calc()函数

(1)左列容器开启左浮动

(2)右列容器开启右浮动

(3)使中间自适应的宽度为父级容器减去两个定宽的列

<!-- 解决高度塌陷 -->
<div class="container clearfix mt5">
  <div class="left left-float-left">左边</div>
  <div class="right right-float-right">右边</div>
  <div class="content content-width-calc">内容</div>
</div>

css样式如下

.left-float-left {
  float: left;
}

.right-float-right {
  float: right;
}

/*  使中间自适应的宽度为父级容器减去两个定宽的列 */
.content-width-calc {
  width: calc(100% - 100px);
}

3.定位: 子绝父相 + calc()函数 + margin

(1)左右两列脱离文档流,并通过偏移的方式到达自己的区域

(2)使中间自适应的宽度为父级容器减去两个定宽的列

(3)通过外边距将容器往内缩小

<!-- 解决高度塌陷 -->
<div class="container clearfix mt5 container-position-relative">
  <div class="left left-position-absolute">左边</div>
  <div class="content content-width-calc-margin">内容</div>
  <div class="right right-position-absolute">右边</div>
</div>


<!-- 解决高度塌陷 -->
<div class="container clearfix mt5 container-position-relative">
  <div class="left left-position-absolute">左边</div>
  <div class="right right-position-absolute">右边</div>
  <div class="content content-width-calc-margin">内容</div>
</div>

css样式如下

.container-position-relative {
  position: relative;
}

.left-position-absolute {
  position: absolute;
  left: 0;
  top: 0;
}

.right-position-absolute {
  position: absolute;
  right: 0;
  top: 0;
}

.content-width-calc-margin {
  width: calc(100% - 200px);
  margin-right: 100px;
  margin-left: 100px;
}

4.flex布局 : flex-1

(1)开启 Flex 布局。
(2)设置 flex 属性,flex : 1。

<!-- 解决高度塌陷 -->
<div class="container clearfix mt5 container-flex">
  <div class="left">左边</div>
  <div class="content flex-1">内容 flex-1</div>
  <div class="right ">右边</div>
</div>

css样式如下

.container-flex {
  display: flex;
}

.flex-1 {
  flex: 1;
}

5.grid布局 + grid-template-columns

(1)开启 grid布局。
(2)设置 grid 属性, grid-template-columns: auto 1fr auto;

<!-- 解决高度塌陷 -->
<div class="container clearfix mt5 container-grid-1fr">
  <div class="left">左边</div>
  <div class="content ">内容</div>
  <div class="right ">右边</div>
</div>

css样式如下


.container-grid-1fr {
  display: grid;
  grid-template-columns: auto 1fr auto;
}

三、等分布局

等分布局就是将一个容器平均分成几等份,这里以 4 等分为例。

创建一个父盒子,和子盒子

<div class="container clearfix">
  <div class="item item1 "></div>
  <div class="item item2 "></div>
  <div class="item item3 "></div>
  <div class="item item4 "></div>
</div>

基本CSS样式如下

body {
  margin: 0;
}
.container {
  height: 50px;
  background-color: #eee;
}
.item {
  height: 100%;
}
.item1 {
  background-color: skyblue;
}
.item2 {
  background-color: deepskyblue;
}
.item3 {
  background-color: lightskyblue;
}
.item4 {
  background-color: royalblue;
}
/* 清除浮动 */
.clearfix::after {
  content: '';
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

1.浮动+百分比

开启浮动,使每个元素占25%的宽度。

<!-- 1.浮动+百分比 -->
<div class="container clearfix">
  <div class="item item1 width-25 float-left"></div>
  <div class="item item2 width-25 float-left"></div>
  <div class="item item3 width-25 float-left"></div>
  <div class="item item4 width-25 float-left"></div>
</div>

基本CSS样式如下

.width-25 {
  width: 25%;
}

.float-left {
  float: left;
}

2.行内块级 + 百分比

<!-- 行内块级元素 + 百分比 -->
<div class="container clearfix">
  <div class="item item4 width-24-5 display-inline-block"></div>
  <div class="item item3 width-24-5 display-inline-block"></div>
  <div class="item item2 width-24-5 display-inline-block"></div>
  <div class="item item1 width-24-5 display-inline-block"></div>
</div>

基本CSS样式如下

.width-24-5 {
  width: 24.5%;
}

.display-inline-block {
  display: inline-block;
}

3.flex布局

1.设置父元素相对定位 position:relative; 子元素绝对定位 position:absolute; 2.设置偏移量: left: 50%; top: 50%; 3.外边距-宽度/高度的一半将元素移动:
margin-left:- 宽度的一半 ; margin-top: 高度的一半 ;

<!-- flex -->
<div class="container clearfix display-flex">
  <div class="item item4 flex-1"></div>
  <div class="item item3 flex-1"></div>
  <div class="item item2 flex-1"></div>
  <div class="item item1 flex-1"></div>
</div>

基本CSS样式如下

.display-flex {
  display: flex;
}

.flex-1 {
  flex: 1;
}

4.grid布局

开启 grid 布局,使用 repeat 函数生成。

<!-- grid -->
<div class="container clearfix display-grid grid-template-columns-repeat">
  <div class="item item2 "></div>
  <div class="item item1 "></div>
  <div class="item item4 "></div>
  <div class="item item3 "></div>
</div>

基本CSS样式如下

.display-grid {
  display: grid;
}

.grid-template-columns-repeat {
  grid-template-columns: repeat(4, 1fr);
}

;