最後のフレックスアイテムをコンテナの最後に配置します


105

この質問は、flexboxを含む完全なcss3サポートを備えたブラウザに関するものです。

いくつかのアイテムが入ったフレックスコンテナがあります。それらはすべてフレックススタートに正当化されますが、最後の .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

回答:


219

フレキシブルボックスレイアウトモジュール-8.1。自動マージンに合わせる

フレックスアイテムの自動マージンは、ブロックフローの自動マージンと非常によく似た効果があります。

  • フレックスベースとフレキシブル長の計算中、自動マージンは0として扱われます。

  • justify-contentおよびを介して位置合わせする前にalign-self、正の空き領域はその次元の自動マージンに分配されます。

したがってmargin-top: auto、他の要素と最後の要素の間にスペースを分散するために使用できます。

これにより、最後の要素が下部に配置されます。

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

垂直方向の例


同様に、margin-left: autoまたはmargin-right: autoを水平方向に同じ配置に使用することもできます。

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

水平方向の例


1
ああ完璧だ、私がそれを逃したなんて信じられない!特に恥ずかしいのは、using-margin-auto-to-center-verticallyトリックについて完全に知っており、常にそれを使用しているためです
George Mauer

1
@ j08691なぜそれが機能するのかについての正式な説明はありませんが、margin: 0 auto水平方向のセンタリングに使用できる方法と似ています。Flexboxアイテムはマージンを尊重します。これにより、margin: auto基本的に、兄弟の間にできるだけ多くのスペースを置いてアイテムを配置できると思います。参照:w3.org/TR/css-flexbox-1/#auto-margins
Josh Crozier

2
@ jo8691私が間違っていなければmargin: auto、フレックスアイテムで、その方向にできるだけ多くのスペースを作成するように指示します。
ジョージマウアー2015年

1
仕様によると Prior to alignment via justify-content and align-self, any positive free space is distributed to auto margins in that dimension.
ジョージマウアー2015年

私はフレックスボックスについてもっと学ぼうとしているので、この振る舞いを説明するリファレンスを見るのは素晴らしいことです。特に、それは意図されたものであり、癖や副作用ではありません。
j08691 2015年

61

このフレックスボックスの原則は水平方向にも機能します

フレックスベースとフレキシブル長の計算中、自動マージンは0として扱われ
ます。justify-contentとalign-selfによる位置合わせの前に、正の空き領域がその次元の自動余白に分配されます。

最後のアイテムに自動左マージンを設定すると、作業が実行されます。

.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
これが実際に機能する理由はわかりませんが、プロジェクトで役立ちました。
Louis345 2017

4
すべてのアイテムを中央に配置し、最後のアイテムを右側に配置する必要がある場合はどうなりますか?
イロリアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.