一、基本使用
1、设置伸缩容器
1.1、设置元素为伸缩容器
.wrap {
display: flex;
}
1.2、设置内联级伸缩容器
.wrap {
display: inline-flex
}
2、主轴方向和换行
2.1、flex-direction
-
概念
flex-direction
属性决定主轴的方向(即项目的排列方向)。 -
语法
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
-
参数说明
row
(默认值):主轴为水平方向,起点在左端。row-reverse
:主轴为水平方向,起点在右端。column
:主轴为垂直方向,起点在上沿。column-reverse
:主轴为垂直方向,起点在下沿。
2.2、flex-wrap
-
概念
情况下,项目都排在一条线(又称"轴线")上。
flex-wrap
属性定义,如果一条轴线排不下,如何换行。 -
语法
.box{ flex-wrap: nowrap | wrap | wrap-reverse; }
-
参数说明
- nowrap (默认值):伸缩容器为单行。该情况下伸缩项目可能会溢出容器
- wrap:伸缩容器为多行。该情况下伸缩项目溢出的部分会被放置到新行,伸缩项目会发生断行
- wrap-reverse:反转 wrap 排列。
2.3、flex-flow
-
概念
flex-flow
属性是flex-direction
属性和flex-wrap
属性的简写形式,默认值为row nowrap
。 -
语法
.box { flex-flow: <flex-direction> || <flex-wrap>; }
3、主侧轴对齐
3.1、justify-content
主轴对齐
-
概念
justify-content
属性定义了伸缩项目在主轴上的对齐方式。 -
语法
.box { justify-content: flex-start | flex-end | center | space-between | space-around | space-evenly; }
-
参数说明
flex-start
(默认值):左对齐flex-end
:右对齐center
: 居中space-between
:两端对齐,项目之间的间隔都相等。space-around
:每个伸缩项目两侧的间隔相等。所以,伸缩项目之间的间隔比伸缩项目与边框的间隔大一倍。space-evenly
: 伸缩项目之间的间隔以及缩项目与伸缩容器边框的间隔相等。 (新增属性值,兼容性稍差)。
3.2、align-items
侧轴对齐
-
概念
align-items
属性定义伸缩项目在侧轴上如何对齐。 -
语法
.box { align-items: flex-start | flex-end | center | baseline | stretch; }
-
参数说明
flex-start
:侧轴的起点对齐。flex-end
:侧轴的终点对齐。center
:侧轴的中点对齐。baseline
: 伸缩项目的第一行文字的基线对齐。stretch
(默认值):如果伸缩项目未设置高度或设为auto,将占满整个容器的高度。
3.3、align-content
-
概念
align-content
属性定义了侧轴方向上有多根轴线的对齐方式。如果侧轴方向上只有一根轴线,该属性不起作用。 -
语法
.box { align-content: flex-start | flex-end | center | space-between | space-around | stretch; }
-
属性说明
flex-start
:与侧轴的起点对齐。flex-end
:与侧轴的终点对齐。center
:与侧轴的中点对齐。space-between
:与侧轴两端对齐,轴线之间的间隔平均分布。space-around
:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。stretch
(默认值):轴线占满整个侧轴。space-evenly
: 轴线的间隔以及轴线与伸缩容器边框的间隔相等。 (新增属性值,兼容性稍差)。
4、元素水平垂直居中
4.1、方式一
<!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>
html,body {
width: 100%;
height: 100%;
}
body {
margin: 0;
/* 设置为伸缩容器 */
display: flex;
/* 主轴方向居中 */
justify-content: center;
/* 侧轴方向居中 */
align-items: center;
}
.box {
width: 400px;
height: 300px;
background-color: cyan;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
4.2、方式二
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
html,body {
width: 100%;
height: 100%;
}
body {
margin: 0;
/* 设置为伸缩容器 */
display: flex;
}
.box {
margin: auto;
width: 400px;
height: 300px;
background-color: cyan;
}
</style>
</head>
<body>
<div class="box"></div>
</body>
</html>
5、伸缩项目的伸缩性
5.1、flex-basis
-
概念
flex-basis
属性定义了在分配多余空间之前,伸缩项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为
auto
,即伸缩项目的本来大小。用于设置伸缩项目在主轴方向上的长度,如果设置了 flex-basis,会导致伸缩项目的宽或者高失效,按照 flex-basis 的设置。
-
语法
.item { flex-basis: <length> | auto; /* 默认值 auto */ }
5.2、flex-grow
-
概念
flex-grow
属性定义伸缩项目的放大比例,默认为0
,即如果存在剩余空间,也不放大。 -
语法
.item { flex-grow: <number>; /* 默认值 0 */ }
如果所有伸缩项目的
flex-grow
属性都为1,则它们将等分剩余空间(如果有的话)。如果一个伸缩项目的flex-grow
属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
5.3、flex-shrink
-
概念
flex-shrink
属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。 -
语法
.item { flex-shrink: <number>; /* 默认值 1 */ }
如果所有伸缩项目的
flex-shrink
属性都为1,当空间不足时,都将等比例缩小。如果一个伸缩项目的flex-shrink
属性为0,其他项目都为1,则空间不足时,前者不缩小。
5-4、收缩比例计算
/*
计算收缩多少:
分母: 150*1 + 300*2 + 250*3
box01要补: 150*1 / 1500 0.1*200
box02要补: 300*2 / 1500 0.4*200
box03要补: 250*3 / 1500 0.5*200
计算收缩多少:
所有项目宽度乘收缩比相加
各项目 * 收缩比 / 所有项目宽度乘收缩比相加
该比值*超出值
*/
5.4、flex
-
概念
flex
是复合属性,是flex-grow
,flex-shrink
和flex-basis
的简写,默认值为0 1 auto
。 -
语法
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
-
特殊情况
- 如果缩写为
flex: 1
, 则其计算值为1 1 0%
- 如果缩写
flex: auto
, 则其计算值为1 1 auto
- 如果
flex: none
, 则其计算值为0 0 auto
- 如果
flex: 0 auto
或者flex: initial
, 则其计算值为0 1 auto
,即 flex 初始值
- 如果缩写为
6、伸缩项目排序
-
概念
order
属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。 -
语法
.item { order: <integer>; }
7、align-self
伸缩项目独自对齐方式
-
概念
align-self
属性允许单个伸缩项目有与其他伸缩项目不一样的对齐方式,可覆盖align-items
属性。默认值为auto
,表示继承父元素的align-items
属性。 -
语法
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
-
属性值
auto
(默认值): 表示继承父元素的align-items
属性。flex-start
:侧轴的起点对齐。flex-end
:侧轴的终点对齐。center
:侧轴的中点对齐。baseline
: 伸缩项目的第一行文字的基线对齐。stretch
:如果伸缩项目未设置高度或设为auto,将占满整个容器的高度。
8、总结
8.1、设置给伸缩容器的属性
- display 设置伸缩容器;值: flex、inline-flex
- flex-direction设置主轴方向;值:row、row-reverse、column、column-reverse
- flex-wrap设置换行方式;值: nowrap、wrap、wrap-reverse
- flex-flow同时设置主轴方向和换行方式,复合 flex-direction 和 flex-wrap
- justify-content主轴方向对齐方式;值 flex-start、flex-end、center、space-between、space-around、space-evenly
- align-items设置侧轴对齐方式; 值: stretch、flex-start、flex-end、center、baseline
- align-content 设置侧轴对齐方式(适合多条主轴); 值:stretch、flex-start、flex-end、center、space-between、space-around、space-evenly
8.2、设置给伸缩项目的属性
- flex-basis 设置伸缩项目在主轴方向的基准长度;值可以设置长度,默认值 auto。
- flex-grow设置扩展比率;值是数字,默认值 0。
- flex-shrink设置收缩比率,值是数字,默认值 1。
- flex 复合属性,同时设置扩展比率、收缩比率、基准值。
- order设置伸缩项目的排列顺序;值是数字,值越小越靠前。
- align-self单独设置伸缩项目在侧轴上对齐方式; 值: auto、stretch、flex-start、flex-end、center、baseline
8.3 收缩极限(扩展)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
.wrapper {
width: 100%;
display: flex;
}
.box {
padding: 20px;
text-align: center;
border: 1px solid red;
flex: 1;
}
.content {
width: 100px;
height: 100px;
background-color: green;
}
</style>
</head>
<body>
<div class="wrapper">
<div class="box">嗨嗨</div>
<div class="box">
<div class="content"></div>
</div>
<div class="box">嗨嗨</div>
<div class="box">嗨嗨</div>
<div class="box">嗨嗨</div>
<div class="box">嗨嗨</div>
<div class="box">嗨嗨</div>
<div class="box">嗨嗨</div>
<div class="box">嗨嗨</div>
<div class="box">嗨嗨</div>
</div>
</body>
</html>