将最后一个伸缩项目放置在容器的末尾


105

这个问题涉及具有完全css3支持(包括flexbox)的浏览器。

我有一个Flex容器,里面有一些物品。他们都被认为可以灵活启动,但是我希望最后一个 .end项目可以被灵活终止。有没有一种好的方法,而无需修改HTML且不求助于绝对定位?

.container {
  display: flex;
  flex-direction: column;
  outline: 1px solid green;
  min-height: 400px;
  width: 100px;
  justify-content: flex-start;
}
p {
  height: 50px;
  background-color: blue;
  margin: 5px;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="end"></p>
</div>


2
是。请参阅auto此处的边距插图:stackoverflow.com/a/33856609/3597276
Michael Benjamin

Answers:


219

灵活的盒子布局模块-8.1。与自动页边距对齐

弹性项目上的自动边距效果与块流程中的自动边距效果非常相似:

  • 在计算弹性基准和弹性长度时,自动页边距被视为0。

  • 在通过justify-content和对齐之前align-self,任何正的自由空间都会分配给该维度中的自动边距。

因此,您可以用来margin-top: auto在其他元素和最后一个元素之间分配空间。

这会将最后一个元素放置在底部。

p:last-of-type {
  margin-top: auto;
}

垂直的例子


同样,您也可以水平使用margin-left: automargin-right: auto进行相同的对齐。

p:last-of-type {
  margin-left: auto;
}

水平的例子


1
完美啊,简直不敢错过!特别令人尴尬的是,因为我完全了解自动使用边距自动居中技巧并一直使用它
George Mauer 2015年

1
@ j08691关于它为什么起作用,我没有正式的解释,但这与如何margin: 0 auto用于水平居中类似。Flexbox项尊重边距,我相信margin: auto本质上将在同级项之间放置尽可能大的空间。参见:w3.org/TR/css-flexbox-1/#auto-margins
Josh Crozier

2
@ jo8691,如果我没记错的话,margin: auto在flex项目上告诉它在该方向上创建尽可能多的空间。
George Mauer 2015年

1
规范说 Prior to alignment via justify-content and align-self, any positive free space is distributed to auto margins in that dimension.
George Mauer

我正在尝试了解有关flexbox的更多信息,因此很高兴看到描述此行为的参考。特别是它也是有意的,而不是怪癖或副作用。
j08691 2015年

61

这种flexbox原理也可以水平运行

在计算弹性基准和弹性长度时,自动页边距被视为0。
通过对齐内容和对齐自身对齐之前,任何正的自由空间都会分配给该维度中的自动页边距。

为“最后一项”设置自动左页边距将完成此工作。

.last-item {
  margin-left: auto;
}

代码示例:

.container {
  display: flex;
  width: 400px;
  outline: 1px solid black;
}

p {
  height: 50px;
  width: 50px;
  margin: 5px;
  background-color: blue;
}

.last-item {
  margin-left: auto;
}
<div class="container">
  <p></p>
  <p></p>
  <p></p>
  <p class="last-item"></p>
</div>

Codepen代码段

这对于桌面页脚非常有用。

就像Envato在这里使用公司徽标一样。

Codepen代码段


3
不确定为什么这确实有效,但是它帮助了我一个项目。
路易345

4
如果我需要所有项目都在中间,而最后一个项目在右侧,该怎么办?
Illorian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.