哪吒闹海,席卷图文学习前端Flex布局
共 7217字,需浏览 15分钟
· 2021-01-15
哪吒人生信条:如果你所学的东西 处于喜欢 才会有强大的动力支撑。
把你的前端拿捏得死死的,每天学习得爽爽的,微信搜索【程序员哆啦A梦】关注这个不一样的程序员,如果你所学的东西 处于喜欢 才会有强大的动力支撑。
感谢不负每一份热爱前端的程序员,不论前端技能有多奇葩,欢迎关注加我入群vx:xiaoda0423
前言
本篇文章进行学习css
中的一个重点应用,布局样式为flex
布局,相信你学习了解过display
属性,position
属性,float
属性,但今天只学习新东西就是flex
布局。
flex布局是什么
![](https://filescdn.proginn.com/d281cdb222ba8e44ca1a9f9bd73604a0/7db403a344cf0eea12d1586cb0ed116f.webp)
flex
是flexible box
的缩写,意思是弹性布局,代码样式如下:
.box {
display: flex;
}
Flexbox Layout
模块是提供一个更有效的方式来布置,对齐和item
之间在一个容器中分配的控件,即使它们的大小是未知的,或者是动态的,所以单词命名flex
(弹性工作制的)
flex
布局可以使容器更改其item
的宽度,高度,以便最好地填充可用空间,或者收缩它们来防止溢出。flexbox
布局使用比较合适应用程序地组件和小规模布局上。
在webkit
内核地浏览器中,要加上-webkit
前缀哦,代码格式如下:
.box {
display: -webkit-flex;
display: flex;
}
当设置flex
布局之后,子元素(item
)的float
,clear
,vertical-align
属性会失效。
学习前要先了解概念
![](https://filescdn.proginn.com/d7d00529b4ae15d74dfa553bb7acbcae/f982ee52272beca6ce83f7f510dc7f29.webp)
flex container
flex items
设置flex
布局的元素为flex
容器(flex container
),简称为容器。它的所有子元素都是容器的成员,flex
项目(flex item
),简称为项目。那么请查看如下图,解析flex
布局背后的主要思想。
![](https://filescdn.proginn.com/0ebc95fcfac4dbb5f3a2b8fc15dfd779/5fd524b5120a26788368edb6ad63bd84.webp)
如图可以看出,main axis
是从main-start
到main-end
,交叉轴cross axis
从cross-start
到cross-end
。
容器默认有两根轴的,水平的主轴main axis
和垂直的交叉轴cross axis
,从main-start
到main-end
叫(main start
)主轴;从cross axis
从cross-start
到cross-end
叫(cross axis
)交叉轴
单个项目占据的主轴空间叫main size
,占据的交叉轴空间叫cross size
container
弹性容器:
![](https://filescdn.proginn.com/d2e1dac9b50388a92600bb5fe40acb5c/7bb106f02713260153f816a7a1fd7aa7.webp)
.container {
display: flex;
}
items
弹性项目:
![](https://filescdn.proginn.com/3ee772990af6f9767f0a9931d23b7c0f/5a9d607e55008440a3cc6e2f9d49ec63.webp)
容器的属性
![](https://filescdn.proginn.com/3c939d08092c1ee79d784a958f4d7aab/5d3b782f93116628a1913fc0ba46f88b.webp)
flex-direction
flex-wrap
flex-flow
justify-content
align-items
align-content
flex-direction属性决定的是主轴的方向,即是项目的排列方向
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
.flex-container {
-webkit-flex-direction: row; /_ Safari _/
flex-direction: row;
}
.flex-container {
-webkit-flex-direction: row-reverse; /_ Safari _/
flex-direction: row-reverse;
}
.flex-container {
-webkit-flex-direction: column; /_ Safari _/
flex-direction: column;
}
.flex-container {
-webkit-flex-direction: column-reverse; /_ Safari _/
flex-direction: column-reverse;
}
其使用flex-direction
的box
格式如下:
// 水平
.box {
flex-direction: row;
}
// 水平倒置
.box {
flex-direction: row-reverse;
}
// 垂直
.box {
flex-direction: column ;
}
// 垂直倒置
.box {
flex-direction: column-reverse;
}
![](https://filescdn.proginn.com/7bd60ca3d99b98affcc68a90589515ce/65175add4f0c82db82912c971a54c756.webp)
.box {
width: 400upx;
height: 300upx;
background-color: #007AFF;
margin: 10upx;
}
.item {
width: 80upx;
height: 80upx;
background-color: #1CBBB4;
border: 1upx solid #FFFFFF;
}
row
:flex
容器的主轴与当前写入模式的内联轴具有相同的方向。主开始方向和主结束方向分别相当于当前写入模式的开始方向和结束方向。
![](https://filescdn.proginn.com/25babdea342a31b9effc4100f61c25e3/b015daf85feac2863f007c15fdf9edf3.webp)
.box-row {
display: flex;
flex-direction: row;
}
row-reverse
: 与'row'
相同,只是主开始方向和主结束方向交换了。
![](https://filescdn.proginn.com/8036dcf829d97f5b1d827d6c3afa8a33/5730402b4a3d2885755b07fb60ed256c.webp)
.box-row-reverse {
display: flex;
flex-direction: row-reverse;
}
column
: flex
容器的主轴与当前写入模式的块轴方向相同。主开始方向和主结束方向分别相当于当前书写模式的前/头和后/脚方向。
![](https://filescdn.proginn.com/3a97c03b86eabfc4ce305ea9933e1bfa/480ba01c2d8bb4b2845b65dd73f37f1a.webp)
.box-column {
display: flex;
flex-direction: column;
}
column-reverse
: 与'column'
相同,只是主开始方向和主结束方向交换了。
![](https://filescdn.proginn.com/0924c6fdd4b16656792bc9431128e94b/7d2e2ea4183f71a7c9d4b67482ad4a28.webp)
.box-column-reverse {
display: flex;
flex-direction: column-reverse;
}
flex-wrap
属性:根据伸缩容器中的可用空间,指定伸缩项是否换行以及它们换行到多行或多列的方向。
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
.flex-container {
-webkit-flex-wrap: nowrap; /_ Safari _/
flex-wrap: nowrap;
}
.flex-container {
-webkit-flex-wrap: wrap; /_ Safari _/
flex-wrap: wrap;
}
.flex-container {
-webkit-flex-wrap: wrap-reverse; /_ Safari _/
flex-wrap: wrap-reverse;
}
![](https://filescdn.proginn.com/1d7fa589ad8e8677f4ecfc7b99f39478/5230b7c6b6d85bd0b13dc5e809126ce1.webp)
flex-wrap: nowrap
: 不换行。(所有弹性项目都将在一行上)
![](https://filescdn.proginn.com/4fc2c6a861a5933a49acda60d288d017/673a9088fb4274da92662be0c24c098c.webp)
.box-flex-wrap-nowrap {
display: flex;
flex-wrap: nowrap;
}
flex-wrap: wrap
: 换行,第一行在上方。(弹性项目将从上到下缠绕在多行上)
![](https://filescdn.proginn.com/a9b6bb3ff2c4d40eed37bd8b5f478b59/110f13ce74826ab20c1aab5d1e9d3e54.webp)
.box-flex-wrap-wrap {
display: flex;
flex-wrap: wrap;
}
wrap-reverse
: 换行,第一行在下方。(弹性项目将从下到上缠绕在多行上)
![](https://filescdn.proginn.com/3cd32d5c9ed63d595c0dc05353a2aa7c/a0c4d2db2ef81360c0ec92f42d473792.webp)
.box-flex-wrap-wrap-reverse {
display: flex;
flex-wrap: wrap-reverse;
}
flex-flow
属性是flex-direction
属性和flex-wrap
属性的简写形式,默认值为row nowrap
。
.box {
flex-flow: || ;
}
.container {
flex-flow: column wrap;
}
![](https://filescdn.proginn.com/7ce816c4f4df3c4b8b3b28908eca395d/f3ced4997cd96f491a70ea16379ae6a5.webp)
.box-flex-flow-1 {
display: flex;
flex-flow: auto; // flex-flow: row nowrap;
}
![](https://filescdn.proginn.com/6b190071ca770a37570702092a799b94/1c2023cf7ba7d45fef95f973bd2698eb.webp)
.box-flex-flow-2 {
display: flex;
flex-flow: row wrap;
}
justify-content
属性:指定在解析了任意灵活长度和自动边距后,伸缩项如何沿伸缩容器的主轴对齐。(定义了项目在主轴上的对齐方式)
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
flex-start
初始值。伸缩项目被打包在行首。第一个伸缩项的起始边被放置在伸缩容器的开始处。下一个伸缩项的起始边与第一个伸缩项的结束边按布局轴方向依次放置。所有沿布局轴保留的空间都放置在布局轴的末端。
.box-flex-justify-content-1 {
display: flex;
justify-content: flex-start;
}
如图效果:
![](https://filescdn.proginn.com/43c5e82165c16f4b805ae784ff73584e/c9b258f45bd098c09dc6ed1ad73b9bf5.webp)
flex-end
弹性物品被打包到行尾。第一个伸缩项的结束边缘被放置在伸缩容器的末端。下一个伸缩项目的结束边缘与第一个伸缩项目的开始边缘按布局轴方向依次放置。沿布局轴剩下的所有空间都放置在布局轴的起点。
.box-flex-justify-content-2 {
display: flex;
justify-content: flex-end;
}
如图效果:
![](https://filescdn.proginn.com/ea6a9c236ed1a30fd3ea955b248f665e/c003073c39b848b5cef414d51dd2aa80.webp)
center
弹性物品被打包在线的中间。flex
项目在直线上放置冲洗彼此对齐线的中心,与等量的main-start
边缘之间的空白行和第一项之间的线,主要目的的边缘线,最后一项。(如果剩余的空闲空间是负的,伸缩项将在两个方向上相等地溢出。)
.box-flex-justify-content-3 {
display: flex;
justify-content: center;
}
如图效果:
![](https://filescdn.proginn.com/d94056a280f0d1e0cb0b33df1e4644f2/30ba154580ceb8a8ffe7cd227f91eef3.webp)
space-between
弹性项目均匀地分布在这条线上。如果剩余的自由空间是负的,或者一行上只有一个flex
项目,这个值与' flex-start '
相同。否则,main-start
保证的第一flex
项目线的边缘放置充裕的main-start
边缘线,最后一个flex
项的主要目的利润边缘线放置充裕的主要目的边缘线,和其余的flex
项目的分布之间的间距与任何两个相邻物品是一样的。
.box-flex-justify-content-4 {
display: flex;
justify-content: space-between;
}
如图效果:
![](https://filescdn.proginn.com/a5e1c59f5cde68076c6b9d79d72274f7/bffef711d8f3118f34cc248bae9d63f6.webp)
space-around
弹性项目均匀地分布在线中,在两端有一半大小的空间。如果剩余的自由空间是负的,或者一行上只有一个伸缩项,这个值与' center '
相同。否则,行上的伸缩项的分布使行上任意两个相邻伸缩项之间的间距相同,并且第一个/最后一个伸缩项与伸缩容器边缘之间的间距为伸缩项之间间距的一半。
.box-flex-justify-content-5 {
display: flex;
justify-content: space-around;
}
如图效果:
![](https://filescdn.proginn.com/0d2aefe44adf06ee2ec8302d0db3e98f/3bfc5ed69932809afac2325228825f04.webp)
space-evenly
:分配项目,以使任意两个项目之间的间距(以及到边缘的间距)相等。
![](https://filescdn.proginn.com/e6de2cc8b83bb0f8bfffbf6948de035a/0db525a076ceb6b96c15be583657278f.webp)
align-items
属性:指定伸缩容器中伸缩项的对齐值(垂直于由伸缩方向属性定义的布局轴)。
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}
修改item
样式如图:
![](https://filescdn.proginn.com/627c8d512cf409b00c31de8f65480234/bf9dcd3d528a34fad0675068ec287bb8.webp)
.item1 {
width: 100upx;
height: 120upx;
}
.item2 {
width: 100upx;
height: 130upx;
}
.item3 {
width: 100upx;
height: 140upx;
}
flex-start
:交叉轴的起点对齐。
![](https://filescdn.proginn.com/887438000ab6c0768459f49ac8db99cd/e5dd93bda020452125fe425a2af5b1a3.webp)
.box-flex-align-items-1 {
display: flex;
align-items: flex-start;
}
flex-end
:交叉轴的终点对齐。
![](https://filescdn.proginn.com/b55ec762ceeff22aaab566b8bdea2f97/b7e3e1f0611e4ca3382c9a6cff9856fd.webp)
.box-flex-align-items-2 {
display: flex;
align-items: flex-end;
}
center
:交叉轴的中点对齐。
![](https://filescdn.proginn.com/1f029874f9e7c25b3a953cba08a9e292/5fac026772096643ea366e5182fff1ae.webp)
.box-flex-align-items-3 {
display: flex;
align-items: center;
}
baseline
: 项目的第一行文字的基线对齐。
修改item
,以第一行文字的基线对齐,想如图效果,itme3-text
顶部没有剩余空间,就被强迫这样了。如果有空间,已第一个为标准对齐,第一个item
文本底线对齐。
.item1-text {
padding: 5upx;
width: 120upx;
height: 120upx;
}
.item2-text {
width: 120upx;
height: 130upx;
}
.item3-text {
padding: 15upx;
width: 120upx;
height: 140upx;
}
![](https://filescdn.proginn.com/41e3d598ff7aea9f3dde2777c66c81a7/241185be93b594329b76f877e512a637.webp)
.box-flex-align-items-4 {
display: flex;
align-items: baseline;
}
stretch
(默认值):如果项目未设置高度或设为auto
,将占满整个容器的高度。
修改item
,没有定义高度,如果有高度还是按照原来的高度呈现。
.item-noheight {
width: 100upx;
border: 1upx solid #FFFFFF;
}
![](https://filescdn.proginn.com/b1d99db1dbeec07fc3378c8286595558/f5d1fbe118280839bda33d7ad9181353.webp)
.box-flex-align-items-5 {
display: flex;
align-items: stretch;
}
align-content
属性:指定当与flex-direction
属性定义的轴垂直的轴上有额外空间时,flex
项目的行如何在flex
容器内对齐。
align-content
属性定义了多根轴线(多行)的对齐方式。如果项目只有一根轴线,该属性不起作用。
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
flex-start
:交叉轴的起点对齐
![](https://filescdn.proginn.com/3a18584116ab953c2673fd917f0b0262/3356081bcaf05022c58965f4d85eb585.webp)
flex-end
:与交叉轴的终点对齐
![](https://filescdn.proginn.com/f618f191affaa899a19d9b21500e9673/1a8c3f561edb1ad3ced370bc2447e68c.webp)
center
:与交叉轴的中点对齐
![](https://filescdn.proginn.com/b91fb5b65965a4aa3d9b89653f71373f/029214ab7c8ab02cb97e57ffdd82bd6d.webp)
space-between
:与交叉轴两端对齐,轴线之间的间隔平均分布
![](https://filescdn.proginn.com/d0b87903c09b2522c200267fdee25a7e/e172577f730abe7e4564d45744e521a4.webp)
space-around
:每根轴线两侧的间隔都相等,轴线之间的间隔比轴线与边框的间隔大一倍
![](https://filescdn.proginn.com/4ad77c0b42d708e24e8fa6ef4e7cad90/b0cc358dec23339931108c094ea45d32.webp)
stretch
:轴线占满整个交叉轴
![](https://filescdn.proginn.com/fae21210e7dbeaef4e50251c7268d295/542af4c31ac427b47eabc315ce684705.webp)
项目的属性
order
flex-grow
flex-shrink
flex-basis
flex
align-self
order
属性定义项目的排序时,数值越小,排列越靠前,默认为0
.item {
order: <integer>;
}
![](https://filescdn.proginn.com/84c4f0f4360bdd32d1ff44f74ec7ed2b/87dbd0c37744b2acdeb7fc6b9861d430.webp)
![](https://filescdn.proginn.com/af2644505d32f2dae2e1e26cf578a4bf/d6eabc8210c0da2eb2ecae1581689cf8.webp)
flex-grow
属性定义项目的放大比例,默认为0,如果还有存在剩余空间,也不会放大
如果所有项目的flex-grow
属性都为1,那么它们将等分剩余的空间,如果一个项目的flex-grow
属性为2,其他项目都为1,那么前者占据的剩余空间将比其他项目多一倍。
.item {
flex-grow: ; /* default 0 */
}
![](https://filescdn.proginn.com/b76f841f76b5864e57a274d46edf74d9/aba2d644c632db381519354fec78f7dc.webp)
flex-shrink
属性定义了项目的缩小的比例,默认为1,如果空间不足,该项目将缩小
如果所有项目的flex-shrink
属性都为1,当空间不足时,都将等比例缩小,如果一个项目的flex-shrink
属性都为0,其他项目都为1,则空间不足时,前者不缩小,负值对该属性无效。
.item {
flex-shrink: ; /* default 1 */
}
![](https://filescdn.proginn.com/9141e8ecca98358cb48a74ad721e343e/c75548f16e86a0b092b956c3e2ca6cb5.webp)
flex-basis
属性:定义了在分配多余空间之前,项目占据的主轴空间main size
,浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto
,即是项目的本来的大小。
.item {
flex-basis: | auto; /* default auto */
}
![](https://filescdn.proginn.com/fd9a8ea27370736e40c4405d05b19524/4241fcff85e599e43b53ca9f17170636.webp)
flex
属性是flex-grow
,flex-shrink
和flex-basis
的简写,默认值为0 1 auto
,后两个属性可选。
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
该属性有两个快捷值:auto
(1 1 auto
)和none
(0 0 auto
)
align-self
属性:允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性,默认值为auto
,表示继承父元素的align-items
属性,如果没有父元素,则等同于stretch
。
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
![](https://filescdn.proginn.com/b053e3baeb78874ef2d4d23cb620b58c/2decf40716fec57aba3c7af516b18ee5.webp)
点赞、收藏和评论
我是Jeskson(达达前端),感谢各位人才的:点赞、收藏和评论,我们下期见!(如本文内容有地方讲解有误,欢迎指出☞谢谢,一起学习了)
我们下期见!
文章持续更新,可以微信搜一搜「 程序员哆啦A梦 」第一时间阅读,回复【资料】有我准备的一线大厂资料,本文 http://www.dadaqianduan.cn/#/ 已经收录,欢迎Star。