CSS(八)布局

本文最后更新于:8 个月前

两栏布局、经典三栏布局、水平垂直居中

CSS(八)布局

一、两栏布局

两栏布局的实现思路基本都是:一侧宽度固定(一般是左侧)、另一侧宽度自适应(一般是右侧)。

下面是一些常见的实现方式:

  1. 利用浮动,左侧宽度固定,右侧元素设置margin-left等于左侧宽度。
  2. 利用浮动,左侧宽度固定,右侧元素触发为BFC
  3. 利用flex布局,左边宽度固定,右边元素设置flex:1
  4. 利用绝对定位,左边元素设置position:absolute,宽度固定,右边元素margin-left为左侧元素宽度
  5. 利用绝对定位,左侧宽度固定,右侧元素absolute定位,left值设置为左侧元素宽度

二、经典三栏布局

「圣杯布局」和「双飞翼布局」,这两种布局相同的目的都是:让中间部分的内容优先加载。

在实现思路上的共同点是:两侧宽度固定,中间宽度自适应。

实现技术总结:

  • 三栏都使用 float 布局。
  • 两侧使用 margin 负值,以便和中间内容横向重叠。
  • 防止中间内容被两侧覆盖,圣杯布局用 padding ,双飞翼布局用 margin

2.1、圣杯布局

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<!DOCTYPE html>
<html lang="en">
<head>
<title>圣杯布局示例</title>
<style>
.bfc{
overflow: hidden; /* 触发为BFC容器,避免”高度塌陷“问题 */
padding-left: 200px; /* 为左侧栏预留的空间 */
padding-right: 200px; /* 为右侧栏预留的空间 */
border: 1px solid black;/* 方便看清bfc盒子的范围 */
}
.bfc div{
float: left; /* 用浮动的方式,脱离正常文档流,使三栏能够在一行,不能用inline-block(试过了) */
height: 200px; /* 给div盒子撑起一个高度,否则div里面没有内容高度为0 */
}
.left{
width: 200px;
margin-left: -100%; /* 这里的100%指的是bfc容器的content宽度,使left向上移动一行 */
background-color: red;
position: relative; /* 此时left的起点与bfc的content起点处在相同的位置 */
left: -200px; /* 借助相对定位,向左偏移,让left进入padding-left的空间 */
}
.center{
width: 100%; /* 宽度自适应 */
background-color: green;
}
.right{
width: 200px;
margin-right: -200px; /* margin的终点也就是bfc的margin盒子的终点,margin-right:-200px刚好让right塞进padding-right这个空间(而原本right是在下一行的) */
background-color: blue;
}
</style>
</head>
<body>
<div class="bfc">
<div class="center"></div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>

2.2、双飞翼布局

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!DOCTYPE html>
<html lang="en">
<head>
<title>CSS示例</title>
<style>
.container{
border: 1px solid black;
overflow: auto;
margin-bottom: 50px;
}
.float{
float: left;
}
.center{
width: 100%; /* 让center占据整个容器宽度,相当于body宽度 */
}
.main{
height: 200px; /* div盒子没有内容,高度自动为0,所以需要指定一个高度 */
margin-left: 200px;
margin-right: 200px;
background-color: green;
}
.left{
width: 200px;
height: 200px;
margin-left: -100%;/* 这里100%指的是container容器的content宽度,margin的边界是container的border盒子 */
background-color: red;
}
.right{
width: 200px;
height: 200px;
margin-left: -200px; /* 这里的100%指的是container的content宽度,margin的边界是container的border盒子 */
background-color: blue;
}
</style>
</head>
<body>
<div class="container">
<div class="center float">
<div class="main"></div>
</div>
<div class="left float"></div>
<div class="right float"></div>
</div>
</body>
</html>

2.3、flex实现经典三栏

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS示例:flex实现经典三栏布局</title>
<style>
.flex{
display: flex;
}
.container div{
height: 200px;
color: white;
font-weight: bolder;
}
.left{
width: 200px;
background-color: red;
order: 1;
}
.center{
order: 2;
flex: 1;
background-color: green;
}
.right{
width: 200px;
background-color: blue;
order: 3;
}
</style>
</head>
<body>
<div class="container flex">
<div class="center">实现方式是:在flex容器中,使用order属性决定每个flex项目的排列顺序,
虽然html中center写在前,但center的order比left的后</div>
<div class="left"></div>
<div class="right"></div>
</div>
</body>
</html>

三、水平垂直居中布局

3.1、flex居中

该方法最为灵活,可以不指定容器的宽高

1
2
3
4
5
.container{
display:flex;
justify-content:center;
align-items:center;
}

3.2、绝对定位+transform

利用绝对定位,使用lefttop使元素左上角居中,然后使用translate微调位置,该方法可以不定宽高

1
2
3
4
5
6
7
8
9
.container{
position:relative;
}
.center{
position:absolute;
left:50%;
top:50%;
transform:translate(-50%,-50%); /* translate()里的50%,指的是相对于元素本身的大小 */
}

3.3、绝对定位+margin

同上,但是不使用translate微调位置,而是使用margin-leftmargin-top来微调位置,值分别为元素宽高的一半(前提是:需要指定元素宽高

1
2
3
4
5
6
7
8
9
10
11
12
.container{
position:relative;
}
.center{
position:absolute;
left:50%;
top:50%;
width:200px;
height:200px;
margin-left: -100px;
maring-right:-100px;
}

3.4、绝对定位+margin: auto

利用绝对定位,子元素所有方向为0,将margin设置为auto(如果没有margin属性,默认在左上角),子元素必须有宽高

1
2
3
4
5
6
7
8
9
10
11
12
13
.container{
position:relative;
}
.center{
position:absolute;
left:0;
top:0;
right:0;
bottom:0;
margin:auto;
height:100px;
width:100px;
}

CSS(八)布局
http://timegogo.top/2023/02/20/CSS/CSS(八)布局/
作者
丘智聪
发布于
2023年2月20日
更新于
2023年7月16日
许可协议