Menu

CSS justify-content 与 align-items:所有取值详解

justify-content 沿主轴排列 flex 元素,align-items 沿交叉轴排列它们。本文把每个取值并排展示并实际测量,附一个可点击的对齐网格,讲解 align-self,以及 justify-content 有时不起作用的原因。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

一句话说清 justify-content 和 align-items

在 flex 容器中,justify-content 沿主轴(横跨一行)分布元素,align-items 在交叉轴(行的上下方向)上对齐元素。两者都写在容器上:

方块在两个方向上都居中了:到起始边和末尾边的距离相同,到顶部和底部的距离也相同。去掉 height: 140px,align-items: center 就无事可做了,因为容器会缩到和元素本身一样高。

实测每个 justify-content 取值

下面每一行都是同样的三个元素,只是 justify-content 不同。每行上方标签里的数字是浏览器留下的间距:第一个元素之前、元素之间,以及最后一个元素之后。

容器宽 420px,元素占 180px,所以有 240px 的剩余空间。它被分配到哪里:

值剩余空间的去向演示中的间距
flex-start(以及 start)全部在元素之后0 / 0 / 0 / 240
center一半在前,一半在后120 / 0 / 0 / 120
flex-end(以及 end)全部在元素之前240 / 0 / 0 / 0
space-between只在元素之间0 / 120 / 120 / 0
space-around每个元素两侧相等,所以两端只有一半40 / 80 / 80 / 40
space-evenly每个间距都相等,包括两端60 / 60 / 60 / 60

flex-start 跟随 flex 方向,start 跟随书写方向。只有在 row-reverse 或 column-reverse 中它们才有区别,此时 flex-start 位于反转后的那一端。

每个 align-items 取值

align-items 作用于行的交叉方向。下面的元素高度各不相同,这样你就能看出每个取值如何处理它们:

值在交叉轴上的效果
stretch(默认值)没有设置高度的元素会拉伸填满容器
flex-start(以及 start)元素以自身高度靠顶部放置
center元素以自身高度居中
flex-end(以及 end)元素靠底部放置
baseline元素移动,使第一行文字共用一条基线

在 baseline 的盒子里,三个 “Ag” 标签位于同一条线上,尽管第一个字更大、第二个上方还有内边距。当一行里混合了大标题和小字,或者标签和输入框时,就该用这个值。

点击对齐

点击 3 × 3 网格中的任意单元格。方块会移到那里,下方会打印出把它放到那里的 CSS:

选择器的行改变 align-items,列改变 justify-content。中间那一格就是经典的“让 div 居中”。

在列布局中,两者互换

justify-content 始终跟随主轴。设置 flex-direction: column 后,主轴变成垂直方向,所以 justify-content 上下移动元素,align-items 左右移动元素:

如果你把它们搞混了,交换这两个属性即可,不必重写布局。

align-self 与 auto 外边距:只针对一个元素

在元素上设置 align-self,会为这个元素覆盖 align-items。flexbox 中没有 justify-self;要沿主轴移动单个元素,给它一个 auto 外边距,它会占据那一侧所有的剩余空间:

绿色元素独自落到底部,琥珀色元素被推到行的最末端,其他元素仍然留在起始处。

有多行时:align-content

align-items 在每一行内部对齐元素。当容器换行成多行时,align-content 负责分配行本身之间的空间,取值与 justify-content 相同。在 nowrap 容器中它不起作用,因为那唯一的一行总是占满容器的高度。flex-wrap 一页有演示。

常见错误

  • 搞混了两条轴。 justify-content 是排列方向,align-items 是与之交叉的方向。在列布局中,垂直居中要用 justify-content: center。
  • 没有剩余空间。 设置了 flex: 1 的元素会占据全部空间,justify-content 就没有可分配的空间了。容器是 inline-flex 且宽度刚好等于元素总宽时也是如此。
  • align-items 没有高度可用。 容器和内容一样高,就没有可对齐的空间。设置 height 或 min-height。
  • 在 flexbox 中寻找 justify-self。 它在这里会被忽略。在元素上使用 margin-inline-start: auto(或 margin-left: auto)。
  • align-items: stretch 没有拉伸。 自身设置了 height 的元素会保持这个高度。去掉高度(如果需要最小高度,就用 min-height)。
  • 把属性写在子元素上。 这两个属性都写在 flex 容器上。只有 align-self 写在元素上。

常见问题

justify-content 和 align-items 有什么区别?

justify-content 沿主轴(元素排列的方向,flex-direction: row 时是水平方向)分配元素。align-items 沿交叉轴(行布局时是垂直方向)定位元素。在列布局中两者互换:justify-content 变成垂直方向。

space-between、space-around 和 space-evenly 有什么区别?

space-between 在第一个元素之前和最后一个元素之后不留空间,把其余空间分到元素之间。space-around 给每个元素两侧相等的空间,所以两端只得到半个间距。space-evenly 让每个间距都相等,两端也包括在内。

为什么 justify-content 不起作用?

通常是因为没有可分配的剩余空间:某个元素设置了 flex-grow 或 flex: 1,或者容器的宽度刚好等于元素的总宽度(比如 display: inline-flex 或浮动的容器)。另外检查一下 display: flex 是否写在父元素上,而不是子元素上。

为什么 align-items center 不能垂直居中?

很可能容器的高度刚好等于内容的高度,所以没有可以居中的空间。给 flex 容器设置一个高度或 min-height,元素就会移到它的中间。

align-self 有什么作用?

align-self 为单个元素覆盖容器的 align-items。例如在某个子元素上设置 align-self: flex-end,只会把这个子元素移到交叉轴的末端,其他元素仍然留在 align-items 安排的位置。

flexbox 中有 justify-self 吗?

没有。flexbox 会忽略 justify-self,因为主轴是所有元素共享的。要沿主轴单独推动一个元素,请使用 auto 外边距,比如 margin-inline-start: auto。justify-self 在 grid 中有效。

Coddy 编程语言插图

和 Coddy 一起学编程

开始