【发布时间】:2015-12-09 15:46:32
【问题描述】:
考虑弹性容器的主轴和交叉轴:
来源:W3C
要沿主轴对齐弹性项目,有一个属性:
要沿交叉轴对齐弹性项目,需要三个属性:
在上图中,主轴是水平的,横轴是垂直的。这些是弹性容器的默认方向。
但是,这些方向可以很容易地与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;
(交叉轴始终垂直于主轴。)
我在描述轴的工作方式时的意思是,这两个方向似乎都没有什么特别之处。主轴,交叉轴,它们在重要性方面是相同的,flex-direction 可以很容易地来回切换。
那么为什么交叉轴会获得两个额外的对齐属性呢?
为什么align-content 和align-items 合并为主轴的一个属性?
为什么主轴没有得到justify-self属性?
这些属性有用的场景:
将弹性项目放置在弹性容器的角落
#box3 { align-self: flex-end; justify-self: flex-end; }-
使一组弹性项目右对齐 (
justify-content: flex-end) 但第一个项目左对齐 (justify-self: flex-start)考虑一个包含一组导航项和一个徽标的标题部分。使用
justify-self,徽标可以向左对齐,而导航项保持在最右侧,并且整个事物可以平滑地调整(“弯曲”)以适应不同的屏幕尺寸。 -
在一排三个弹性项目中,将中间项目附加到容器的中心(
justify-content: center)并将相邻项目与容器边缘对齐(@987654350@ 和justify-self: flex-end)。请注意,
space-around和space-between的值在 如果相邻项的宽度不同,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>
在撰写本文时,flexbox spec 中没有提到 justify-self 或 justify-items。
然而,在CSS Box Alignment Module 中,这是 W3C 的未完成提案,即建立一套通用的对齐属性以供所有盒子模型使用,有这样的:
来源:W3C
您会注意到 justify-self 和 justify-items 正在考虑中...但不适用于 flexbox。
我将重申主要问题:
为什么没有“justify-items”和“justify-self”属性?
【问题讨论】:
-
您希望
justify-self如何为弹性项目工作?假设你有项目 a,b,c,d 有额外的空间分布在它们周围,而弹性容器有justify-content: space-between,所以它们最终像 |a b c d|。添加例如是什么意思justify-self: center或 'justify-self: flex-end` 只是到项目 'b' 那里?你希望它去哪里? (我在这里的一个答案中看到了一些演示,但我没有看到它通常可以工作的明确方式。) -
(或者:假设我们有
justify-content: flex-start,所以项目一开始就很拥挤,就像|abcd |。如果你把justify-self: [anything]放在项目'b'上,你希望它做什么那里?) -
@dholbert,您写道:您希望
justify-self如何为弹性项目工作? 我想说与auto边距已经在弹性项目上工作没有太大区别项目。在您的第二个示例中,项目 d 上的justify-self: flex-end会将其移动到远端。这本身就是一个很棒的功能,automargins 已经可以做到。我通过演示发布了答案。 -
我在这里主要看到更多的用例,而且用例很棒——但棘手的一点是如何将其硬塞到@987654370 的 实际 方式中@ 和
justify-self已指定,因此有冲突的情况(如我询问的场景)被明确且合理地定义。正如我在此处的回答中所指出的,{justify|align}-self是关于在一个较大的框中对齐项目,该框的大小与{justify|align}-self值无关——在主轴上没有这样的框,用于对齐的弹性项目。 -
RE “与自动边距没有什么不同” - 我实际上是在询问您如何想象
justify-self和justify-content在它们发生冲突的情况下(例如我列出的场景)会如何交互。自动边距根本不与justify-content交互——它们在justify-content有机会使用它之前偷走了所有的包装空间。因此,自动边距并不能很好地模拟其工作原理。
标签: css flexbox language-lawyer w3c