flex-basisとwidthの違いは何ですか?質問する

flex-basisとwidthの違いは何ですか?質問する

これについては疑問や記事が出ていますが、私が知る限り決定的なものはありません。私が見つけた最も良い要約は

flex-basis を使用すると、他の要素が計算される前に、要素の初期/開始サイズを指定できます。パーセンテージまたは絶対値のいずれかになります。

...それ自体は、flex-basisが設定された要素の動作についてはあまり説明していません。フレックスボックスに関する私の現在の知識では、なぜも説明できないのかわかりません。

実際にflex-basis がwi​​dthとどのように異なるのかを正確に知りたいです。

  • width をflex-basisに置き換えると(またはその逆)、視覚的に何が変わりますか?
  • 両方を異なる値に設定するとどうなりますか? 同じ値にするとどうなりますか?
  • widthまたはflex-basis のいずれかを使用すると、他方を使用する場合と比べて大きな違いが生じるような特別なケースはありますか?
  • widthflex-basis は、flex-wrapflex-growflex-shrinkなどの他のフレックスボックス スタイルと組み合わせて使用​​した場合、どのように異なりますか?
  • 他に大きな違いはありますか?

編集/説明: この質問は別の形式で尋ねられていますflex-basis プロパティ セットとは正確には何ですか?しかし、 flex-basiswidth (またはheight )の違いをより直接的に比較したり要約したりすると良いと思いました。

ベストアンサー1

考慮するflex-direction

あなたの質問を読んだときに最初に思い浮かぶのは、flex-basis必ずしも に当てはまるわけではないということですwidth

flex-directionが の場合rowflex-basis幅を制御します。

しかし、flex-directionの場合にはcolumnflex-basis高さを制御します。


主な違い

flex-basiswidth/の間には、いくつかの重要な違いがありますheight

  • flex-basisフレックス アイテムにのみ適用されます。フレックス コンテナー (フレックス アイテムではないもの) は を無視しますが、と をflex-basis使用できます。widthheight

  • flex-basisは主軸でのみ機能します。たとえば、 の場合flex-direction: column、フレックス アイテムの水平方向のサイズを指定するには、このwidthプロパティが必要になります。

  • flex-basis絶対位置のフレックスアイテムには影響しません。widthプロパティheightが必要になります。絶対位置のフレックスアイテムはフレックスレイアウトには参加しません

  • プロパティを使用すると、、のflex3 つのプロパティを 1 つの宣言にうまく組み合わせることができます。 を使用すると、同じルールに複数行のコードが必要になります。flex-growflex-shrinkflex-basiswidth


ブラウザの動作

レンダリング方法に関しては、またはでない限り、との間に違いはありませんflex-basiswidthflex-basisautocontent

仕様より:

7.2.3.flex-basisプロパティ

autoおよび以外のすべての値についてはcontent、横書きモードの場合flex-basisと同じ方法で解決されます。width

autoしかし、またはの影響はcontent最小限か、まったくない可能性があります。仕様からの詳細:

auto

フレックスアイテムに指定すると、autoキーワードはメインのサイズプロパティの値を used として取得しますflex-basis。その値が である場合auto、 used 値は になりますcontent

content

フレックス アイテムのコンテンツに基づいて、自動的にサイズが調整されることを示します。

注: この値は Flexible Box Layout の初期リリースには存在しなかったため、一部の古い実装ではサポートされません。 をautoメイン サイズ (widthまたはheight)と一緒に使用することで、同等の効果を実現できますauto

したがって、仕様によれば、と は、またはでない限りflex-basiswidth同じように解決されます。そのような場合、 はコンテンツ幅を使用する場合があります (おそらく、プロパティもこれを使用します)。flex-basisautocontentflex-basiswidth


要因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 */

7.2. 柔軟性の構成要素

著者は、長文プロパティを直接使用するのではなく、短文を使用して柔軟性を制御することが推奨されますflex。これは、短文が、指定されていないコンポーネントを適切にリセットして、一般的な用途


ブラウザのバグ

一部のブラウザでは、ネストされたフレックス コンテナー内のフレックス アイテムのサイズ設定が困難です。

flex-basisネストされた flex コンテナーでは無視されます。width動作します。

を使用するとflex-basis、コンテナーは子のサイズを無視し、子がコンテナーからオーバーフローします。ただし、widthプロパティを使用すると、コンテナーは子のサイズを尊重し、それに応じて拡張します。

参考文献:

例:


オーバーフローコンテナーflex-basisを使用した flex アイテム。動作します。white-space: nowrapinline-flexwidth

に設定されたフレックス コンテナーは、兄弟をレンダリングするときに子をinline-flex認識しないようです(幅が未定義のアイテムである可能性もありますが)。コンテナーはアイテムを収容するために拡張されません。flex-basiswhite-space: nowrap

ただし、widthの代わりに プロパティを使用するとflex-basis、コンテナーは子のサイズ設定を尊重し、それに応じて拡張します。これは、IE11 および Edge では問題になりません。

参考文献:

例:


flex-basis(そしてflex-grow) テーブル要素では動作しない

参考文献:


flex-basis親コンテナが縮小してフィットする要素である場合、Chrome と Firefox では失敗します。Edge ではセットアップは正常に機能します。

上記のリンクに示されている例のように、 を使用する場合、と をposition: absolute使用すると、同じ欠陥のある出力が表示されます (floatinline-blockjsfiddle デモ)。


IE 10 および 11 に影響するバグ:

おすすめ記事