【问题标题】:How can I align one item right with flexbox?如何将一个项目与 flexbox 对齐?
【发布时间】:2016-05-18 03:12:18
【问题描述】:

https://jsfiddle.net/vhem8scs/

是否可以让两个项目左对齐,一个项目右对齐与 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;
}

【问题讨论】:

标签: css alignment flexbox


【解决方案1】:

这是我所做的(顺风,但它只是 CSS):

<nav class="border-b border-black flex">
  <div class="border border-red-600 w-12">Back</div>
  <div class="border border-blue-600 w-12">Logo</div>
  <div class="border border-green-600 flex-grow text-center">Socializus</div>
  <div class="border border-orange-600 w-24">
    <div class="w-12 ml-auto border border-pink-600">Menu</div>
  </div>
</nav>

想法是左右两部分的宽度相同,那么右边的一个子部分占用的空间更少

【讨论】:

    【解决方案2】:

    将一些元素(headerElement)居中对齐,最后一个元素居右(headerEnd)。

    .headerElement {
        margin-right: 5%;
        margin-left: 5%;
    }
    .headerEnd{
        margin-left: auto;
    }
    

    【讨论】:

      【解决方案3】:

      对于一个简洁、纯 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 那样全部排成一行。
      • @TheDIMMReaper 我不确定我是否看到了问题。你能扩展吗?
      • 我的意思是你如何将标签立即包装 OneTwodivs 更改为 spans - 如果它们仍然是 display: block; 那么它们将流向单独的行.由于 OP 最初有 divs,我只想指出,如果不更改原始标签的显示,简单地将它们放在另一个 div 中是行不通的。
      • 是的,由于元素现在下降了一个级别,display: flex 不再影响它们的布局。如果你想使用 div,是的,inlineinline-block 可以。而且,很明显,flex,因为我们已经将它用于默认的flex-direction: row 和父 div。前任。 jsfiddle.net/ynbb5964/2
      • 谢谢,我尝试了 align-self: flex-end,但为什么它不起作用?
      【解决方案4】:

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

      来自flex spec

      主轴中自动边距的一种用途是分隔弹性项目 分成不同的“组”。下面的例子展示了如何使用它来 重现一个常见的 UI 模式 - 一个带有一些操作的单条 左对齐,其他右对齐。

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

      Updated fiddle

      .wrap {
        display: flex;
        background: #ccc;
        width: 100%;
        justify-content: space-between;
      }
      .wrap div:last-child {
        margin-left: auto;
      }
      .result {
        background: #ccc;
        margin-top: 20px;
      }
      .result:after {
        content: '';
        display: table;
        clear: both;
      }
      .result div {
        float: left;
      }
      .result div:last-child {
        float: right;
      }
      <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>

      注意:

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

      然而,明显的区别是中间项目变得比它可能需要的更大。为弹性项目添加边框以查看差异。

      Demo

      .wrap {
        display: flex;
        background: #ccc;
        width: 100%;
        justify-content: space-between;
      }
      .wrap div {
        border: 3px solid tomato;
      }
      .margin div:last-child {
        margin-left: auto;
      }
      .grow div:nth-child(2) {
        flex: 1;
      }
      .result {
        background: #ccc;
        margin-top: 20px;
      }
      .result:after {
        content: '';
        display: table;
        clear: both;
      }
      .result div {
        float: left;
      }
      .result div:last-child {
        float: right;
      }
      <div class="wrap margin">
        <div>One</div>
        <div>Two</div>
        <div>Three</div>
      </div>
      
      <div class="wrap grow">
        <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>

      【讨论】:

      • 谢谢!在阅读本文之前,我尝试了另一件事。这是在应该推动另一个的元素上设置 flex-grow: 1 。它也很有效。你知道哪一个更好吗?为什么?
      • 很好的答案。所以边距不会占用额外的空间,而 flex: 1 会。酷!
      • @JensTörnell,auto 边距使用容器中的空白空间来分隔弹性项目。 flex-grow/flex 属性占用该空白空间,将其提供给弹性项目,该弹性项目扩展该数量。正如 Danield 所说,后一种方法会使弹性项目 TWO 变大,这可能是您不想要的。
      • 并非所有英雄都穿着斗篷。
      • @user1063287 要将多个元素向右对齐,只需在需要向右对齐的第一个元素上应用 margin-left: auto 。因此,假设您希望最后 4 个元素向右对齐,您可以这样做:div:nth-last-child(4) { margin-left: auto }codepen.io/danield770/pen/ERyoar
      猜你喜欢
      • 2015-10-26
      • 1970-01-01
      • 2020-09-20
      • 2020-09-17
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 2018-06-21
      相关资源
      最近更新 更多