CSS将一个项目与flexbox对齐


212

https://jsfiddle.net/vhem8scs/

是否可以让两个项目与flexbox左对齐,而一个项目与flexbox右对齐?链接显示得更清楚。最后一个例子是我想要实现的。

在flexbox中,我有一块代码。使用float时,我有四个代码块。这就是为什么我更喜欢flexbox的原因之一。

的HTML

<div class="wrap">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

<!-- DESIRED RESULT -->

<div class="result">
  <div>One</div>
  <div>Two</div>
  <div>Three</div>
</div>

的CSS

.wrap {
  display: flex;
  background: #ccc;
  width: 100%;
  justify-content: space-between;
}

.result {
  background: #ccc;
  margin-top: 20px;
}

.result:after {
  content: '';
  display: table;
  clear: both;
}

.result div {
  float: left;
}
.result div:last-child {
  float: right;
}

Answers:


524

要将一个flex子项向右对齐,请设置为margin-left: auto;

flex规范

主轴上自动边距的一种用法是将弹性项目分成不同的“组”。下面的示例演示如何使用它来重现常见的UI模式-单个动作栏,其中某些动作在左侧对齐,而另一些动作在右侧对齐。

.wrap div:last-child {
  margin-left: auto;
}

更新小提琴

注意:

您可以通过在中间的flex项目(或简写flex:1)上设置flex-grow:1来达到类似的效果,这会将最后一个项目一直推到右边。(演示

但是,明显的区别是中间项目变得比可能需要的大。在弹性项目上添加边框以查看差异。

演示版


谢谢!在阅读本文之前,我尝试了另一种有效的方法。它是在应该推另一个的元素上设置flex-grow:1。它也很好。您知道其中哪个更好,为什么?
延斯·托内尔

2
好答案。因此,边距不占用多余的空间,而flex:1可以。凉!
延斯·托内尔

4
@JensTörnell,auto边距使用容器中的空白空间来分隔弹性项目。该flex-grow/ flex属性采用的是空的空间,它提供了到Flex项目,它由数量扩张。正如Danield所提到的,后一种方法使弹性项目增加了两个,您可能不希望这样做。
迈克尔·本杰明

12
不是所有的英雄穿着斗篷。
汤姆(Tom)

2
@ user1063287将多个元素向右对齐只需在第一个需要右对齐的元素上应用margin-left:auto即可。假设您要使最后4个元素向右对齐,可以这样做: div:nth-last-child(4) { margin-left: auto } codepen.io/danield770/pen/ERyoar
Danield

37

对于简洁的纯flexbox选项,将左对齐的项目和右对齐的项目分组:

<div class="wrap">
  <div>
    <span>One</span>
    <span>Two</span>
  </div>
  <div>Three</div>
</div>

并使用space-between

.wrap {
  display: flex;
  background: #ccc;
  justify-content: space-between;
}

这样,您可以将多个项目分组到右侧(或仅一个)。

https://jsfiddle.net/c9mkewwv/3/


这是可行的,但如果您不将每个组内的元素更改为display: inline;display: inline-block;,则它们会像flexbox那样堆叠而不是全部排成一行,否则会具有它们。
DIMM Reaper

@TheDIMMReaper我不确定我是否看到了问题。你能扩大吗?
spflow

我只是说您如何立即将标签换行OneTwodivs更改为spans-如果它们仍然存在,display: block;则它们将流到单独的行。由于OP最初具有divs,所以我只想指出,如果div不更改原始标签的显示,仅将它们放在另一个容器中是行不通的。
DIMM收割机,2017年

1
是的,因为元素现在处于某个级别,display: flex所以不再影响其布局。如果要使用div,可以,inline或者inline-block可以。但也很明显,flex因为我们已经将它用作flex-direction: row父div的默认值。例如 jsfiddle.net/ynbb5964/2
spflow

谢谢,我尝试了align-self:flex-end,但是为什么它不起作用?
阿南德

3

将中心的某些元素(headerElement)和右边的最后一个元素(headerEnd)对齐。

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
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.