考虑一个伸缩容器的主轴和十字轴:

来源:W3C

要沿主轴对齐伸缩项目,有一个属性:

justify-content

要沿着十字轴对齐伸缩项目,有三个属性:

align-content 对齐项目 align-self

在上图中,主轴是水平的,交叉轴是垂直的。这些是伸缩容器的默认方向。

然而,这些方向可以很容易地与flex-direction属性交换。

/* main axis is horizontal, cross axis is vertical */
flex-direction: row;
flex-direction: row-reverse;

/* main axis is vertical, cross axis is horizontal */    
flex-direction: column;
flex-direction: column-reverse;

(交叉轴总是垂直于主轴。)

我在描述坐标轴如何工作时的观点是,两个方向似乎都没有什么特别之处。主轴,交叉轴,它们在重要性上是相等的,而弯曲方向使得来回切换很容易。

那么为什么交叉轴有两个额外的对齐属性呢?

为什么对齐内容和对齐项合并到主轴的一个属性中?

为什么主轴没有自我证明的性质?


这些属性有用的场景:

在伸缩容器的角落中放置伸缩项 #box3 {align-self: flex-end;justify-self: flex-end;} 使一组伸缩项向右对齐(justify-content: flex-end),但第一个项向左对齐(justify-self: flex-start)

考虑一个带有一组导航项和一个标志的标题部分。使用“justify-self”,logo可以向左对齐,而导航项则保持在最右边,整个东西可以顺畅地调整(“弯曲”)到不同的屏幕尺寸。

在一排三个伸缩项中,将中间的项粘贴到容器的中心(justify-content: center),并将相邻的项对齐到容器边缘(justify-self: flex-start和justify-self: flex-end)。

注意,空格和空格的值为on 如果相邻项的宽度不同,则Justify-content属性不会保持中间项以容器为中心。

#container { display: flex; justify-content: space-between; background-color: lightyellow; } .box { height: 50px; width: 75px; background-color: springgreen; } .box1 { width: 100px; } .box3 { width: 200px; } #center { text-align: center; margin-bottom: 5px; } #center > span { background-color: aqua; padding: 2px; } <div id="center"> <span>TRUE CENTER</span> </div> <div id="container"> <div class="box box1"></div> <div class="box box2"></div> <div class="box box3"></div> </div> <p>note that the middlebox will only be truly centered if adjacent boxes are equal width</p>

新美国jsFiddle


在撰写本文时,flexxbox规范中还没有提到“自我辩护”或“自我辩护”项目。

然而,在CSS框对齐模块中,这是W3C未完成的提案,旨在建立一组通用的对齐属性,用于所有的框模型,有这样的:

                                                                                                                                                    来源:W3C

你会注意到“自我辩护”和“理由项目”被考虑在内……但这并不适用于flexbox。


最后,我将重申主要问题:

为什么没有“justify-items”和“justify-self”属性?


当前回答

这个问题是在www风格的列表中提出的,Tab Atkins(规范编辑器)提供了一个解释原因的答案。我将在这里详细说明一下。

To start out, let's initially assume our flex container is single-line (flex-wrap: nowrap). In this case, there's clearly an alignment difference between the main axis and the cross axis -- there are multiple items stacked in the main axis, but only one item stacked in the cross axis. So it makes sense to have a customizeable-per-item "align-self" in the cross axis (since each item is aligned separately, on its own), whereas it doesn't make sense in the main axis (since there, the items are aligned collectively).

对于多线flexbox,同样的逻辑适用于每个“flex线”。在给定的一行中,项目在交叉轴上单独对齐(因为在交叉轴上每行只有一个项目),而在主轴上集体对齐。


Here's another way of phrasing it: so, all of the *-self and *-content properties are about how to distribute extra space around things. But the key difference is that the *-self versions are for cases where there's only a single thing in that axis, and the *-content versions are for when there are potentially many things in that axis. The one-thing vs. many-things scenarios are different types of problems, and so they have different types of options available -- for example, the space-around / space-between values make sense for *-content, but not for *-self.

SO:在flexbox的主轴上,有许多东西可以分配空间。因此,*-content属性在这里是有意义的,但*-self属性没有意义。

相反,在交叉轴中,我们同时拥有*-self和*-content属性。一个决定我们将如何在许多伸缩线(align-content)周围分配空间,而另一个(align-self)决定如何在给定的伸缩线内,在十字轴上的单个伸缩项目周围分配空间。

(这里我忽略了*-items属性,因为它们只是为*-self建立默认值。)

其他回答

我知道这并不使用flexbox,但对于三个项目的简单用例(一个在左边,一个在中间,一个在右边),这可以很容易地使用display来完成:parent上的grid, grid-area: 1/1/1/1;在孩子身上,并为这些孩子的定位辩护。

< span style=" font - family:宋体;"显示:网格;宽度:100 px;高度:25 px;" > < span style=" font - family:宋体;"宽度:25 px;网格:1/1/1/1;justify-self:左;" > < / div > < span style=" font - family:宋体;"宽度:25 px;网格:1/1/1/1;justify-self:中心;" > < / div > < span style=" font - family:宋体;"宽度:25 px;网格:1/1/1/1;justify-self:正确;" > < / div > < / div >

这个问题是在www风格的列表中提出的,Tab Atkins(规范编辑器)提供了一个解释原因的答案。我将在这里详细说明一下。

To start out, let's initially assume our flex container is single-line (flex-wrap: nowrap). In this case, there's clearly an alignment difference between the main axis and the cross axis -- there are multiple items stacked in the main axis, but only one item stacked in the cross axis. So it makes sense to have a customizeable-per-item "align-self" in the cross axis (since each item is aligned separately, on its own), whereas it doesn't make sense in the main axis (since there, the items are aligned collectively).

对于多线flexbox,同样的逻辑适用于每个“flex线”。在给定的一行中,项目在交叉轴上单独对齐(因为在交叉轴上每行只有一个项目),而在主轴上集体对齐。


Here's another way of phrasing it: so, all of the *-self and *-content properties are about how to distribute extra space around things. But the key difference is that the *-self versions are for cases where there's only a single thing in that axis, and the *-content versions are for when there are potentially many things in that axis. The one-thing vs. many-things scenarios are different types of problems, and so they have different types of options available -- for example, the space-around / space-between values make sense for *-content, but not for *-self.

SO:在flexbox的主轴上,有许多东西可以分配空间。因此,*-content属性在这里是有意义的,但*-self属性没有意义。

相反,在交叉轴中,我们同时拥有*-self和*-content属性。一个决定我们将如何在许多伸缩线(align-content)周围分配空间,而另一个(align-self)决定如何在给定的伸缩线内,在十字轴上的单个伸缩项目周围分配空间。

(这里我忽略了*-items属性,因为它们只是为*-self建立默认值。)

我刚刚找到了解决这个问题的方法,或者至少是我自己的问题。 我使用的是“justify-content: space-around”而不是“justify-content: space between;”

这样,结束元素就会粘在顶部和底部,如果你愿意,你可以自定义页边距。

我知道这不是答案,但我愿意为这件事做点贡献。如果他们能够为flexbox发布justification -self,让它变得真正灵活,那就太好了。

我相信,当轴上有多个项目时,justify-self行为的最合乎逻辑的方式是将自己与最近的邻居(或边缘)对齐,如下所示。

我真心希望W3C能注意到这一点,至少会考虑一下。=)

这样,无论左右方框的大小如何,您都可以拥有真正居中的项目。当其中一个盒子到达中心盒子的点时,它会简单地推动它,直到没有更多的空间来分配。

制作令人惊叹的布局的简单程度是无止境的,看看这个“复杂”的例子。

沿主轴对齐伸缩项目的方法

如问题所述:

要沿主轴对齐伸缩项,有一个属性:justify-content 要沿十字轴对齐伸缩项目,有三个属性:align-content, align-items和align-self。

接下来的问题是:

为什么没有证明项目和证明自我属性?

一个答案可能是:因为它们不是必需的。

flexbox规范提供了两种方法来沿着主轴对齐伸缩项:

justify-content关键字属性和 汽车的利润


justify-content

justify-content属性将伸缩项沿伸缩容器的主轴对齐。

它应用于伸缩容器,但只影响伸缩项。

有五个对齐选项:

flex-start ~ Flex items are packed toward the start of the line. flex-end ~ Flex items are packed toward the end of the line. center ~ Flex items are packed toward the center of the line. space-between ~ Flex items are evenly spaced, with the first item aligned to one edge of the container and the last item aligned to the opposite edge. The edges used by the first and last items depends on flex-direction and writing mode (ltr or rtl). space-around ~ Same as space-between except with half-size spaces on both ends.


汽车的利润

使用自动页边距,可将伸缩项居中、间隔或打包成子组。

与应用于伸缩容器的justify-content不同,auto margin适用于伸缩项。

它们的工作原理是消耗指定方向上的所有自由空间。


将一组伸缩项向右对齐,但将第一个项向左对齐

问题中的场景:

使一组伸缩项目对齐-右(justify-content: flex-end) 但是让第一项向左对齐(justify-self: flex-start) 考虑一个带有一组导航项和一个标志的标题部分。与 Justify-self标志可以向左对齐,而导航项目保持不变 最右边,整个东西平滑地调整(“弯曲”)到 不同的屏幕尺寸。


其他有用的场景:


在角落里放置一个可伸缩的项目

问题中的场景:

在角落中放置一个伸缩项目。box {align-self: flex-end;justify-self: flex-end;}


将伸缩项垂直和水平居中

Margin: auto替代了justify-content: center和align-items: center。

而不是flex容器上的这段代码:

.container {
    justify-content: center;
    align-items: center;
}

你可以在伸缩项目上使用这个:

.box56 {
    margin: auto;
}

当将溢出容器的伸缩项居中时,此替代方法非常有用。


将一个伸缩项居中,并在第一个和边缘之间居中第二个伸缩项

伸缩容器通过分配空闲空间来对齐伸缩项。

因此,为了创造相等的平衡,使中间的物品可以在容器的中心,旁边还有一件物品,必须引入平衡。

在下面的例子中,无形的第三个伸缩物品(第61和68框)被引入来平衡“真实”物品(第63和66框)。

当然,这种方法在语义上并没有什么了不起的。

或者,您可以使用伪元素而不是实际的DOM元素。或者你可以使用绝对定位。这里涵盖了所有三种方法:居中对齐和底部对齐伸缩项

注意:上面的例子只在最外层的项目高度/宽度相等的情况下才有效——就真正的居中而言。当伸缩项的长度不同时,请参见下一个示例。


当相邻项目大小不同时,将伸缩项目居中

问题中的场景:

在一行三个伸缩项目中,将中间的项目固定在容器的中心(justify-content: center),并对齐相邻的项目 项到容器边缘(justify-self: flex-start和 justify-self: flex-end)。 注意,在justify-content属性中,如果相邻项的宽度不同,则空格和空格的值将不会保持中间项相对于容器的居中(参见演示)。

如上所述,除非所有伸缩项的宽度或高度相等(取决于伸缩方向),否则中间的项不能真正居中。这个问题为使用justification -self属性(当然是为处理该任务而设计的)提供了强有力的理由。

#container { display: flex; justify-content: space-between; background-color: lightyellow; } .box { height: 50px; width: 75px; background-color: springgreen; } .box1 { width: 100px; } .box3 { width: 200px; } #center { text-align: center; margin-bottom: 5px; } #center > span { background-color: aqua; padding: 2px; } <div id="center"> <span>TRUE CENTER</span> </div> <div id="container"> <div class="box box1"></div> <div class="box box2"></div> <div class="box box3"></div> </div> <p>The middle box will be truly centered only if adjacent boxes are equal width.</p>

这里有两种方法可以解决这个问题:

解决方案1:绝对定位

flexbox规范允许flex项目的绝对定位。这允许中间的项目完全居中,而不管其兄弟姐妹的大小。

请记住,与所有绝对定位的元素一样,这些项将从文档流中删除。这意味着它们不占用容器中的空间,并且可以重叠它们的兄弟姐妹。

在下面的例子中,中间的项目以绝对定位居中,而外部项目保持流动。但同样的布局也可以以相反的方式实现:将中间的项目居中,并将外部的项目居中并绝对放置。

解决方案#2:嵌套式伸缩容器(没有绝对定位)

.container { display: flex; } .box { flex: 1; display: flex; justify-content: center; } .box71 > span { margin-right: auto; } .box73 > span { margin-left: auto; } /* non-essential */ .box { align-items: center; border: 1px solid #ccc; background-color: lightgreen; height: 40px; } <div class="container"> <div class="box box71"><span>71 short</span></div> <div class="box box72"><span>72 centered</span></div> <div class="box box73"><span>73 loooooooooooooooong</span></div> </div>

下面是它的工作原理:

顶层的div (.container)是一个伸缩容器。 每个子div (.box)现在都是一个伸缩项。 每个.box项被赋予flex: 1,以便平均分配容器空间。 现在这些项占用了行中的所有空间,并且宽度相等。 将每个项目设置为(嵌套的)伸缩容器,并添加justify-content: center。 现在每个span元素都是居中的伸缩项。 使用弹性自动边距将外跨度左移和右移。

你也可以放弃合理内容,只使用汽车利润。

但合理内容在这里是可行的,因为汽车利润总是优先考虑的。来自规范:

8.1. 与auto对齐 利润率 在通过justify-content和align-self对齐之前,any 正自由空间分布到该维度的自动边距。


justification -content:空间相同(概念)

让我们回到“合理-内容”这个话题,这里有一个关于另一个选择的想法。

space-same ~ space-between和space-around的混合体。伸缩项目是均匀间隔的(就像空格之间),除了两端有全尺寸的空间而不是半尺寸的空间(就像空格周围)。

这种布局可以通过flex容器上的::before和::after伪元素来实现。

(代码来自@oriol,标签来自@crl)

更新:浏览器已经开始实现空间均匀化,实现了上述功能。详见这篇文章:伸缩项目之间的空间相等


PLAYGROUND(包括上面所有示例的代码)