フレックスベースと幅の違いは何ですか?


224

これに関する質問と記事がありましたが、私が知る限り、決定的なことは何もありません。私が見つけることができた最高の要約は

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

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

フレックスベースと実際のがどのように異なるかを知りたいのですが。

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

編集/説明:この質問は、「厳密にフレックスベースのプロパティセットとは何ですか?」で別の形式で尋ねられましたしかし、フレックスベース(または高さ)の違いをより直接比較または要約するとよいと感じました。


フレックスベース、フレックスの成長と縮小をまとめて説明する最高の記事
ZenVentzi

回答:


339

検討する flex-direction

質問を読むときに最初に頭に浮かぶのは、flex-basis常にに当てはまるわけではないということwidthです。

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

ときでもflex-directionありcolumnflex-basis高さを制御します。


主な違い

flex-basisand width/の重要な違いはheight次のとおりです。

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

  • flex-basis主軸でのみ機能します。たとえば、にいる場合flex-direction: columnwidthプロパティはflexアイテムを水平方向にサイズ変更するために必要になります。

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

  • 使用してflex、3つのプロパティをプロパティ- flex-growflex-shrinkおよびflex-basis-きちんと1つの宣言に組み合わせることができます。を使用するwidthと、同じルールで複数行のコードが必要になります。


ブラウザの動作

それらがどのようにレンダリングされるかという点では、is またはでない限り、との間に違いflex-basisありませんwidthflex-basisautocontent

スペックから:

7.2.3。flex-basisプロパティ

以外のすべての値のautocontentflex-basis同じように解決されたwidth横書きモードでは。

しかし、の影響autoかはcontent最小限であるか全く何もないかもしれません。スペックの詳細:

auto

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

content

フレックスアイテムのコンテンツに基づいて、自動サイズ変更を示します。

注:この値は、フレキシブルボックスレイアウトの初期リリースには存在しなかったため、一部の古い実装ではサポートされません。のautoメインサイズ(widthまたはheight)と組み合わせて使用すると、同等の効果を得ることができますauto

だから、仕様に応じて、flex-basiswidthしない限り、同一の解決flex-basisですautocontent。そのような場合、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、必ずしも100pxになるとは限りません。

指定された幅をレンダリングし、固定したままにするには、縮小を無効にする必要があります。

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-basiswhite-space: nowrapオーバーフローのinline-flexコンテナ。 width動作します。

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

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

参照:

例:


flex-basis(およびflex-grow)テーブル要素で機能しない

参照:


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

上記のリンクで示した例のように、およびをposition: absolute使用すると、同じ欠陥のある出力がレンダリングされます(jsfiddleデモ)。floatinline-block


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


2
いかがmin-width:100px;ですか?縮小を無効にするオプションにすることはできますか?

1
@森、はい、でflex-shrink止まりmin-widthます。同等のフレックスルールはになりますflex: 1 0 100px
マイケルベンジャミン

flex: 1 0 100px同じ結果になりますが、「同等」とはどういう意味かわかりません。

flex: 0 0 100pxたとえば、なぜと等しいと見なすべきではないのですか?

2
@Mori。これは、widthに等しいためです。flex-grow:1コンポーネント必要です。これは、flex-basisで設定された最小幅から要素を拡大できるようにするためです。
マイケルベンジャミン

33

Michael_Bの優れた要約に加えて、これを繰り返す価値があります。

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

ここで重要な部分は初期です。

それ自体で、これは幅/高さに決意を行いまで、他のフレックスが成長/縮小プロパティが遊びに来ます。

そう。と子供

.child {
 flex-basis:25%;
 flex-grow:1;
}

最初は25%の幅になりますが、他の要素が考慮されるまで、可能な限りすぐに拡大されます。何もない場合は、100%の幅/高さになります。

簡単なデモ:

flex-growflex-shrinkおよびflex-basis (または省略形flex :fg fs fb)を試してみると、興味深い結果が得られる場合があります。


私は、彼らは両方とも、一般的に、フレックス文脈でそれを発見したflex-basisと、width / height要素のサイズを開始/初期設定します。たとえば、flex-basis: 200px基本的にはと同じように機能しflex-basis: auto; width: 200px;ます。にflex-basis設定されてautoいない場合、width / height値をオーバーライドするだけのようです。私が目にする唯一の違いは、コンテンツオーバーフローの処理方法です。
Karolis

5

追加する最も重要なポイント:

ブラウザがサポートしていない場合はどうなりflexますか?そのような場合は、width/height引き継ぎ、それらの値が適用されます。

width/height完全に異なるの値を持っている場合でも、要素を定義することは非常に良いアイデアですflex-basis。無効にdisplay:flexして、何が表示されるかを確認してテストすることを忘れないでください。


2
主要なブラウザーの中で、フレックスプロパティをサポートしないのはIE <10 のみです。caniuse.com/#search
Michael Benjamin

1
@Michael_Bもちろん、それは私だけかもしれませんが、ニンテンドー3DSブラウザーを含め、モバイルブラウザーもサポートする必要がありflexます。
Niet the Dark Absol 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.