1. Flex 布局的概念
- flexible box: 弹性盒状布局
- 容器控制内部元素的布局定位
- CSS3引入的新布局模型
- 伸缩元素,自由填充,自适应
2. Flex布局的优势
- 可在不同方向排列元素
- 控制元素排列的方向
- 控制元素的对齐方式
- 控制元素之间的等距
- 控制单个元素放大与缩放比例,占比,对齐方式
3. Flex布局的常用术语
- flex container:flex 容器
- flex item:flex 项目(元素)
- flex direction: 布局方向
初始化代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
margin: 0;
padding: 0;
}
.box {
display: flex;
display: -webkit-flex;
height: 500px;
background-color: wheat;
}
.sub {
background-color: #000;
color: white;
font-size: 32px;
width: 70px;
height: 70px;
line-height: 70px;
text-align: center;
border: 2px solid aquamarine;
box-sizing: border-box;
}
</style>
</head>
<body>
<div class="box">
<div class="sub">1</div>
<div class="sub">2</div>
<div class="sub">3</div>
<div class="sub">4</div>
<div class="sub">5</div>
<div class="sub">6</div>
</div>
</body>
</html>
4. Flex-direction
- row 排列方向:从左到右(默认)
- row-reverse 排列方向:从右到左
- column 排列方向:从上到下
- column-reverse 排列方向:从下到上
5. Flex-wrap
- wrap:换行
- nowarp:不换行
6. justify-content
- flex-start: (默认)左对齐或向上对齐
- flex-end:右对齐或向下对齐
- center:居中对齐
- space-between:两端对齐,元素之间平均等分剩余空白间隙部分
- space-around:元素两边平均等分剩余空白间隙部分,最左或最右和元素之间的距离是1:2
7. align-items(设置元素在纵轴上的对齐方式)
- flex-start:在纵轴上向起点位置(向上 / 向左)对齐
- flex-end:在纵轴上向起点位置(向下 / 向右)对齐
- center:居中对齐
- baseline:保证元素中的文字在同一条基准线(保证每一个文字都在同一条线上)
- stretch ( 默认 ):当元素的高度没有设置,则元素的高度会拉伸至容器高度一致
8. align-content(当轴线超过1条的时候,flex容器可以把更多条轴线视为元素对待,可以进行对齐)高度设定,元素换行时,会将剩下的空白区域进行平分,这时会出现换行元素之间出现空白
(演示时,要给外框的加上 flex-wrap: wrap;
这个属性一起使用, 同时将盒子的宽高均调到 200px)
- flex-start:向左对齐
- flex-end:向右对齐
- center:居中(轴线居中)
- space-between:两端对齐,元素之间的空白等比切分
- space-around:轴线两边的空白等比切分
- stretch:当宽度width没有设置的时候,轴线可以被拉伸
9. order(用于设置flex容器内部的每个元素的排列顺序,默认是0,排列规则,从小到大)
10. Flex-grow(用于设置元素的放大比例,默认为0,如果为0,则不放大)
11. Flex-shrink(用于定义属性的缩放比例,默认为1,设置为0的时候,不进行缩放,会去挤压其他元素)
13. align-self(重写align-items父属性)
- 重写容器中元素在纵轴上的对齐方式
- auto:默认,继承父元素属性
- flex-start:在纵轴上向起点位置(向上 / 向左)对齐
- flex-end:在纵轴上向起点位置(向下 / 向右)对齐
- center:居中对齐
- baseline:保证元素中的文字在同一条基准线(保证每一个文字都在同一条线上)
- stretch:当元素的高度没有设置,则元素的高度会拉伸至容器高度一致
实际案例
1. 水平居中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.father {
width: 200px;
height: 200px;
background-color: antiquewhite;
display: flex;
justify-content: center;
}
.son {
background-color: aqua;
}
</style>
</head>
<body>
<div class="father">
<span class="son">son</span>
</div>
</body>
</html>
2. 垂直居中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.father {
width: 200px;
height: 200px;
background-color: antiquewhite;
display: flex;
align-items: center;
}
.son {
background-color: aqua;
}
</style>
</head>
<body>
<div class="father">
<span class="son">son</span>
</div>
</body>
</html>
3. 水平垂直居中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.father {
width: 200px;
height: 200px;
border: 1px solid red;
position: relative;
display: flex;
justify-content: center;
align-items: center;
}
.son {
width: 100px;
height: 100px;
background: yellow;
}
</style>
</head>
<body>
<div class="father">
<span class="son">son</span>
</div>
</body>
</html>
4. 左列定宽, 右列自适应
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.box {
height: 200px;
display: flex;
}
.box-left {
width: 200px;
background-color: aquamarine;
}
.box-right {
flex-grow: 1;
overflow: hidden;
background-color: blueviolet;
}
</style>
</head>
<body>
<div class="box">
<div class="box-left"></div>
<div class="box-right"></div>
</div>
</body>
</html>
5. 三栏布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.layout.flexbox .left-center-right {
display: flex;
}
.layout.flexbox .left {
width: 300px;
background: red;
}
.layout.flexbox .center {
flex: 1;
background: yellow;
}
.layout.flexbox .right {
width: 300px;
background: blue;
}
</style>
</head>
<body>
<section class="layout flexbox">
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h1>flexbox的解决方案</h1>
<p>1.这是布局的中间部分</p>
<p>2.这是布局的中间部分</p>
</div>
<div class="right"></div>
</article>
</section>
</body>
</html>