これについて質問や記事がありますが、私が言うことができる限り決定的なものは何もありません。私が見つけることができる最高の要約は
flex-basis 他のものが計算される前に、要素の初期/開始サイズを指定することができます。パーセンテージまたは絶対値のいずれかです。
...それ自体は flex-basis setを持つ要素の振る舞いについてはあまり言っていません。現在のflexboxの知識では、なぜそれが width も記述できないのかわかりません。
実際には flex-basis が width とどの程度異なるのかを知りたいのですが。
編集/説明:この質問は 厳密にはフレックスベースのプロパティセットは何ですか? で異なる形式で尋ねられましたが、私は感じました flex-basis および width (または height )の違いをより直接的に比較または要約するといいでしょう。
flex-direction
を検討する質問を読むときに最初に頭に浮かぶのは、flex-basis
が常にwidth
に適用されるわけではないということです。
flex-direction
がrow
の場合、flex-basis
が幅を制御します。
ただし、flex-direction
がcolumn
の場合、flex-basis
は高さを制御します。
flex-basis
とwidth
/height
の重要な違いを次に示します。
flex-basis
は、フレックスアイテムにのみ適用されます。フレックスコンテナ(フレックスアイテムでもない)はflex-basis
を無視しますが、width
およびheight
を使用できます。
flex-basis
は主軸でのみ機能します。たとえば、flex-direction: column
にいる場合、width
プロパティは、フレックスアイテムを水平方向にサイズ変更するために必要です。
flex-basis
は、絶対配置のflexアイテムには影響しません。 width
およびheight
プロパティが必要です。 絶対配置のフレックスアイテムはフレックスレイアウトに参加しません 。
flex
プロパティを使用すると、3つのプロパティ(flex-grow
、flex-shrink
、flex-basis
)を1つの宣言にきちんと組み合わせることができます。 width
を使用すると、同じルールで複数行のコードが必要になります。
レンダリング方法については、flex-basis
がwidth
またはauto
でない限り、flex-basis
とcontent
の間に違いなしが必要です。
仕様から:
auto
およびcontent
以外のすべての値について、flex-basis
は、横書きモードのwidth
と同じ方法で解決されます。
ただし、auto
またはcontent
の影響は最小限であるか、まったくない場合があります。仕様からもっと:
フレックスアイテムで指定されている場合、
auto
キーワードは、使用されるflex-basis
としてメインサイズプロパティの値を取得します。その値自体がauto
である場合、使用される値はcontent
です。フレックスアイテムのコンテンツに基づいて、自動サイズ設定を示します。
注:この値はFlexible Box Layoutの初期リリースには存在しなかったため、一部の古い実装ではサポートされていません。同等の効果は、
auto
をメインサイズ(width
またはheight
)とともにauto
とともに使用することで実現できます。
したがって、仕様によれば、flex-basis
とwidth
は、flex-basis
がauto
またはcontent
でない限り、同じように解決されます。このような場合、flex-basis
はコンテンツ幅を使用する場合があります(おそらく、width
プロパティも使用します)。
flex-shrink
ファクターフレックスコンテナの初期設定を覚えておくことは重要です。これらの設定の一部は次のとおりです。
flex-direction: row
-フレックスアイテムは水平に整列しますjustify-content: flex-start
-フレックスアイテムは、メイン軸の行の先頭にスタックしますalign-items: stretch
-コンテナのクロスサイズをカバーするためにフレックスアイテムが展開されますflex-wrap: nowrap
-フレックスアイテムは強制的に1行に収められますflex-shrink: 1
-フレックスアイテムは縮小できます最後の設定に注意してください。
フレックス項目はデフォルトで縮小することが許可されているため(コンテナがオーバーフローするのを防ぎます)、指定されたflex-basis
/width
/height
はオーバーライドされます。
たとえば、flex-basis: 100px
またはwidth: 100px
と組み合わせたflex-shrink: 1
またはdiv {
width: 100px;
flex-shrink: 0;
}
は、必ずしも100pxとは限りません。
指定された幅をレンダリングするには– そしてそれを固定する –縮小を無効にする必要があります:
div {
flex-basis: 100px;
flex-shrink: 0;
}
OR
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
または、仕様で推奨されているとおり:
flex-basis
一般的な使用法 に対応するために、省略形は未指定のコンポーネントを正しくリセットするため、作成者は、その省略形を直接使用するのではなく、
flex
省略形を使用して柔軟性を制御することをお勧めします。
一部のブラウザでは、ネストされたフレックスコンテナ内のフレックスアイテムのサイズ設定に問題があります。
flex-basis
は無視されます。 width
は機能します。flex-basis
を使用すると、コンテナはその子のサイズを無視し、子はコンテナをオーバーフローします。しかし、width
プロパティを使用すると、コンテナはその子のサイズを尊重し、それに応じて展開します。
参照:
例:
white-space: nowrap
およびinline-flex
コンテナーを使用してアイテムをフレックスします。 width
は機能します。inline-flex
に設定されたflexコンテナは、flex-basis
で兄弟をレンダリングするときに、子上のwhite-space: nowrap
を認識しないようです(ただし、幅が未定義のアイテムである場合もあります)。コンテナはアイテムを収容するために拡張しません。
ただし、flex-basis
の代わりにwidth
プロパティが使用される場合、コンテナはその子のサイズを尊重し、それに応じて展開します。これはIE11とEdgeでは問題ではありません。
参照:
例:
IE 10および11に影響するバグ:
Michael_Bの優れた要約に加えて、これを繰り返す価値があります。
flex-basisでは、他のものが計算される前に、要素の初期/開始サイズを指定できます。パーセンテージまたは絶対値のいずれかです。
ここで重要なのは初期です。
それ自体では、これはwidth/heightに解決されますntil他のflex grow/shrinkプロパティが効いてきます。
そう。と子供
.child {
flex-basis:25%;
flex-grow:1;
}
最初は25%の幅になりますが、それから他の要素が考慮されるまで可能な限りすぐに拡大します。ない場合は100%の幅/高さになります。
簡単なデモ:
.flex {
width: 80%;
margin: 1em auto;
height: 25px;
display: flex;
background: rebeccapurple;
}
.child {
flex-basis: auto;
/* default */
background: Plum;
}
.value {
flex-basis: 25%;
}
.grow {
flex-grow: 1;
}
<div class="flex">
<div class="child auto">Some Content</div>
</div>
<div class="flex">
<div class="child value">Some Content</div>
</div>
<div class="flex">
<div class="child grow">Some Content</div>
</div>
flex-grow
、flex-shrink
、およびflex-basis
(または省略形のflex :fg fs fb
)を試してみると、興味深い結果が得られます。
おそらく最も重要な追加点:
ブラウザがflex
をサポートしていない場合はどうなりますか?そのような場合、width/height
が引き継ぎ、それらの値が適用されます。
たとえあなたがwidth/height
のために全く異なる値を持っていたとしても、flex-basis
を要素上で定義することは非常に良い考えです - ほとんど必須です - 。 display:flex
を無効にして何が得られるかを確認することでテストすることを忘れないでください。