2017-06-10 15 views
2

this exampleに基づいて、ヘッダーとフッターの間に展開されるコンテンツを持つ単純なフレックスボックスレイアウトを設定しようとしています。適切なHTMLをページテンプレートに直接配置するとうまくいきますが、Reactコンポーネント内で全く同じHTMLをレンダリングすると失敗します。React.jsコンポーネント内で使用できない空き領域を埋めるためのFlexbox

<div class="box"> 
    <div class="header"> 
    <p><b>header</b></p> 
    </div> 
    <div class="content"> 
    <p> 
     <b>content</b> 
     (fills remaining space) 
    </p> 
    </div> 
    <div class="footer"> 
    <p><b>footer</b> (fixed height)</p> 
    </div> 
</div> 

マイstyle.cssは、すべてのケースでこれを次のとおりです:静的なHTMLを務めたときに素晴らしい作品

html, body { 
    height: 100%; 
} 

.box { 
    display: flex; 
    flex-flow: column; 
    height: 100%; 
} 

.header { 
    flex: 0 1 auto; 
} 

.content { 
    flex: 1 1 auto; 
} 

.footer { 
    flex: 0 1 40px; 
} 

はここで単純なHTMLです。私は、単一のrootのdivでちょうど空のページを提供し、このHTML使用リアクトと同じことをレンダリングする場合、私は同じことを取得する必要があります。

<div id="root"> 
</div> 

を、これはJS:

class Boxes extends React.Component { 

    render() { 
    return (
     <div className="box"> 
     <div className="header"> 
      <p><b>header</b></p> 
     </div> 
     <div className="content"> 
      <p> 
      <b>content</b> 
      (fills remaining space) 
      </p> 
     </div> 
     <div className="footer"> 
      <p><b>footer</b> (fixed height)</p> 
     </div> 
     </div> 
    ); 
    } 
} 

ReactDOM.render(
    React.createElement(Boxes, null), 
    document.getElementById('root') 
); 

しかしセンター「コンテンツ」ペインは、Reactでレンダリングするときに、利用可能な垂直スペースをいっぱいにしません。代わりに、コンテンツのサイズに合わせます。

これはChrome/MacのReact 15.4.2にあります。

+0

を私はあなたのコードをテストしたが、この作業ではありませんあなたは期待した? https://codesandbox.io/s/wmRnm5Y31 –

+0

予期したとおりに壊れています。内容は残りの垂直方向のスペースをすべて満たすはずです。 –

+0

ああ、見つけた!外側のルート要素の高さを100%に設定する必要があります。この場合、index.htmlは「

」 –

答えて

3

問題は、あなたにCSSがないラッパー<div id="root">があることです。あなたはルートが完全な高さに展開させる必要があり、その後、内側のdivが同様に展開されます:

#root { 
    height: 100%; 
} 
+0

うん、それは問題です! –

+0

フレックスボックスが深くネストされている場合、すべての親ディビットも高さ100%を持つ必要がありますか?達成するのは難しいかもしれません。 –

+1

必要ならばいつでも 'height:100vh'を使うことができます –

0

をあなたは試すことができます:{高さ:100VH}

関連する問題