フレックスボックスのアイテムを同じサイズにする方法は?


186

すべて同じ幅のアイテムがいくつかあるflexboxを使用したいと思います。flexboxは、スペース自体ではなく、スペースを均等に分散していることに気付きました。

例えば:

.header {
  display: flex;
}

.item {
  flex-grow: 1;
  text-align: center;
  border: 1px solid black;
}
<div class="header">
  <div class="item">asdfasdfasdfasdfasdfasdf</div>
  <div class="item">z</div>
</div>

最初の項目は2番目の項目よりもかなり大きいです。3アイテム、4アイテム、またはnアイテムがある場合、それらすべてを同じ行に表示し、アイテムごとに等量のスペースを確保します。

何か案は?

http://codepen.io/anon/pen/gbJBqM

回答:


287

それらflex-basis0(すべての要素が同じ開始点を持つように)なるように設定し、成長できるようにします。

flex: 1 1 0px

あなたのIDEまたはリンターはそれについて言及するかもしれませんthe unit of measure 'px' is redundant。(のようにflex: 1 1 0)省略した場合、IEはこれを正しくレンダリングしません。したがって、px@ fabbによるコメントで言及されているように、はInternet Explorerをサポートするために必要です。


65
flexプロパティはflex-growflex-shrinkおよびflex-basisプロパティの省略プロパティであることに注意してください。一般的な使用法に対応するため、省略形は指定されていないコンポーネントを正しくリセットするため、個々のプロパティよりも省略形を使用することをお勧めします。初期値は0 1 autoです。
j08691 2018年

3
IE11は単位のないフレックス基準値を無視することに注意してください:github.com/philipwalton/flexbugs#flexbug-4
fabb

9
min-width: 0オーバーフローしたテキストで子要素を使用するために追加する必要がありました。css-tricks.com/flexbox-truncated-textを
岩ザル19/10/20

77

flex-basis: 100%これを達成するために追加できます。

更新された例

.header {
  display: flex;
}

.item {
  flex-basis: 100%;
  text-align: center;
  border: 1px solid black;
}

それだけの価値がある場合はflex: 1、同じ結果を得るために使用することもできます。

の省略形はflex: 1と同じでflex: 1 1 0、次と同等です。

.item {
  flex-grow: 1;
  flex-shrink: 1;
  flex-basis: 0;
  text-align: center;
  border: 1px solid black;
}

1
これは正しくありません。デフォルトのフレックス値はflex: 0 1 autoです。つまり、設定flex: 1はになりflex: 1 1 autoます。これは機能しません。正しい答えをされflex: 1 1 0、アダムによって前述したように
r.sendecky

17
@ r.sendeckyいいえ、あなたは間違っています。私の回答で述べたように、flex: 1結果の速記はあなたが主張しているようなものでflex: 1 1 0 はありません flex: 1 1 auto。下の公式W3の仕様を見てみましょう「フレックス速記」セクションを次の場合flex-basisは「フレックス速記から省略し、その指定された値がある0」、ではありませんauto。ランダムな投票に感謝します。
Josh Crozier 2017年

2
@ r.sendecky-また、バリエーションを視覚化するために作成したこの例を見てください。
Josh Crozier 2017年

1
メイト、私はランダムな反対投票はしません。書く前にテストします。そして私はそれをテストしました。あなたの答えはうまくいきません-そのように単純です。とずっと前に、まったく同じ問題がflex: 1ありましたflex-direction: column。他の要素が子の中に配置されている場合、子の高さは同じではありませんでした。それを修正した唯一のものは設定 flex: 1 1 0でした。それは今日でもクロム55.0.2883.87で立っています
r.sendecky

4
@JoshCrozier flex: 1は、と同じ動作をしflex: 1 1 0flex: 0 1 auto動作が異なることを確認しました。
Ivan Durst 2017

66

width: 0項目の内容によって列が大きくなる場合は、列を等しくするために追加する必要があります。

.item {
  flex: 1 1 0;
  width: 0;
}

5
これは、内容が自然.itemよりも大きくなる場合に必要であると.item思われます。
Bungle

1
私はあなたの意味を考えるflex: 1 1 0;のではなく、flex-grow: 1 1 0;
チキンスープ

3
ファイ、リンク切れ
ボビージャック

設定flex-basisには0設定と同じ目的を果たすwidthまで0
Stephen

私のユースケースでは、親のサイズと幅に動的に調整されるグラフをラップし、それらが機能するためには0が必要でした。彼らがどのように適切な幅を決定しているかはわかりませんが、フレックスベーシスはChrome 72(2019年1月リリース)では機能しませんでした。
アンディグロフ

12

Adam(flex: 1 1 0)が承認した回答は、幅が固定されているか、祖先によって決定されるフレックスボックスコンテナーに対して完全に機能します。子供がコンテナに合うようにしたい状況。

ただし、最大サイズの子に基づいて子のサイズを同じにして、コンテナーを子に合わせたい場合があります。次のいずれかの方法で、フレックスボックスコンテナをその子に適合させることができます。

  • 設定position: absoluteしていない設定widthright、または
  • ラッパーの中に入れます display: inline-block

このようなフレックスボックスコンテナの場合、受け入れられた回答は機能しません。子のサイズは等しくありません。Chrome、Firefox、Safariで同じように動作するため、これはflexboxの制限であると思います。

解決策は、フレックスボックスの代わりにグリッドを使用することです。

デモ:https : //codepen.io/brettdonald/pen/oRpORG

<p>Normal scenario — flexbox where the children adjust to fit the container — and the children are made equal size by setting {flex: 1 1 0}</p>

<div id="div0">
  <div>
    Flexbox
  </div>
  <div>
    Width determined by viewport
  </div>
  <div>
    All child elements are equal size with {flex: 1 1 0}
  </div>
</div>

<p>Now we want to have the container fit the children, but still have the children all equally sized, based on the largest child. We can see that {flex: 1 1 0} has no effect.</p>

<div class="wrap-inline-block">
<div id="div1">
  <div>
    Flexbox
  </div>
  <div>
    Inside inline-block
  </div>
  <div>
    We want all children to be the size of this text
  </div>
</div>
</div>

<div id="div2">
  <div>
    Flexbox
  </div>
  <div>
    Absolutely positioned
  </div>
  <div>
    We want all children to be the size of this text
  </div>
</div>

<br><br><br><br><br><br>
<p>So let's try a grid instead. Aha! That's what we want!</p>

<div class="wrap-inline-block">
<div id="div3">
  <div>
    Grid
  </div>
  <div>
    Inside inline-block
  </div>
  <div>
    We want all children to be the size of this text
  </div>
</div>
</div>

<div id="div4">
  <div>
    Grid
  </div>
  <div>
    Absolutely positioned
  </div>
  <div>
    We want all children to be the size of this text
  </div>
</div>
body {
  margin: 1em;
}

.wrap-inline-block {
  display: inline-block;
}

#div0, #div1, #div2, #div3, #div4 {
  border: 1px solid #888;
  padding: 0.5em;
  text-align: center;
  white-space: nowrap;
}

#div2, #div4 {
  position: absolute;
  left: 1em;
}

#div0>*, #div1>*, #div2>*, #div3>*, #div4>* {
  margin: 0.5em;
  color: white;
  background-color: navy;
  padding: 0.5em;
}

#div0, #div1, #div2 {
  display: flex;
}

#div0>*, #div1>*, #div2>* {
  flex: 1 1 0;
}

#div0 {
  margin-bottom: 1em;
}

#div2 {
  top: 15.5em;
}

#div3, #div4 {
  display: grid;
  grid-template-columns: repeat(3,1fr);
}

#div4 {
  top: 28.5em;
}

0

私はフレックスの専門家ではありませんが、私が扱っていた2つの項目の基準を50%に設定することでそこに到達しました。1に成長し、0に縮小します。

インラインスタイル: flex: '1 0 50%',

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