私の目標は、次のように、flexboxの2列のレイアウトを作成することです。最初の列には2つの行があり、2番目の列には1つの行があります。
設定flex-basis: 100%
3番目の項目で目的の効果が得られますが、これはコンテナのflex-direction
はrow
です:
変更flex-direction
からcolumn
は、height
が明示的に設定されていない限り、次のようになります。これは、私のプロジェクトでは実行不可能です。
コンテナのheight
を明示的に設定せずに、最初の画像を取得するにはどうすればよいですか?
body {
display: flex;
height: 100px;
width: 100px;
}
.container {
display: flex;
flex-direction: column; /* Setting this to `row` gives the expected effect,but rotated */
flex-grow: 1;
flex-wrap: wrap;
/* height: 100%; */ /* Setting this fixes the problem, but is infeasible for my project*/
}
.item {
flex-grow: 1;
}
.one {
background-color: red;
}
.two {
background-color: blue;
}
.three {
background-color: green;
flex-basis: 100%;
}
<div class="container">
<div class="item one"> </div>
<div class="item two"> </div>
<div class="item three"> </div>
</div>
なぜ機能しないのか:
フレックスラップは、フレックスアイテムの初期メインサイズがフレックスコンテナをオーバーフローした場合にのみ発生します。 flex-direction: row
の場合、これは、アイテムがコンテナよりも幅が広い場合です。 flex-direction: column
を使用すると、コンテナの高さをオーバーフローする必要があります。
しかし、CSSでは、高さは幅とは根本的に異なる動作をします。 CSSのコンテナの高さは、その子の高さによって決まります。したがって、何かがコンテナの高さを制約しない限り、アイテムがオーバーフローすることはありません。コンテナを高くするだけです。オーバーフローしないと、ラップしません。
考えられる解決策:
コンテナの高さを制限する必要があります。明白な方法(あなたが言ったのはテーブルから外れている)は、明示的なheight
またはmax-height
を設定することです。
高さを制限する必要がある理由を自問してください。ビューポート内にとどまるのですか? viewport-relative unitsを使用して、max-height: 100vh
のように設定できます。このフレックスコンテナの外側にある別の柱の高さと同じですか?別のフレックスボックスで制約できる場合があります。このフレックスコンテナを外側のフレックスボックスのフレックスアイテムにします。ただし、その外側のflexboxには、高さを設定する必要があります。
向きを変えたときの状態(flex: none
など)で、コンテナ内のブロックに@media
を設定してみてください。
ChromeとFirefoxでテストしました。
私が理解している限り、次のコードはあなたが望む結果を与えます:
body {
display: flex;
height: 100px;
width: 100px;
}
.container {
display: flex;
flex-direction: column;
flex-wrap: wrap;
flex-grow:1;
}
.item {
flex-basis:50%;
}
.one {
background-color: red;
}
.two {
background-color: blue;
}
.three {
background-color: green;
flex-basis:100%;
}
flex-basis:50%;
を除いて、このコードはプランカーで使用するコードと同じです。何らかの理由で、プランカーはflex-basis
をサポートしていません。以下も参照してください。