本小节当中我们将学习flex-basis
以及 flex
缩写,还有两个不常用的子项属性
首先我们来看一下flex-basis
它的含义。
它的默认值是auto
,指定了flex
元素在主轴方向上的初始大小。
接下来我通过代码来给大家演示一下。
div.main > div
.main
-> 500*500
-> flex
div
-> 100*100
-> flex-basis
值是有单位px
的,它的优先级大于width
为了方便对比,我用了
300*300
的父容器
💡:不相关的话题,我在测试的时发现盒子里边的内容居然沿基线对齐
同处一行,不管其结构是怎样的,它们都是在一个行盒内的!而
demo
就是内联盒
flex-basis
指定该子元素在主轴上的一个尺寸大小,也就是说在主轴上的它所占据的这个宽度,当然,它默认是以主轴来作为宽度的,如果说你是垂直方向的话,那它其实就变成高度了。
flex-basis: 200px;
就会覆盖子元素设置的这个宽度。也就是说在水平是这个主轴的情况下, flex-basis
它的优先级是大于宽度的。注意:它其实并不是完全替代宽这么简单。flex-basis
的优先级其实就大于高度了,也就是说会对高度进行一个替换。这个时候flex-basis
就代表着垂直方向的这个高了。可以看到,flex-basis
不是单纯的指宽,也不是单纯的指高度,而是在我们主轴上的一个尺寸大小。
那问题来了,我们用这个flex-basis
能干啥呢?
它可以更加方便灵活的设置元素的方向。
怎么说?
比如我们现在的需求是这样的:
而现在有了flex-basis
:
可以看到,这个方向只要一改变,那它的一个排列就会发生变化,这是它的功能!
接下来我们看看flex-basis
有哪些可选的值。
刚才我们说到flex-basis
的默认值是auto
,那flex-basis
写像素和写auto
到底有什么样的区别呢?
0px = 0% = 0em = 0pt = 0
(都0
了,写不写单位无所谓了) -> 例外0 0s 0ms
所以,flex-basis
的可选值有:0% auto 200px 100%
介绍完我们主轴方向上的尺寸之后,再来看一下我们的flex
属性,它其实是缩写,那它是谁的缩写呢?我们一起来看一下。
flex
属性是flex-grow
、flex-shrink
以及flex-basis
这样三个属性的一个缩写。
接下来我们来看一下 flex
这种复合样式,它究竟对应的是哪些值?
先来个flex
为1
的情况:
接下来看看flex
选择为0
的情况:
flex
为1
和flex
为0
的区别:控制了flex-grow
的值
接下来我们再来看,还有我们一般会选择的就是auto
,我们看看auto
这种又会怎样:
你光写auto
那它就不是比例值了,而是认为这是尺寸了(也就是flex-basis
为auto
值),所以它会给我们返回这样一个结果:
.main2 div {
flex-grow: 1;
flex-shrink: 1;
flex-basis: auto;
}
当然,这些1、0、auto
所代表的具体的值,我们不用特意去记,我建议大家分开去设置。如果是复合样式用的比较多的组合,那就可以选择到底是1
、0
还是auto
了
除了这样的选择以外,那我们还有什么样的选择呢?
其实我们可以直接一起性写三个值,比如:
这是正常情况下三个都写的情况 -> 每个坑位的值会一一对应相应的属性
好了,flex
简写大概就是这样一个情况了,大家可以根据这个它的一个结果来选择对应的这个操作。
👇:接下来我们再来看一下在子项上其实还有两个不太常用的属性,我们也来了解一下,这样一来,我就把所有的子项的属性都给大家介绍完毕了,然后我们再去做一些案例,以此来看一下这些属性如何在实际应用当中来做。
首先我们看一下这个order
,order
就是排序的意思,它的默认值是0
,用来改变某一个 flex 子项的排序顺序,也就是排序的位置。
接下来我们来看一下这个怎么用。
500*500
,flex
100*100
可以看到,正常来说,它是按照你写的这个顺序来进行排序的,而它们的这个顺序的默认值都是 0
。
那我现在就可以作出调整了。
比如说选择第一个元素,让它的order
为1
,这样的话这第一个它肯定会排到最后一位:
为啥会这样呢?因为其它子项的order
默认是 0
,而第一个子项的order
选择为1
之后,那该子项的优先级肯定是最高的,而优先级最高则会排到整个子项当中的最后一个坑位。
同样,如果我们现在也可以给子项负数,负数的优先级会比这个0
默认的要小,所以该子项会排到最前面:
以上就是排序order
对子项做的一个简单的排序了,这个order
有时候也会用得上,但是大部分情况下我们经常还是用不到这个东西的,总之,了解一下就可以了。
👇:接着我们来看一下最后一个。
最后一个其实是针对单独的子元素进行这个对齐的。
我们来看一下它的解释:
align-self
它的默认值就是auto
,用来控制单独某一个 flex 子项的垂直对齐方向,也就是说它是align-items
里边的针对单独子项的一个同样的操作。
这是什么意思呢?我们一起来看一下。
500*500
-> flex
-> align-items: center
100*100
-> 其中第四个单独设置高为50
align-self
它的默认值就是auto
,这个auto
的含义就是说它跟这个父容器当中的align-items
的值是相同的。
align-self
为auto
值:
align-items
为center
,那auto
就是center
值align-items
为flex-start
,那auto
就是flex-start
值知道这个现象之后,我们来改一下这个值。
比如flex-start
:
我们还可以选择flex-end
、baseline
等,总之它的用法跟align-items
的这个用法是一样的,只不过align-items
它是针对整体的,而我们的这个align-self
只是针对某一个元素的,每一个小元素的 -> 所以这就比较有针对性了。
至此,所有的关于 flex 子项的属性,就介绍到这儿了,从下一小节开始,我们将陆续地来做几个小的布局案例,来看一下我们刚才这几节学的语法,在子项当中是如何进行实际的布局的。
flex-basis
默认值是auto
(or <width>
):
flex-basis
vs widths:
当子项设置了width
,那浏览器会始终使用flex-basis
的值,但要注意的是,如果子项也设置了最小宽度min-width
和最大宽度max-width
,那在这些情况下,flex-basis
就会失效,它不会被浏览器当作是子项的宽度。
flex
:
.child {
flex: 0 1 auto /* default */
/*
or <flex-grow> <flex-shrink> <flex-basis>
or <flex-grow>
or <flex-basis>
or <flex-grow> <flex-basis>
or <flex-grow> <flex-shrink>
*/
}
order
默认值是0
(number
):
align-self
:
align-items
下的子项是结盟的,遵循联盟的规则,而设置了align-self
相当于是自个儿打破规则,特立独行
.child-1 {
align-self: stretch /* default */
/*
or flex-start
or flex-end
or center
or baseline
*/
}
➹:Day 28: align-self - SamanthaMing.com
➹:properties - ‘property: 0’ or ‘property: 0px’ in CSS? - Stack Overflow