# CSS 常见布局实践(一)
这是一份我总结的 CSS 布局技巧,工作中处理页面布局会用到。
# 水平垂直居中
让蓝色的方块在水平和垂直方向居中:
<div class="center-wrap">
<div class="logo"></div>
</div>
1
2
3
2
3
.center-wrap {
position: relative;
background-color: #1f2022;
height: 200px;
}
1
2
3
4
5
2
3
4
5
蓝色的方框水平与垂直方向上都垂直居中。
方式一
方式二
方式三
# 方式一、绝对定位(absolute),蓝色方块宽高已知:
.logo {
position: absolute;
width: 160px;
height: 100px;
top: 50%;
left: 50%;
margin-top: -50px;
margin-left: -80px;
background-color #5b83fd;
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 方式二、绝对定位(absolute),蓝色方块宽高已知/未知均可:
.logo {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background-color: #5b83fd;
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 方式三、flexbox(蓝色方块宽高无所谓,注意IE浏览器):
.center-wrap {
display: flex;
justify-content: center;
align-items: center;
}
1
2
3
4
5
2
3
4
5
从上面的可以衍生出水平居中的方案。
# 水平居中
让蓝色的方块在水平方向居中:
<div class="center-wrap">
<div class="logo"></div>
</div>
1
2
3
2
3
方式一
方式二
方式三
方式四
# 方式一、display: block + margin: 0 auto
适用于 display 为 block 的元素。如果元素脱离文档流,该方式将失效。
.logo {
width: 160px;
height: 100px;
margin: 0 auto;
background-color: #5b83fd;
}
1
2
3
4
5
6
2
3
4
5
6
# 方式二、flexbox 布局,设置容器属性就行(注意IE浏览器)
.center-wrap {
display: flex;
justify-content: center;
background-color: #282c34;
height: 140px;
}
1
2
3
4
5
6
2
3
4
5
6
# 方式三、使用 transform,对宽高无要求
对于脱离文档流的元素可通过下面这种方式实现。
.logo {
position: absolute;
padding: 10px;
left: 50%;
transform: translate(-50%, 0);
background-color: #5b83fd;
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 方式四、inline-block + text-align
display 需要设置为 inline-block,在父元素中设置 text-algin 让子元素进行对齐。
.content-wrap {
position: relative;
background-color: #282c34;
height: 140px;
text-align: center;
}
.logo {
display: inline-block;
background-color: #5b83fd;
padding: 10px;
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 两列(左边宽度固定、右边自适应)
这种效果在实际开发中经常用到,一定要牢固掌握。
<div class="content-wrap">
<div class="left"></div>
<div class="right"></div>
</div>
1
2
3
4
2
3
4
方式一
方式二
方式三
# 方式一:左浮动定宽、右 margin-left
左边元素设置了宽度和 float-left,右边元素设置 margin-left 恰好是左边元素的宽度。
.content-wrap {
background-color: #282c34;
height: 100px;
}
.left, .right {
height: 100%;
}
.left {
float: left;
width: 140px;
background-color: #5b83fd;
}
.right {
margin-left: 140px;
background-color: #F7B500;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 方式二:左浮动定宽、右 overflow
.content-wrap {
background-color: #282c34;
height: 100px;
}
.left, .right {
height: 100%;
}
.left {
float: left;
width: 140px;
background-color: #5b83fd;
}
.right {
overflow: hidden;
background-color: #FA6400;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 方式三:flexbox
.content-wrap {
display: flex;
height: 100px;
background-color: #282c34;
}
.left {
height: 100%;
width: 140px;
background-color: #5b83fd;
}
.right {
height: 100%;
flex: 1;
background-color: #6DD400;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 三列布局
<div class="content-wrap">
<div class="left">Left</div>
<div class="mid">Mid</div>
<div class="right">Right</div>
</div>
1
2
3
4
5
2
3
4
5
Left
Mid
Right
方式一
方式二
# 方式一:左右两列宽度固定,右边自适应
这种可以借助于两列布局的思想,使用 float、overflow 和 flexbox 的方式均可实现。
- overflow
.left {
float: left;
width: 140px;
background-color: #5b83fd;
}
.mid {
float: left;
width: 100px;
background-color: #FA6400;
}
.right {
overflow: hidden;
background-color: #F7B500;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- float
.left {
float: left;
width: 140px;
background-color: #5b83fd;
}
.mid {
float: left;
width: 100px;
background-color: #FA6400;
}
.right {
margin-left: 240px;
background-color: #F7B500;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 方式二、两边固定,中间自适应
注意 mid 是在最上面。
<div class="content-wrap">
<div class="mid-wrap">
<div class="mid2">Mid</div>
</div>
<div class="left2">Left</div>
<div class="right2">Right</div>
</div>
1
2
3
4
5
6
7
2
3
4
5
6
7
.left, .right, .mid-wrap {
height: 80%;
float: left;
}
.left {
width: 140px;
background-color: #FA6400;
margin-left: -100%;
}
.mid-wrap {
height: 100%;
width: 100%;
background-color: #5b83fd;
}
.mid {
background-color: #6DD400;
margin-left: 140px;
margin-right: 80px;
height: 80%;
}
.right {
width: 80px;
background-color: #F7B500;
margin-left: -80px;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 导航栏
导航栏一直「悬停」在最顶端。但凡是要悬停可视区域某一位置都可以使用 fixed 来实现。
.nav-bar {
position: fixed;
background-color: #333;
left: 0;
top: 0;
right: 0;
height: 64px;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8