フレックスボックス内のフレックスアイテムの垂直方向のスペースを埋めるようにしています。
.container {
height: 200px;
width: 500px;
display: flex;
flex-direction: row;
}
.flex-1 {
width: 100px;
background-color: blue;
}
.flex-2 {
position: relative;
flex: 1;
background-color: red;
}
.flex-2-child {
height: 100%;
width: 100%;
background-color: green;
}
<div class="container">
<div class="flex-1"></div>
<div class="flex-2">
<div class="flex-2-child"></div>
</div>
</div>
そしてこれが JSFiddle です。
flex-2-child
は、次の2つの場合を除いて、必要な高さを満たしません。
flex-2
の高さは100%です(デフォルトではフレックスアイテムの100%になっているため、これは奇妙です+ Chromeではバグがあります)。flex-2-child
は絶対位置を持っていますが、これも不便です現時点では、これはChromeまたはFirefoxでは機能しません。
私は同様の質問に答えました here 。
position: absolute;
は不便だとすでに言っていますが、うまくいきます。サイズ変更の問題の修正に関する詳細については、以下を参照してください。
私はChromeで公開されているWebKitプレフィックスを追加しただけですが、デモのためにこれ jsFiddle も見てください。
あなたは基本的に2つの問題を抱えています。
position: relative;
を設定します。position: absolute;
を設定します。overflow-y: auto;
を置きます。height: 0;
を指定できますスクロールの問題についての詳細は answer をご覧ください。
私が正しく理解しているならば、あなたはflex-2-childがその親の高さと幅を満たすようにしたいでしょう、それで赤い領域は完全に緑で覆われますか?
もしそうなら、flexboxを使うようにflex-2を設定する必要があります。
.flex-2 {
display: flex;
}
次にflex-2-childに柔軟になるように伝えます。
.flex-2-child {
flex: 1;
}
http://jsfiddle.net/2ZDuE/10/を参照してください /
その理由は、flex-2-childはflexboxの項目ではなく、その親がであることです。
David Storeyの答えと同様に、私の回避策は次のとおりです。
.flex-2
{
align-items: stretch;
display: flex;
}
align-items
の代わりに、ストレッチしたいalign-self
項目に.flex-2-child
を使用することもできます。
Chromeの動作はCSSの仕様とより一貫していると思います(ただし直感的にはわかりません)。 Flexboxの仕様によると、align-self
property のデフォルトのstretch
値は、要素の「クロスサイズプロパティ」の used value のみを変更します(この場合はheight
)。そして、私が CSS2.1の仕様 を理解しているように、パーセンテージの高さは、その使用された値ではなく、親のheight
の 指定 の値から計算されます。指定された親のheight
の値はどのflexプロパティにも影響されず、依然としてauto
です。
明示的にheight: 100%
を設定すると、 formally になり、CSS2.1でhtml
のパーセンテージ高さを計算できるようにheight: 100%
をbody
に設定するのと同じようになります。
私は自分で解決策を見つけました、あなたが以下のCSSを持っていると仮定します:
.parent {
align-items: center;
display: flex;
justify-content: center;
}
.child {
height: 100%; <- didn't work
}
この場合、高さを100%に設定してもうまくいきませんので、margin-bottom
ルールをauto
に設定します。
.child {
margin-bottom: auto;
}
そして、子は親の一番上に配置されます。望むなら、align-self
ルールを使用することもできます。
.child {
align-self: flex-start;
}
display:flex;
を含むflex-direction: row;
が.flex-1
および.flex-2
でcontainer
divを埋めていると考えられますが、それは、フルハイトに拡張され、.flex-2
you 'を持つ子エレメント(height:100%;
)がある場合でも、.flex-2-child
がデフォルトのheight:100%;
であることを意味しません。親をheight:100%;
に設定するか、display:flex;
divでもflex-direction: row;
と共に.flex-2
を使用する必要があります。
私が知っていることから、display:flex
はすべての子要素の高さを100%に拡張するわけではありません。
小さなデモで、.flex-2-child
から高さを取り除き、display:flex;
で.flex-2
を使いました: http://jsfiddle.net/2ZDuE/3/
html
<div class="container">
<div class="flex-1"></div>
<div class="flex-2">
<div class="flex-2-child"></div>
</div>
</div>
css
.container {
height: 200px;
width: 500px;
display: -moz-box;
display: -webkit-flexbox;
display: -ms-flexbox;
display: -webkit-flex;
display: -moz-flex;
display: flex;
-webkit-flex-direction: row;
-moz-flex-direction: row;
-ms-flex-direction: row;
flex-direction: row;
}
.flex-1 {
flex:1 0 100px;
background-color: blue;
}
.flex-2 {
-moz-box-flex: 1;
-webkit-flex: 1;
-moz-flex: 1;
-ms-flex: 1;
flex: 1 0 100%;
background-color: red;
}
.flex-2-child {
flex: 1 0 100%;
height:100%;
background-color: green;
}