これについては疑問や記事が出ていますが、私が知る限り決定的なものはありません。私が見つけた最も良い要約は
flex-basis を使用すると、他の要素が計算される前に、要素の初期/開始サイズを指定できます。パーセンテージまたは絶対値のいずれかになります。
...それ自体は、flex-basisが設定された要素の動作についてはあまり説明していません。フレックスボックスに関する私の現在の知識では、なぜ幅も説明できないのかわかりません。
実際にflex-basis がwidthとどのように異なるのかを正確に知りたいです。
- width をflex-basisに置き換えると(またはその逆)、視覚的に何が変わりますか?
- 両方を異なる値に設定するとどうなりますか? 同じ値にするとどうなりますか?
- widthまたはflex-basis のいずれかを使用すると、他方を使用する場合と比べて大きな違いが生じるような特別なケースはありますか?
- widthとflex-basis は、flex-wrap、flex-grow、flex-shrinkなどの他のフレックスボックス スタイルと組み合わせて使用した場合、どのように異なりますか?
- 他に大きな違いはありますか?
編集/説明: この質問は別の形式で尋ねられていますflex-basis プロパティ セットとは正確には何ですか?しかし、 flex-basisとwidth (またはheight )の違いをより直接的に比較したり要約したりすると良いと思いました。
ベストアンサー1
考慮する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
絶対位置のフレックスアイテムには影響しません。width
プロパティheight
が必要になります。絶対位置のフレックスアイテムはフレックスレイアウトには参加しません。プロパティを使用すると、、の
flex
3 つのプロパティを 1 つの宣言にうまく組み合わせることができます。 を使用すると、同じルールに複数行のコードが必要になります。flex-grow
flex-shrink
flex-basis
width
ブラウザの動作
レンダリング方法に関しては、またはでない限り、との間に違いはありません。flex-basis
width
flex-basis
auto
content
仕様より:
auto
および以外のすべての値についてはcontent
、横書きモードの場合flex-basis
と同じ方法で解決されます。width
auto
しかし、またはの影響はcontent
最小限か、まったくない可能性があります。仕様からの詳細:
フレックスアイテムに指定すると、
auto
キーワードはメインのサイズプロパティの値を used として取得しますflex-basis
。その値が である場合auto
、 used 値は になります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
、必ずしも 100 px になるわけではありません。
指定された幅をレンダリングし、それを固定するには、縮小を無効にする必要があります。
div {
width: 100px;
flex-shrink: 0;
}
または
div {
flex-basis: 100px;
flex-shrink: 0;
}
または、仕様で推奨されているとおり:
flex: 0 0 100px; /* don't grow, don't shrink, stay fixed at 100px */
著者は、長文プロパティを直接使用するのではなく、短文を使用して柔軟性を制御することが推奨されます
flex
。これは、短文が、指定されていないコンポーネントを適切にリセットして、一般的な用途。
ブラウザのバグ
一部のブラウザでは、ネストされたフレックス コンテナー内のフレックス アイテムのサイズ設定が困難です。
flex-basis
ネストされた flex コンテナーでは無視されます。width
動作します。
を使用するとflex-basis
、コンテナーは子のサイズを無視し、子がコンテナーからオーバーフローします。ただし、width
プロパティを使用すると、コンテナーは子のサイズを尊重し、それに応じて拡張します。
参考文献:
- Chrome は子のコンテンツに応じて flex の親要素を拡張しません
- flex-basis を使用すると flex アイテムがオーバーフローする
- 幅とフレックスベースの違い
- ネストされたフレックス コンテナーのサイズを決定するときに、flex-basis は無視されます。
- flex-basis:100px は width:100px+flex-basis:auto とは異なる動作をする
例:
- https://jsfiddle.net/t419zhra/(ソース:@ドレモラ)
- https://codepen.io/anon/pen/NVxaoy(ソース@ダニエル)
- https://jsfiddle.net/voc9grx6/(ソース:Chromium のバグ)
- https://jsfiddle.net/qjpat9zk/(ソース:Chromium のバグ)
オーバーフローコンテナーflex-basis
を使用した flex アイテム。動作します。white-space: nowrap
inline-flex
width
に設定されたフレックス コンテナーは、兄弟をレンダリングするときに子をinline-flex
認識しないようです(幅が未定義のアイテムである可能性もありますが)。コンテナーはアイテムを収容するために拡張されません。flex-basis
white-space: nowrap
ただし、width
の代わりに プロパティを使用するとflex-basis
、コンテナーは子のサイズ設定を尊重し、それに応じて拡張します。これは、IE11 および Edge では問題になりません。
参考文献:
例:
- https://jsfiddle.net/p18h0jxt/1/(上記の最初の投稿より)
flex-basis
(そしてflex-grow
) テーブル要素では動作しない
参考文献:
flex-basis
親コンテナが縮小してフィットする要素である場合、Chrome と Firefox では失敗します。Edge ではセットアップは正常に機能します。
上記のリンクに示されている例のように、 を使用する場合、と をposition: absolute
使用すると、同じ欠陥のある出力が表示されます (float
inline-block
jsfiddle デモ)。