CSSはフレックスボックスで1つのアイテムを右に揃えます


212

https://jsfiddle.net/vhem8scs/

フレックスボックスを使用して、2つのアイテムを左揃えにし、1つのアイテムを右揃えにすることはできますか?リンクはそれをより明確に示しています。最後の例は私が達成したいものです。

フレックスボックスには、1つのコードブロックがあります。floatでは、4つのコードブロックがあります。それがflexboxを好む理由の1つです。

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;
}

回答:


524

1つのflexの子を右に揃えるには、margin-left: auto;

フレックス仕様から:

主軸での自動マージンの1つの用途は、フレックスアイテムを個別の「グループ」に分離することです。次の例は、これを使用して一般的なUIパターンを再現する方法を示しています。1つのアクションバーが左側に配置され、その他のアクションが右側に配置されています。

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

更新されたフィドル

注意:

真ん中のflexアイテム(または省略形flex:1)にflex-grow:1を設定して、最後のアイテムを右端までプッシュすることで、同様の効果を得ることができます。(デモ

ただし、明らかな違いは、中間の項目が必要以上に大きくなることです。フレックスアイテムに境界線を追加して、違いを確認します。

デモ


ありがとう!これを読む前に、私はうまくいった別のことを試しました。もう一方を押す要素にflex-grow:1を設定することでした。それもうまくいきました。あなたはそれらのどれがより良いのか、そしてなぜ知っていますか?
JensTörnell2016

2
すばらしい答えです。したがって、余白は余分なスペースをとらず、flex:1が占めます。涼しい!
JensTörnell2016

4
@JensTörnellの場合、autoマージンはコンテナー内の空のスペースを使用してflexアイテムを分離します。flex-grow/ flexプロパティは、その空きスペースをとる量によって拡大フレックスアイテム、それを与えます。Danieldが述べたように、後者の方法ではflexアイテムが2つ大きくなりますが、これは望ましくない場合があります。
Michael Benjamin

12
すべての英雄はマントを着用していません。
トム

2
@ user1063287複数の要素を右揃えにするには、右揃えが必要な最初の要素にmargin-left:autoを適用します。したがって、最後の4つの要素を右揃えにしたいとします。こうすると、div:nth-last-child(4) { margin-left: auto } codepen.io
pen

37

簡潔で純粋なフレックスボックスオプションの場合、左揃えのアイテムと右揃えのアイテムをグループ化します。

<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;
}

この方法で、複数のアイテムを右側(または1つだけ)にグループ化できます。

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


これは機能しますが、各グループ内の要素をdisplay: inline;またはdisplay: inline-block;に変更しない場合、それらはflexboxのように一列に並ぶのではなく、スタックされます。
DIMMリーパー

@TheDIMMReaper問題が発生するかわかりません。拡張できますか?
spflow '26

タグをすぐに折り返しOne、s Twoからdivsに変更した方法を意味します。タグspanがまだであれば、display: block;別の行に流れます。OPには元々divs があったので、div元のタグの表示を変更しないとそれらを別の中に置くだけでは機能しないことを指摘したいと思います。
DIMMリーパー2017

1
はい、要素が1レベル下にあるdisplay: flexため、レイアウトに影響を与えなくなりました。divを使用する場合は、はい、inlineまたはinline-block機能します。しかし、もちろん、flexこれはflex-direction: row親divのデフォルトですでに使用しているためです。例。jsfiddle.net/ynbb5964/2
spflow

おかげで、私はalign-self:flex-endを試しましたが、なぜ機能しないのですか?
アナンド2018年

3

一部の要素(headerElement)を中央に配置し、最後の要素を右(headerEnd)に配置します。

.headerElement {
    margin-right: 5%;
    margin-left: 5%;
}
.headerEnd{
    margin-left: auto;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.