弹性盒子的特点
弹性盒子由弹性容器(Flex container)和弹性子元素(Flex item)组成。
弹性容器通过设置 display 属性的值为 flex 或 inline-flex将其定义为弹性容器。
弹性容器内包含了一个或多个弹性子元素。
不会脱离文档流,不会破环网格布局,不会存在高度塌陷问题
注意:
弹性容器外及弹性子元素内是正常渲染的。弹性盒子只定义了弹性子元素如何在弹性容器内布局。
弹性子元素通常在弹性盒子内一行显示。默认情况每个容器只有一行。
设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。
主轴对齐
主轴对齐方式 :justify-content
属性值 作用
flex-start 默认值, 起点开始依次排列
flex-end 终点开始依次排列
center 沿主轴居中排列
space-around 弹性盒子沿主轴均匀排列, 空白间距均分在弹性盒子两侧
space-between 弹性盒子沿主轴均匀排列, 空白间距均分在相邻盒子之间
space-evenly 弹性盒子沿主轴均匀排列, 弹性盒子与容器之间间距相等
单行侧轴对齐方式 : align-items
属性值 作用
flex-start 起点开始依次排列
flex-end 终点开始依次排列
center 沿侧轴居中排列
stretch 默认效果, 弹性盒子沿着侧轴线被拉伸至铺满容器
flex-start
多行侧轴对齐方式align-content
属性值 作用
flex-start 默认值, 起点开始依次排列
flex-end 终点开始依次排列
center 沿主轴居中排列
space-around 弹性盒子沿主轴均匀排列, 空白间距均分在弹性盒子两侧
space-between 弹性盒子沿主轴均匀排列, 空白间距均分在相邻盒子之间
设置弹性元素自身在侧轴(纵轴)方向上的对齐方式align-self
<el-select v-model="value1" placeholder="请选择justify-content">
<el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-select v-model="value2" placeholder="请选择align-items">
<el-option v-for="item in options2" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-select v-model="value3" placeholder="请选择align-content">
<el-option v-for="item in options3" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-select v-model="value4" placeholder="请选择 flex-direction">
<el-option v-for="item in options4" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<div class="f f1" :style="{ justifyContent: value1, alignItems: value2, alignContent: value3, flexDirection: value4 }">
<div class="a s"></div>
<div class="b s"></div>
<div class="c s"></div>
<div class="a s"></div>
<div class="b s"></div>
<div class="c s"></div>
</div>
<div class="f">
<div class="a a1 s1"></div>
<div class="b b1 s1"></div>
<div class="c c1 s1">center</div>
<div class="d d1 s1">baseline</div>
<div class="e e1 s1">stretch</div>
</div>
<!-- 两种居中 -->
<div class="f">
<div class="a s2"></div>
</div>
修改主轴方向属性: flex-direction
属性值 作用
row 行, 水平(默认值)
column *列, 垂直
row-reverse 行, 从右向左
column-reverse 列, 从下向上
弹性子元素分配空间
- flex 属性用于指定弹性子元素如何分配空间。
auto: 计算值为 1 1 auto
initial: 计算值为 0 1 auto
none:计算值为 0 0 auto
inherit:从父元素继承
flex数值分配空间
flex为1的推算过程
flex作为属性出现的时候表示占据主轴上剩下的空间,由以下三个属性复合而成
即flex属性 是 flex-grow、flex-shrink、flex-basis三个属性的缩写
相对于其他元素进行扩展的量
属性: flex-grow定义项目的的放大比例
属性值:
0 空间是默认的
1 表示占据主轴上剩下的空间
相对于其他元素进行收缩的量
属性: flex-shrink定义项目的缩小比例
属性值
0 改变主轴的宽高不会被挤压
1 改变主轴的宽高会被挤压
项目的宽度(width作用一样)
属性: flex-basis定义在分配多余空间之前,项目占据的主轴空间(main size),浏览器根据此属性计算主轴是否有多余空间。相当于设置初始值
属性值:0~100%/auto
三个属性推算出flex:1的效果
默认值:0 1 auto
常用值:1 1 0% => 简写成flex:1
<div class="flex-container">
<div class="flex-item item1">flex item 1</div>
<div class="flex-item item2">flex item 2</div>
<div class="flex-item item3">flex item 3</div>
</div>
不设置flex-shrink时:
<div style="display:flex;border:1px solid #000;">
<div style="height:100px;background-color:gray;">1</div>
<div style="height:100px;background-color:red;">2</div>
<div style="height:100px;background-color:gray;">3</div>
</div>
第二个item的 flex-shrink为0时:
<div style="display:flex;border:1px solid #000;">
<div style="height:100px;background-color:gray;width:200px;">1</div>
<div style="height:100px;background-color:red;width:200px;flex-shrink:0;">2</div>
<div style="height:100px;background-color:gray;width:200px;">3</div>
</div>
第一个item的 flex-shrink为1(默认值),第二个item的 flex-shrink为0,第三个item的 flex-shrink为2时:
<div style="display:flex;border:1px solid #000;">
<div style="height:100px;background-color:gray;width:200px;flex-shrink:1;">1</div>
<div style="height:100px;background-color:red;width:200px;flex-shrink:0;">2</div>
<div style="height:100px;background-color:gray;width:200px;flex-shrink:2;">3</div>
</div>
第二个item的 flex-basis为80px,其他为flex-grow:1时:
<div style="display:flex;border:1px solid #000;">
<div style="height:100px;background-color:gray;flex-grow:1;">1</div>
<div style="height:100px;background-color:red;flex-basis: 80px;">2</div>
<div style="height:100px;background-color:gray;flex-grow:1;">3</div>
</div>
</template>
<script>
export default {
data() {
return {
options1: [{
value: 'flex-start',
label: 'flex-start'
}, {
value: 'flex-end',
label: 'flex-end'
}, {
value: 'center',
label: 'center'
}, {
value: 'space-around',
label: 'space-around'
}, {
value: 'space-between',
label: 'space-between'
}, {
value: 'space-evenly',
label: 'space-evenly'
}],
value1: '',
options2: [{
value: 'flex-start',
label: 'flex-start'
}, {
value: 'flex-end',
label: 'flex-end'
}, {
value: 'center',
label: 'center'
}, {
value: 'stretch',
label: 'stretch'
}],
value2: '',
options3: [{
value: 'flex-start',
label: 'flex-start'
}, {
value: 'flex-end',
label: 'flex-end'
}, {
value: 'center',
label: 'center'
}, {
value: 'space-around',
label: 'space-around'
}, {
value: 'space-between',
label: 'space-between'
}],
value3: '',
options4: [{
value: 'row',
label: 'row'
}, {
value: 'column',
label: 'column'
}, {
value: 'row-reverse',
label: 'row-reverse'
}, {
value: 'column-reverse',
label: 'column-reverse'
}],
value4: '',
}
},
}
</script>
<style>
.f {
width: 400px;
height: 400px;
background-color: rgb(212, 176, 129);
margin: 100px auto;
display: flex;
}
.f1 {
flex-wrap: wrap;
}
.s {
width: 100px;
height: 100px;
}
.s1 {
width: 100px;
min-height: 100px;
}
.s2 {
width: 100px;
height: 100px;
margin: auto;
}
.a,
.d {
background-color: #807272;
}
.b,
.e {
background-color: #ccc;
}
.c {
background-color: #bfa;
}
.a1 {
align-self: flex-start;
}
.b1 {
align-self: flex-end;
}
.c1 {
align-self: center;
}
.d1 {
align-self: baseline;
}
.e1 {
align-self: stretch;
}
.flex-container {
display: flex;
width: 400px;
height: 250px;
margin: 0 auto;
background-color: lightgrey;
}
.flex-item {
background-color: cornflowerblue;
margin: 10px;
}
.item1 {
flex: 2;
}
.item2 {
flex: 1;
}
.item3 {
flex: 1;
}
</style>