弹性盒子模型
一、弹性盒子模型的相关概念
● 伸缩容器(flex container) :包裹伸缩项目的父元素。
● 伸缩项目(flex item) :伸缩容器的每个子元素。
● 轴(axis):每个弹性盒子模型拥有两个轴。
◆ 主轴(main axis) : :伸缩项目沿其一次排列的轴被称为主轴。
◆ 侧轴(cross axis) :垂直于主轴的轴被称为侧轴。
● 方向(direction):伸缩容器的主轴由主轴起点和主轴终点,侧轴由侧轴起点和侧轴终点描述
伸缩项目排列的方向。
● 尺寸(dimension) :根据伸缩容器的主轴和侧轴,伸缩项目的宽度和高度。
◆ 对应主轴的称为主轴尺寸。
◆ 对应侧轴的称为侧轴尺寸。
二、定义弹性盒子模型
display: flex;
display: inline-flex;
- flex:设置指定元素为块级元素的弹性盒子模型。
- inline-flex:设置指定元素为行内块级元素的弹性盒子模型。
三、flex-direction属性
这个属性设置伸缩项目的方向。
语法
flex-direction: row | row-reverse | column | column-reverse
- row:设置主轴是水平方向
- row-reverse:与row的排列方向相反。
- column: 设置主轴是垂直方向。
- column-reverse:与column的排列方向相反。
开始测试
- row
这是HTML部分代码
<div class="container">
<div style="background-color:#113399 ;"></div>
<div style="background-color:#00FF00 ;"></div>
<div style="background-color:#00DB00 ;"></div>
<div style="background-color:#0000FF ;"></div>
<div style="background-color:#2196F3 ;"></div>
</div>
CSS部分代码
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
}
/* 设置伸缩项目的样式 */
.container div {
width: 100px;
height: 300px;
}
测试效果如下:
发现设置为flex
后伸缩项目自己就可以水平排列了(说明flex-direction
的值默认为row
)
接着往后看
- column
当我把flex-direction
的值改为column
后
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
flex-direction: column; /* 设置主轴是垂直方向 */
}
/* 设置伸缩项目的样式 */
.container div {
width: 100px;
height: 300px;
}
测试结果如下
发现所有的伸缩项目都纵向排列起来了
而且他们的高度也被压缩了(本来是300px,压缩自动后变成了120px)。
- column-reverse
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
flex-direction: column-reverse; /* 与column的排列方向相反 */
}
/* 设置伸缩项目的样式 */
.container div {
width: 100px;
height: 300px;
}
测试结果如下
与上图对比发现颜色正好相反,这个属性可以使伸缩项目倒着排列。
四、justify-content属性
这个属性设置伸缩项目所在行沿着主轴的对齐方式。
伸缩项目必须设置宽高。
语法
justify-content: center | flex-star | flex-end | space-between | space-around
- center:伸缩项目向主轴第一行的中间位置对齐。
- flex-start:伸缩项目向主轴第一行的开始位置对齐。
- flex-end:伸缩项目向主轴第一行的结束位置对齐。
- space-between:伸缩项目会沿主轴平均分布在一行中。
- space-around:伸缩项目会沿主轴平均分布在一行中,两端保留一半的空间。
开始测试
- center
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
justify-content: center; /* 伸缩项目向第一行的中间位置对齐 */
}
测试结果如下
- space-between
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
justify-content: space-between; /* 伸缩项目会平均分布在一行中 */
}
测试结果如下
- space-around
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
justify-content: space-around;
}
测试结果如下
可以看到两边是有中间间隔的一半的长度的间隙。
五、align-items属性
这个属性用来设置伸缩项目所在行沿着侧轴的对齐方式。
语法
align-items: center | flex-start | flex-end | baseline | stretch
- center:伸缩项目向侧轴的中间位置对齐。
- flex-start:伸缩项目向侧轴的起点位置对齐。
- flex-end:伸缩项目向侧轴的终点位置对齐。
- baseline:伸缩项目根据伸缩项目的基线对齐。
- stretch:默认值,伸缩项目拉伸填充整个伸缩容器。
开始测试
- center
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
align-items: center; /* 纵向居中 */
}
测试结果如下
-
baseline(跟不设置的时候一样)
-
stretch,默认值(如果伸缩项目中不设置宽,则自动纵向拉满)
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
align-items: stretch;
}
测试结果如下
六、flex-wrap属性
这个属性用来设置伸缩项目是单行显示还是多行显示。
语法
flex-wrap: nowrap | wrap | wrap-reverse
- nowrap:默认值,设置伸缩项目单行显示。这种方式可能导致溢出伸缩容器。
- wrap:设置伸缩项目多行显示。
- wrap-reverse:与wrap相反。
开始测试
- nowrap
- 这里为了能够测试出效果,修改HTML结构。
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
flex-wrap: nowrap;
}
<div class="container">
<div style="background-color:#113399 ;"></div>
<div style="background-color:#00FF00 ;"></div>
<div style="background-color:#00DB00 ;"></div>
<div style="background-color:#0000FF ;"></div>
<div style="background-color:#2196F3 ;"></div>
<div style="background-color:#113399 ;"></div>
<div style="background-color:#00FF00 ;"></div>
<div style="background-color:#00DB00 ;"></div>
<div style="background-color:#0000FF ;"></div>
<div style="background-color:#2196F3 ;"></div>
</div>
测试结果如下
可以看到,如果是nowrap
(默认值)的话,10个伸缩项目很明显被压缩了,而不会自动换行。
如果改成wrap
- wrap
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
flex-wrap: wrap; /* 设置伸缩项目多行显示 */
}
测试结果如下
设置为wrap
后伸缩项目就可以自动换行了,只要第一行显示不下了就会自动换行。
- wrap-reverse
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 600px;
flex-wrap: wrap-reverse; /* 行会倒过来 */
}
测试结果如下
设置wrap-reverse
会使行颠倒。
七、align-content属性
这个属性用来设置伸缩行的对齐方式。该属性会更改flex-wrap属性的效果。
注意:align-content
这个属性必须配合flex-wrap
使用才有效果。
语法
align-content: center | flex-start | flex-end | space-between | space-around | stretch
- center:各行向伸缩容器的中间位置对齐。
- flex-start:各行向伸缩容器的起点位置对齐。
- flex-end:各行向伸缩容器的终点位置对齐。
- space-between:各行会平均分布在一行中。
- space-around:各行会平均分布在一行中,两端保留一半的空间。
- stretch:默认值,各行将会伸展以占用额外的空间。
开始测试
- 先修改一下css样式(修改高度),看一下默认效果是什么样的
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 700px;
flex-wrap: wrap;
/* align-content: center; */
}
测试结果如下
我们可以发现当我增大高度之后,第二行就自动往下移动,而第一行一直没动。
好,接着测试
- center
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 700px;
flex-wrap: wrap;
align-content: center;
}
测试结果如下
改为center
之后,这两行会一起垂直居中。
- flex-start
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 700px;
flex-wrap: wrap;
align-content: flex-start; /* 各行向伸缩容器的起点位置对齐 */
}
测试结果如下
使用flex-start
后,这两行会在顶部紧紧挨在一起。
- flex-end
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 700px;
flex-wrap: wrap;
align-content: flex-end; /* 各行向伸缩容器的终点位置对齐 */
}
测试结果如下
使用flex-end
后,这两行会在底部紧紧挨在一起。
- space-between
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 700px;
flex-wrap: wrap;
align-content: space-between; /* 各行会平均分布在一行中 */
}
测试结果如下
使用space-between
,各行会平均分布。
- space-around
.container {
/* 将当前元素设置为弹性盒子模型的伸缩容器 */
display: flex;
border: 1px solid #000;
width: 600px;
height: 700px;
flex-wrap: wrap;
align-content: space-around;
}
测试结果如下
顶部和底部两端是空出来一点间隙的。
八、flex-flow属性
这个属性是flex-direction
和flex-wrap
的简写。
语法
flex-flow: <'flex-direction'> || <'flex-wrap'>
九、flex属性
简写属性,用于设置伸缩项目如何伸长或缩短以适应伸缩容器中的可用空间。
语法
flex: auto | none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
- auto:伸缩项目会根据自身的宽度和高度确定尺寸,相当于将该属性设置为
flex: 1 1 auto
。 - none:伸缩项目会根据自身的宽度和高度确定尺寸,相当于将该属性设置
flex: 0 0 auto
。
十、align-self属性
这个属性用来设置伸缩项目自身元素在侧轴的对齐方式。
语法
align-self: center | flex-start | flex-end | baseline | stretch
- center:伸缩项目向侧轴的中间位置对齐。
- flex-start:伸缩项目向侧轴的起点位置对齐。
- flex-end:伸缩项目向侧轴的终点位置对齐。
- baseline:伸缩项目根据伸缩项目的基线对齐。
- stretch:默认值,伸缩项目拉伸填充整个伸缩容器。
十一、order属性
这个属性用来设置伸缩项目在布局是的顺序。
语法
order: <intege>
- integer:表示当前伸缩项目所在的次序。
<div class="container">
<div style="background-color:#113399 ; order: 3;"></div>
<div style="background-color:#00FF00 ; order: 2;"></div>
<div style="background-color:#00DB00 ; order: 1;"></div>
<div style="background-color:#0000FF ; order: 4;"></div>
<div style="background-color:#2196F3 ; order: 5;"></div>
</div>
测试结果如下
第一个伸缩项目和第三个伸缩项目交换位置。