弹性布局
弹性布局专门用来处理一维内容的布局。对于侧边栏模板,弹性布局是个理想的布局模型。
弹性布局的特性:
可以按行或按列排列。
遵从文档的书写模式( Writing mode )。
默认在单行展示,但也可以设置换行。
布局中的物品可以在视觉上重新排列,而非依照 DOM 。
空间会弹性分配给物品们,物品们的空间会随着父元素空间变大变小。
使用 Box Alignment 属性,可以在物品和弹性行周围分配空间。
物品可以在轴线上进行对齐。
主轴和交叉轴
主轴 由 flex-direction
属性设置,即布局方向。主轴的开始和结尾叫做 main-start 和 main-end 。
交叉轴 和主轴相交叉(若主轴为 row ,则交叉轴为 column )。同样,交叉轴的开始和结尾叫做 cross-start 和 cross-end 。
可以在交叉轴上做两件事:
你可以单独地移动物品,或者所有物品来与弹性容器一同相互对齐;
如果设置了换行,你可以对其控制所分配空间大小。
创建一个 flexbox 容器
在父元素上:
.container {
display: flex;
}
一旦父元素为 flex
,子元素将成为 flex
物品( item )。
这里存在这些初始值:
物品按行排列;
不换行;
不会自行填充整个容器;
从容器的开头排列。
布局方向
可以设置容器的 flex-direction
属性为 row
row-reverse
column
column-reverse
。
以上属性值逻辑上与本地语言书写模式及书写方向是一致的。
使用 "-reverse" 会导致访问性( Accessibility )问题。
自动换行
可以设置容器的 flex-wrap
属性来让容器中的物品根据容器宽度自动换行:
.container {
display: flex;
flex-wrap: wrap;
}
flex-wrap
的初始值为 nowrap
,当没有空间的时候会直接溢出。在空间限制下,物品会压缩自己的空间,直到 min-content
值。
不要期望
flex-wrap
能起到 grid 布局的作用。
flex-direction
和 flex-wrap
可以缩写在 flex-flow
里:
.container {
display: flex;
flex-flow: column wrap;
}
空间分配
物品会默认自行舒展开,且不会强行填充可用空间,这是因为有初始值 flex: initial;
,即:
flex-grow: 0;
不能空间扩展flex-shrink: 1;
可以收缩flex-basis: auto;
基础大小
还有一些关键字:
flex: auto;
,等价于:flex-grow: 1;
允许空间扩展flex-shrink: 1;
可以收缩flex-basis: auto;
基础大小
flex: 1;
每个物品空间都是平均的flex: none;
既不会扩展,也不会收缩
flex-grow
flex-shrink
均为权值,扩展或紧缩的空间会按权值分配。
flex-basis
则可以是长度,或者关键字 auto
。如果设置为 0 ,内容的空间将不会得到扩展。
flex
属性是三个属性的简写,即 flex: flex-grow flex-shrink flex-basis;
。
排列顺序
可以在物品上指定 order
属性确定物品位置,初始值为 0 。
使用
order
会导致访问性( Accessibility )问题。
对齐方式
空间分配(行在容器中的对齐方式)
justify-content
主轴上分配空闲空间有这些属性值:
flex-start
向 main-start 靠,开头留白center
居中,两端留白flex-end
向 main-end 靠,开头留白stretch
拉伸物品大小space-between
物品间留白space-around
物品四周留白space-evenly
物品间留白,包括两端
更多可以看 justify-content - MDN 。
align-content
交叉轴(行间)上分配空间默认值为
stretch
拉伸。使用别的值可能需要先设置flex-wrap
,同时可能需要设置align-items
来取消交叉轴上物品的拉伸。有这些属性值:
flex-start
向 cross-start 靠,开头留白center
居中,两端留白flex-end
向 cross-end 靠,开头留白stretch
拉伸物品大小space-between
物品间留白space-around
物品四周留白
place-content
为前两者简写,一致则只写一个。place-content: justify-content, align-content;
对齐方式(行内上物品对齐方式)
align-self
:在交叉轴上自身的对齐方式(用在物品上)align-items
:在交叉轴上(行内)对齐所有物品(用在容器上)
可以用边距属性来分割行内物品:
.box:nth-child(3) {
margin-inline-start: auto;
}
综上,可以这样居中一个元素:
#root {
height: 10em;
display: flex;
justify-content: center;
align-items: center;
}
间距
可以用 row-gap
column-gap
gap
设置固定间距。