跳到主要内容

弹性布局

flexbox 使用样例

​​​​​弹性布局专门用来处理一维内容的布局。对于侧边栏模板,弹性布局是个理想的布局模型。

​​弹性布局的特性:

  • 可以按行或按列排列。

  • 遵从文档的书写模式( Writing mode )。

  • 默认在单行展示,但也可以设置换行。

  • 布局中的物品可以在视觉上重新排列,而非依照 DOM 。

  • 空间会弹性分配给物品们,物品们的空间会随着父元素空间变大变小。

  • 使用 Box Alignment 属性,可以在物品和弹性行周围分配空间。

  • 物品可以在轴线上进行对齐。

主轴和交叉轴

主轴flex-direction 属性设置,即布局方向。​​主轴的开始和结尾叫做 main-start 和 main-end 。

交叉轴 和主轴相交叉(若主轴为 row ,则交叉轴为 column )。同样,交叉轴的开始和结尾叫做 cross-start 和 cross-end 。

可以在交叉轴上做两件事:

  1. 你可以单独地移动物品,或者所有物品来与弹性容器一同相互对齐;

  2. 如果设置了换行,你可以对其控制所分配空间大小。

创建一个 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-directionflex-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 设置固定间距。


参考

Flexbox,Learn CSS - web.dev

justify-content - MDN

CSS 弹性盒子布局 - MDN

flex 布局的基本概念 - MDN

A Complete Guide to Flexbox,Chris Coyier - css-tricks