前言: 容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。
- 被设置为dlex的容器,其里面的流元素也可以设置宽高
- 被设置为dlex的容器,其里面的元素也成为项目
1、父容器的属性
以下6个属性设置在容器上。
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
1.1、设置主轴方向(默认为x轴)
flex-dicrection 4个值
- row(默认值):主轴为水平方向,起点在左端。
- row-reverse:主轴为水平方向,起点在右端。
- column:主轴为垂直方向,起点在上沿。
- column-reverse:主轴为垂直方向,起点在下沿。
row
row-reverse
column
column-reverse
1.2、设置是否换行显示
flex-wrap 3个值
- nowrap(默认值):不换行
- wrap:换行,第一行在上方。
- wrap-reverse:换行,第一行在下方。
nowrap
全部显示在一行内,如果宽度超出,则平均减少前面元素的宽度,把新元素挤进去
wrap
如果内容挤不下就自动换行
wrap-reverse
1.3、主轴方向&是否换行简写
flex-flow 这里随便列举一个
column wrap
1.4、主轴上的对齐方式与分布方式
justify-content 5个值
- flex-start(默认值):左对齐
- flex-end:右对齐
- center: 居中
- space-between:两端对齐,项目之间的间隔都相等。
- space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。
flex-start
flex-end
center
space-between
space-around
1.5、副轴上的对齐方式
align-items 5个值
- flex-start:交叉轴的起点对齐。
- flex-end:交叉轴的终点对齐。
- center:交叉轴的中点对齐。
- baseline: 项目的第一行文字的基线对齐。
- stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。
flex-start
flex-end
center
baseline
stretch
必须项目未设置高度或为aotu才有用
1.6、副轴上的分布方式(包含对齐方式)
align-content 6个值 四个内容和上面属性一致就不展示了
- flex-start:与交叉轴的起点对齐。
- flex-end:与交叉轴的终点对齐。
- center:与交叉轴的中点对齐。
- space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
- space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
- stretch(默认值):轴线占满整个交叉轴。
space-between(多行内容才有效果)
space-around(多行内容才有效果)
1.7、设置项目间距
row-gap
:行与行之间的间距column-gap
:列与列之间间距gap
:上面两个写法的简写,第一个值为行间距
,第二个值为列间距
注意:
- 如果设置了
aline-items/justify-content
的值,那么当行间距或列间距小于他们这个属性里面的默认间距,则间距值无效。大于则取值大的- 比如:编写了
justify-content:space-bewtten
,那么元素中间便会自动生成间距。如果下面再编写column-gap
的值,那么值比上面自动生成的间距小的话,不生效
/* 行 列 间距 */
/* row-gap: 10px;
column-gap: 20px; */
/* 上面简写 */
gap: 20px 20px;
2、子容器(项目)的属性
2.1、定义项目的排列顺序
order 值为Integer类型 数值越小,排列越靠前,默认为0。
/* 选中第二个span元素 */
span:nth-child(2){
order: -1;
}
2.2、定义项目的放大比例
flex-grow 默认为0,即如果存在剩余空间,也不放大
如果所有项目的flex-grow属性都为1,则它们将等分剩余空间(如果有的话)。如果一个项目的flex-grow属性为2,其他项目都为1,则前者占据的剩余空间将比其他项多一倍。
所有项目都为1份
第二个项目为2份
2.3、定义了项目的缩小比例
flex-shrink 默认为1,即如果空间不足,该项目将缩小
如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
负值对该属性无效。
第二个span元素不缩小
2.4、定义了在分配多余空间之前,项目占据的主轴空间
flex-basis 默认为auto,浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。它可以设为跟width或height属性一样的值(比如350px),则项目将占据固定空间。
-
首先需要把副属性设为
justify-content: space-between;
,span元素设置为width: 50px;
-
设置第二个项目占据150px
2.5、上面三个简写
flex 是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
1 1 auto
0 0 auto
2.6、允许单个项目有与其他项目不一样的对齐方式
align-self
可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
该属性可能取6个值,除了auto,其他都与align-items属性完全一致。
单独为第二个span设置为flex-end
3、flex/margin
- 尽管
flex
布局,有很多控制主轴justify-content
方向的属性供我们使用- 但是没有单独控制项目在主轴方向(控制副轴可以使用
align-self
属性)- 这时候我们搭配margin属性使用即可
如下案例,有四个盒子(父元素为
flex
布局),justify-content: space-between;
两边对其。需求:第三个盒子也靠边对其,第二个盒子在剩余空间的中间
3.1代码
<template>
<div class="wrapper">
<div class="item">item-1</div>
<div class="item">item-2</div>
<div class="item">item-3</div>
<div class="item">item-4</div>
</div>
</template>
<style lang="scss" scoped>
@use "sass:math";
.wrapper {
width: 80vw;
height: 20vh;
display: flex;
border: 1px solid red;
justify-content: space-between;
.item{
width: 50px;
@for $i from 1 through 4{
&:nth-child(#{$i}){
background-color: rgb(math.random(255), math.random(255), math.random(255));
}
}
/* 需要把第二个盒子单独再设置为剩余宽度的中间 */
&:nth-child(2){
margin-left: auto;
}
/* 只写这句话会导致第二个盒子贴向左边,第三个盒子贴向右边 */
&:nth-child(3){
margin-left: auto;
}
}
}
</style>