Flexboxの子供を親の100%の高さにするにはどうすればよいですか?


459

フレックスボックス内のフレックスアイテムの垂直方向のスペースを埋めようとしています。

.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つの場合を除いて、必要な高さを満たしません。

  1. flex-2 高さは100%です(フレックスアイテムにはデフォルトで100%があるため奇妙です+ Chromeではバグがあります)
  2. flex-2-child 絶対不便な立場にある

これは現在ChromeまたはFirefoxでは機能しません。


高さを使用する際の問題は何ですか:100%; .flex-2?
rmagnum2002

これは、コンテンツを単独で埋めるというフレックスアイテムの目的に反するものであり、ウィンドウのサイズを変更するたびに高さがゼロに戻るクロムの最も奇妙なバグをもたらします
Raz

3
実際、Firefoxの最新バージョンのみが正常に動作しています
Raz

1
現在、フレックスボックスでの高さのレンダリングの割合に関しては、ブラウザー間で動作に大きな違いがあります:stackoverflow.com/a/35537510/3597276
Michael Benjamin

2
はい、Chromeには、特にネストされたフレックスボックスに関して、いくつかの問題があります。たとえば、子を持つネストされたフレックスボックスがありますheight:100%が、代わりに自然な高さでレンダリングされます。そして奇妙なことに、私がそれらの高さをに変更するautoと、それらはheight:100%私がやろうとしていたようにレンダリングされます。このように機能するかどうかは、直感的ではありません。
trusktr 2018

回答:


237

使用する align-items: stretch

David Storeyの回答と同様に、私の回避策は次のとおりです。

.flex-2 {
    display: flex;
    align-items: stretch;
}

の代わりにalign-items、ストレッチしたいアイテムalign-selfだけで使用できます.flex-2-child


7
stretch:これが選択された答えです。
Dave Everitt

1
間違いなく、これは質問に対する最良の答えです。完璧に動作します。
marcias

はい、これは確かにこの質問に対する最良の答えです。
ØyvindBråthen

20
height: 100%親と同じ高さにしたい子コンポーネントからも削除することを忘れないでください
Ilham Wahabi GX

height: 100%答えに削除を追加してください-私はほとんどあきらめ、戻る前の最後の瞬間にこれを見ただけですabsolute-これはあらゆる種類の問題を伴います。
ピーター

274

私はここで同様の質問に答えました。

私はあなたがすでにposition: absolute;不便だと言ったのを知っていますが、それはうまくいきます。サイズ変更の問題の修正について詳しくは、以下をご覧ください。

デモについては、このjsFiddleも参照してください。ただし、Webkitプレフィックスを追加しただけなので、Chromeで開きます。

基本的に2つの問題がありますが、これらは個別に扱います。

  1. flex-itemの子を高さ100%で埋める
    • position: relative;子供の親に設定します。
    • position: absolute;子供に設定します。
    • その後、必要に応じて幅/高さを設定できます(サンプルでは100%)。
  2. Chromeでサイズ変更のスクロールの「癖」を修正する
    • 入れoverflow-y: auto;スクロールのdivに。
    • スクロール可能なdivには、明示的な高さが指定されている必要があります。私のサンプルはすでに高さが100%ですが、適用されていない場合は指定できますheight: 0;

スクロールの問題の詳細については、この回答を参照してください。


10
ポイント1)はChromeで完全に機能し、Firefoxは絶対的な位置を必要としません。
yuri 2013年

223

私が正しく理解している場合、あなたはflex-2-childがその親の高さと幅を満たすようにして、赤い領域が完全に緑で覆われるようにしますか?

その場合は、フレックスボックスを使用するようにflex-2を設定するだけです。

.flex-2 {
    display: flex;  
}

次にflex-2-childに柔軟になるように指示します。

.flex-2-child {    
    flex: 1;
}

http://jsfiddle.net/2ZDuE/10/を参照してください

その理由は、flex-2-childがflexboxアイテムではなく、その親であるからです。


高さを100%にし、すべての子供が50/50である場合、どうすれば同じことができますか?
リッキーレヴィ

7
「align-items:center」を使用する場合、アイテムが同じ高さになるため、この修正を使用できないことに注意してください。
Neil Monroe

10
@NeilMonroe 片方の子だけで使えalign-items: centerばまだ使えますalign-self: stretch
BT

1
こんにちは@David、私はあなたの解決策を試してみました、それはflex-direction:行のレイアウトでうまく機能します、それはflex-direction:列のレイアウトでは機能していないようです、またはコードのどこかに問題があります。このフィドルjsfiddle.net/78o54Lmvで、内側のボックスが親の高さ全体を占めない理由を確認してください。
フアン風水

要素を追加min-height: 100vh;.flex-2て機能させる必要があります。助けてくれてありがとう!
Tenaciousd93

24

Chromeの動作はCSS仕様と一致していると思います(ただし、直感的ではありません)。Flexboxの仕様によるとstretchalign-selfプロパティのデフォルト値は、要素の「クロスサイズプロパティ」(この場合は)使用された値のみを変更しますheight。また、CSS2.1仕様を理解しているように、パーセンテージの高さは、使用されている値ではなく、親のの指定された値から計算heightされます。親の指定された値は、heightFlexプロパティの影響を受けず、引き続きautoです。

明示的に設定するheight: 100%ことが可能正式にだけ設定するように、子の割合の高さを計算することが可能height: 100%htmlの割合の高さを計算することが可能となるbodyCSS2.1では。


2
丁度!これを実践するには、に追加height:100%するだけ.flex-2です。これがjsfiddleです。
CourtDemone 2014年

7
Chromeの動作は、CSS仕様のChromeチームの解釈とより一致しています。それはそのように解釈できますが、それを解釈するはるかに優れた方法があり、どれもこのバザール、迷惑、そして厄介な行動に閉じ込められなかったでしょう。彼らはもっとそれを考えるべきだった。
WraithKenny 2016年

1
@RickDoesburg、これは1年以上前のことですが、固定高さの要素に頼らなければならなかったと思います。これらのブラウザが連携して動作することを願っています。私は本当にモバイルスペースを嫌い始めています。
ジョーダン

1
垂直フレックスボックスコンテナの子をに設定するとheight: 100%、Chromeで非常に奇妙な結果が得られます。これにより、「指定された高さ」が要素自体の高さではなく、コンテナの全体の高さに設定されるため、他の要素のサイズが相対的に計算されると、不要なスクロールが発生します。
Jules

13

私は自分で解決策を見つけました、以下の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;
}

素敵なハックですが、問題は、子供がサイドバーであり、背景色がある場合、マージンスペースがまだ白いことです。
Boris Burkov

このソリューションの優れている点は、親の高さが動的であることです。以前のソリューションでは、親に設定された高さが必要です。これをありがとう。
ブリボン

4

アイデアがあることだろうdisplay:flex;flex-direction: row;充填されたcontainerとのdivを.flex-1して.flex-2、それはそれは意味しない.flex-2デフォルトを持っているheight:100%;、それは完全な高さに拡張され、(子要素を持っている場合でも.flex-2-childして)height:100%;あなたは親に設定する必要がありますheight:100%;または使用を上のdivすぎ。display:flex;flex-direction: row;.flex-2

私が知っているdisplay:flexことから、すべての子要素の高さを100%に拡張することはありません。

小さなデモは、からの高さを削除.flex-2-childし、使用display:flex;.flex-2http://jsfiddle.net/2ZDuE/3/


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;
}

http://jsfiddle.net/2ZDuE/750/


0

これはalign-self: stretch;、引き伸ばしたい要素で解決することもできます。

場合によっては、フレックスボックス設定で1つのアイテムのみをストレッチすることが望ましいことがあります。

.container {
  height: 200px;
  width: 500px;
  display: flex;
  flex-direction: row;
}
.flex-1 {
  width: 100px;
  background-color: blue;
}
.flex-2 {
  position: relative;
  flex: 1;
  align-self: stretch;
  background-color: red;
}
.flex-2-child {
  background-color: green;
}
<div class="container">
  <div class="flex-1"></div>
  <div class="flex-2">
    <div class="flex-2-child"></div>
  </div>
</div>


-7

.container {。。。。align-items:ストレッチ; 。。。。}


5
Stackoverflowへようこそ。あなたはあなたの答えを完全に説明する必要があります、そしてそれが既存の答えとは異なるそれが貢献するもの。stackoverflow.com/help/how-to-answer
Simon.SAを

1
あなたの答えはBT(3年以上前に書かれた)と同じように見えますが、はるかに不十分に表現されています。
Quentin

-12

これはcss +を使用した私のソリューションです

まず、最初の子(flex-1)を100pxにする必要がある場合は、フレックスにしないでください。では、CSS +実際には、あなたは柔軟性および/または静的要素(行または列)を設定することができ、あなたの例では、このように簡単のようになります:

<div class="container">
  <div class="EXTENDER">
    <div class="COLS">
      <div class="CELL _100px" style="background-color:blue">100px</div>
      <div class="CELL _FLEX" style="background-color:red">flex</div>
    </div>
  </div>
</div>

コンテナーcss:

.container {
    height: 200px;
    width: 500px;
    position:relative;
}

そして明らかにCSS + 0.2コアを含みます

フィドルを聞く

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.