图解CSS:Flexbox布局(Part2)
特别声明:如果您喜欢小站的内容,可以点击申请会员进行全站阅读。如果您对付费阅读有任何建议或想法,欢迎发送邮件至: airenliao@gmail.com!或添加QQ:874472854(^_^)
运用于Flex项目属性
运用于Flex项目中的CSS属性和运用于Flex容器上的属性类似,主要分为三个部分:对齐、尺寸 和 方向 三个部分:
align-self
在Flex容器中可以使用align-items
来控制来控制Flex项目(所有Flex容器的子元素)在Flex容器侧轴方向的对齐方式。在Flexbox布局模块中,还可以使用align-self
对单个Flex项目进行对齐方式的控制,同样是Flex容器侧轴方向的对齐。
align-self
属性可接受的值主要有:
align-self: auto | flex-start | flex-end | center | baseline | stretch;
即使在Flex容器上显式设置了align-items
用来控制所有Flex项目在Flex容器侧轴上的对齐方式,但只要在Flex项目上显式设置了align-self
的值,则会覆盖align-items
属性。只不过只对显式设置了align-self
的Flex项目生效。比如下面这个示例,我们在Flex容器显式设置了align-items
的值为center
,并且对单数Flex项目显式设置align-self
的值:
.flex__container {
align-items: center;
direction: ltr;
writing-mode: horizontal-tb;
flex-flow: row nowrap;
}
.flex__item:nth-child(odd) {
algin-self: var(--flexSelf);
}
你将看到的效果如下:
这里需要特别提出的一点是:Flex项目的align-self
显式设置值为auto
时不会覆盖Flex容器的align-items
;另外如果在Flex项目上显式设置margin
的值为auto
时,Flex项目的align-self
值将会失效。
同样的,algin-self
也会受direction
和writing-mode
取值的影响。
当Flex容器中有多行时,每一行会进行独立的布局,其中align-self
属性每次仅作用于单独一行上的Flex项目;同时每一行侧轴长度指定为可容纳该行中的Flex项目(在依据align-self
属性进行对齐之后)的最小值,并且这些行依据align-content
属性在Flex容器中进行对齐。
order
在Flexbox布局模块中,我们除了在Flex容器上通过flex-direction
来改变DOM源的顺序之外,还可以在Flex项目上显式设置order
属性来改变DOM源顺序:
order: 0 || <number>
其中0
为order
的默认值,同时它可以接受正负值(整数值)。
比如上面示例中,每组中的第二个Flex项目order
设置了不同的值:
- 第一组中Flex项目未显式设置
order
值(即默认值为0
) - 第二组中第二个Flex项目显式设置
order
的值为1
,这个时候该Flex项目会排列在最末尾 - 第三组中第二个Flex项目显式设置
order
的值为-1
,这个时候该Flex项目会排列在最前面
其中order
值越大,Flex项目越后;反之越前:
order
用来控制Flex项目顺序在布局中非常的实用,比如我们要构建一个多列布局:
<!-- HTML -->
<header>Header Section</header>
<main>
<article>Article Section</article>
<nav>Nav Section</nav>
<aside>Aside Section</aside>
</main>
<footer>Footer Section</footer>
其中<article>
放在<nav>
和<aside>
前面,主要是为了内容为先。针对这样的DOM结构,如果我们希望<nav>
在<article>
左侧,<aside>
在<article>
右侧时,order
属性就可以起关键性的作用:
上面的示例中,在main:hover
改变了<nav>
和<aside>
两个元素的order
值:
nav {
order: -1;
}
main:hover nav {
order: 1;
}
main:hover aside {
order: -1;
}
这个时候看到的效果如下:
flex
flex
属性主要用来让Flex项目如何伸长或缩短以适应Flex容器中的可用空间。它是一个简写属性,即:
flex: [<flex-grow><flex-shrink>?||<flex-basis>]
其中:
flex-grow: <number>
flex-shrink: <number>
flex-basis: content | <width>
这几个属性都有其初始值:
flex-grow
的初始值为0
flex-shrink
的初始值为1
flex-basis
的初始值为auto
即 flex
的初始值为0 1 auto
。换句话说,如果需要重置flex
属性的话,可以将其值设置为none
。它的实际语法是:
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
在Flexbox布局模块中,flex
是一个复杂的属性,从上面的语法规则上不难发现,flex
属性可以指定 1
个值(单值语法)、2
个值(双值语法) 或 3
个值(三值语法)。
单值语法:值必须为以下其中之一:
- 一个无单位的数(
<number>
),比如flex: 1
,这个时候它会被当作<flex-grow>
的值 - 一个有效的宽度(
width
)值,比如flex: 30vw
,这个时候它会被当作<flex-basis>
的值 - 关键词
none
、auto
或initial
(即初始值)
有关于
initial
更详细的介绍,可以阅读《图解CSS:CSS层叠和继承》一文。
双值语法:第一个值必须为一个无单位数值,并且它会被当作<flex-grow>
的值;第二个值必须为以下之一:
- 一个无单位的数(
<number>
),它会被当作<flex-shrink>
的值 - 一个有效的宽度(
width
)值,它会被当作<flex-basis>
的值
比如:
flex: 1 2 » <flex-grow> <flex-shrink> » flex-grow: 1; flex-shrink: 2
flex: 2 30vw » <flex-grow> <flex-basis> » flex-grow: 2; flex-basis: 30vw
三值语法:
- 第一个值必须是一个无单位数(
<number>
),并且它会被当作<flex-grow>
的值 - 第二个值必须是一个无单位数(
<number>
),并且它会被当作<flex-shrink>
的值 - 第三个值必须为一个有效的宽度(
width
)值,并且它会被当作<flex-basis>
的值
比如:
flex: 1 2 30vw » <flex-grow> <flex-shrink> <flex-basis>
//等效于
flex-grow: 1;
flex-shrink: 2;
flex-basis: 30vw;
综合上述,flex
属性的取值可以是:
auto
:Flex项目会根据自身的width
和height
来确定尺寸,但Flex项目根据Flex容器剩余空间进行伸缩。其相当于flex: 1 1 auto
initial
:Flex项目会根据自身的width
和height
来设置尺寸。它会缩短自身以适应Flex容器,但不会伸长并吸收Flex容器中的额外剩余空间来适应Flex容器。其相当于flex: 0 1 auto
none
:Flex项目会根据自身的width
和height
来设置尺寸。它是完全非弹性的(既不会缩短,也不会伸长来适应Flex容器)。其相当于flex: 0 0 auto
<flex-grow>
:定义Flex项目的flex-grow
属性,取值为<number>
<flex-shrink>
:定义Flex项目的flex-shrink
属性,取值为<number>
<flex-basis>
:定义Flex项目的flex-basis
属性。若值为0
,则必须加上单位,以免被视作伸缩性
在大多数情况下,开发者需要将flex
设置为auto
、initial
、none
或一个无单位的正整数。比如下面这个示例,你可以尝试着调整Flex容器的大小,来观察flex
取这些值的差异: