2017-01-03 2 views
0

我々はHTML要素のこの設定で起動している場合:親コンテナ内のHTML子要素を自動的にストレッチして制約する方法はありますか?

enter image description here

...そして我々はこれを取得し、CSSのフレキシボックスを利用すると「体」の要素にflex-growプロパティを適用します。

enter image description here

これは、JavaScriptを必要とせずに純粋にCSSで行うことができることは素晴らしいことです。

ただし、親コンテナエレメントの高さを固定し、子エレメント(ヘッダー、本文、フッター)が親をオーバーフローしないようにしたいとします。

ヘッダー要素とフッター要素の内容は固定されていますが、本文の内容は動的(サーバー側またはクライアント側のどちらでもかまいません)で、コンテンツが取得されたときにbody要素に垂直スクロールバー、大きすぎるので、のように:しかし

enter image description here

、私は(純粋にCSSで(つまり、JavaScriptを使用せず)と、すべての子要素のための固定の高さを指定せずにその振る舞いを達成するための方法を見つけることができません望ましくない)。 (本文の内容が大きくなりすぎたとき)

は単純に、親の固定の高さで、この中に結果をflex-growプロパティを使用して:

enter image description here

は、純粋なCSSでそれを行うためにそこに方法は何ですか?

もしそうでなければ、フレックスボックス標準を拡張してこの種の動作をカプセル化する価値があると思いますか?

編集1

だから私のユースケースは、私が投稿するものに似ていますが、十分に異なるが、問題が隠され、したがって、私も最初に問題を抱えている理由として、いくつかの眉を上げているように場所。 LGSonの答えに拡大

が、これは私のユースケースである:

html, body { 
 
    margin: 0; 
 
} 
 
body { 
 
    display: flex; /* IE 11/10 min-height bug fix - or an extra wrapper in the markup */ 
 
} 
 
.wrapper { 
 
    display: flex; 
 
    flex-direction: column; 
 
    height: 100vh; 
 
    width: 100%; 
 
} 
 
.body { 
 
    flex: 1; 
 
} 
 

 
.content { 
 
    overflow: auto; 
 
} 
 

 

 
/* below CSS is just for the extra styling */ 
 
.wrapper { 
 
    height: calc(100vh - 44px); /* 2*2px border + 2*10px margin */ 
 
    width: calc(100% - 44px);  /* + 2*10px padding = 44px  */ 
 
    border: 2px dashed black; 
 
    margin: 10px; 
 
    padding: 10px; 
 
} 
 
.wrapper > div { 
 
    padding: 10px; 
 
} 
 
.header { 
 
    border: 2px solid blue; 
 
    margin-bottom: 10px; 
 
} 
 
.body { 
 
    border: 2px solid green; 
 
} 
 
.footer { 
 
    border: 2px solid red; 
 
    margin-top: 10px; 
 
}
<div class="wrapper"> 
 
    <div class="header"> 
 
    Header<br> 
 
    </div> 
 
    <div class="body"> 
 
    <h1> 
 
     Hello world! 
 
    </h1> 
 
    <div class="content"> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
    </div> 
 
    </div> 
 
    <div class="footer"> 
 
    Footer<br> 
 
    </div> 
 
</div>

だから私は実際には、階層内の別のレベルを持っていたと私はあまりにも深くoverflowプロパティ1つのレベルを持っていました。

私にはそれがあった場所は論理的だと思われますが、答え/例から構築することは、私の使用事例からでもレベルを上げて動かすことができます(私の意見では直観に反する)。

なぜそれがうまくいくのか理解できますが、スクロールバーは内容の部分だけでなく全身の要素にまたがると思います。

ご迷惑をおかけして申し訳ありません。

ありがとうございました。

編集2

私は正しい答えで、(最初の編集で)私の明確化を組み込んだ、自分の答えを変更(または新規作成)する最初の人に報酬を与えるでしょう。

+1

あなたは私がI /誰かが –

+0

簡単にCSS何か行うことができます確信しているjsfiddle作成する場合: 'ボディ{分、高さ:100VHを}'。現在のブラウザのバージョン(古いものではない)でのみ動作します。これは、デフォルトのページを少なくともフルスクリーンの高さにします。 ( '100vh'はビューポートの高さの100%を意味し、' min-height'はまだ大きくなることを意味します) –

+0

https://jsfiddle.net/ppa61v5u/で何が問題なのか分かりません。 – Zak

答えて

2

このサンプルでは、​​あなたが子供に固定されていない高さで、尋ねません。

フルダイナミック.header.footer.bodyは、必要に応じてスクロールするので、すべて親の内部にある.wrapperのままです。

スクロールに関しては、オーバーフローを引き起こす可能性のある要素ではなく、スクロールしたい要素にオーバーフローを与えます。

html, body { 
 
    margin: 0; 
 
} 
 
body { 
 
    display: flex; /* IE 11/10 min-height bug fix - or an extra wrapper in the markup */ 
 
} 
 
.wrapper { 
 
    display: flex; 
 
    flex-direction: column; 
 
    height: 100vh; 
 
    width: 100%; 
 
} 
 
.body { 
 
    flex: 1; 
 
    overflow: auto; 
 
} 
 

 

 
/* below CSS is just for the extra styling */ 
 
.wrapper { 
 
    height: calc(100vh - 44px); /* 2*2px border + 2*10px margin */ 
 
    width: calc(100% - 44px);  /* + 2*10px padding = 44px  */ 
 
    border: 2px dashed black; 
 
    margin: 10px; 
 
    padding: 10px; 
 
} 
 
.wrapper > div { 
 
    padding: 10px; 
 
} 
 
.header { 
 
    border: 2px solid blue; 
 
    margin-bottom: 10px; 
 
} 
 
.body { 
 
    border: 2px solid green; 
 
} 
 
.footer { 
 
    border: 2px solid red; 
 
    margin-top: 10px; 
 
}
<div class="wrapper"> 
 
    <div class="header"> 
 
    Header<br> 
 
    </div> 
 
    <div class="body"> 
 
    <h1> 
 
     Hello world! 
 
    </h1> 
 
    <div class="content"> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
    </div> 
 
    </div> 
 
    <div class="footer"> 
 
    Footer<br> 
 
    </div> 
 
</div>


あなたの代わりに実際のHTML body、ない.bodyクラスを持つ要素を意味する場合は、全体要素を言い、その後にmin-heightを使用.wrapperを入力し、.bodyからオーバーフローを削除します。

それはフレキシボックスはまさにそれを行い、デフォルトで

html, body { 
 
    margin: 0; 
 
} 
 
body { 
 
    display: flex; /* IE 11/10 min-height bug fix - or an extra wrapper in the markup */ 
 
} 
 
.wrapper { 
 
    display: flex; 
 
    flex-direction: column; 
 
    min-height: 100vh; 
 
    width: 100%; 
 
} 
 
.body { 
 
    flex: 1; 
 
} 
 

 

 
/* below CSS is just for the extra styling */ 
 
.wrapper { 
 
    min-height: calc(100vh - 44px); /* 2*2px border + 2*10px margin */ 
 
    width: calc(100% - 44px);  /* + 2*10px padding = 44px  */ 
 
    border: 2px dashed black; 
 
    margin: 10px; 
 
    padding: 10px; 
 
} 
 
.wrapper > div { 
 
    padding: 10px; 
 
} 
 
.header { 
 
    border: 2px solid blue; 
 
    margin-bottom: 10px; 
 
} 
 
.body { 
 
    border: 2px solid green; 
 
} 
 
.footer { 
 
    border: 2px solid red; 
 
    margin-top: 10px; 
 
}
<div class="wrapper"> 
 
    <div class="header"> 
 
    Header<br> 
 
    </div> 
 
    <div class="body"> 
 
    <h1> 
 
     Hello world! 
 
    </h1> 
 
    <div class="content"> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
     Content<br> Content<br> 
 
    </div> 
 
    </div> 
 
    <div class="footer"> 
 
    Footer<br> 
 
    </div> 
 
</div>

1

ここには、あなたの要件を考慮した、最小のCSSを持つバージョンがあります。 flexboxを使用して

* { margin: 0; padding: 0; } 
 
html,body { 
 
    max-height: 100%; 
 
    height: 100%; 
 
    } 
 
#header { 
 
    border: 2px solid blue; 
 
    color: blue; 
 
    height: 4em; 
 
    margin-bottom: .5em; 
 
    } 
 
#content { 
 
    border: 2px solid green; 
 
    color: green; 
 
    height: calc(100vh - 10em); 
 
    margin-bottom: .5em; 
 
    overflow-y: scroll; 
 
    } 
 
#footer { 
 
    border: 2px solid red; 
 
    color: red; 
 
    height: 4em; 
 
    }
<body> 
 
    <div id="header">This is the header</div> 
 
    <div id="content"><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </p> 
 

 
<p>Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. Quisque volutpat condimentum velit. </p> 
 

 
<p>Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. Proin quam. Etiam ultrices. Suspendisse in justo eu magna luctus suscipit. Sed lectus. Integer euismod lacus luctus magna. </p> 
 

 
<p>Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. </p> 
 

 
<p>Integer lacinia sollicitudin massa. Cras metus. Sed aliquet risus a tortor. Integer id quam. Morbi mi. Quisque nisl felis, venenatis tristique, dignissim in, ultrices sit amet, augue. Proin sodales libero eget ante. Nulla quam. Aenean laoreet. Vestibulum nisi lectus, commodo ac, facilisis ac, ultricies eu, pede. Ut orci risus, accumsan porttitor, cursus quis, aliquet eget, justo. Sed pretium blandit orci. </p> 
 

 
<p>Ut eu diam at pede suscipit sodales. Aenean lectus elit, fermentum non, convallis id, sagittis at, neque. Nullam mauris orci, aliquet et, iaculis et, viverra vitae, ligula. Nulla ut felis in purus aliquam imperdiet. Maecenas aliquet mollis lectus. Vivamus consectetuer risus et tortor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. </p> 
 

 
<p>Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sodales ligula in libero. Sed dignissim lacinia nunc. Curabitur tortor. Pellentesque nibh. Aenean quam. In scelerisque sem at dolor. Maecenas mattis. Sed convallis tristique sem. Proin ut ligula vel nunc egestas porttitor. </p> 
 

 
<p>Morbi lectus risus, iaculis vel, suscipit quis, luctus non, massa. Fusce ac turpis quis ligula lacinia aliquet. Mauris ipsum. Nulla metus metus, ullamcorper vel, tincidunt sed, euismod in, nibh. Quisque volutpat condimentum velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nam nec ante. Sed lacinia, urna non tincidunt mattis, tortor neque adipiscing diam, a cursus ipsum ante quis turpis. Nulla facilisi. Ut fringilla. Suspendisse potenti. Nunc feugiat mi a tellus consequat imperdiet. Vestibulum sapien. </p> 
 

 
<p>Proin quam. Etiam ultrices. Suspendisse in justo eu magna luctus suscipit. Sed lectus. Integer euismod lacus luctus magna. Quisque cursus, metus vitae pharetra auctor, sem massa mattis sem, at interdum magna augue eget diam. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi lacinia molestie dui. Praesent blandit dolor. Sed non quam. In vel mi sit amet augue congue elementum. Morbi in ipsum sit amet pede facilisis laoreet. </p> 
 

 
<p>Donec lacus nunc, viverra nec, blandit vel, egestas et, augue. Vestibulum tincidunt malesuada tellus. Ut ultrices ultrices enim. Curabitur sit amet mauris. Morbi in dui quis est pulvinar ullamcorper. Nulla facilisi. Integer lacinia sollicitudin massa. Cras metus. Sed aliquet risus a tortor. Integer id quam. Morbi mi. </p> 
 

 
</div> 
 
    <div id="footer">This is the footer</div> 
 
</body>

0

をスクロールすると、それが必要ではないですけれどもあなたは、HTML body要素にオーバーフローを設定することができます..あなたが削除することを忘れてしまったことでした。体のデフォルトマージン?

.wrapper { 
 
    height: 100vh; 
 
    display: flex; 
 
    flex-direction: column; 
 
} 
 

 
body { 
 
    margin: 0; 
 
} 
 

 
header, footer { 
 
    background: grey; 
 
    flex-basis: 50px; 
 
} 
 

 
section.grow { 
 
    flex-grow: 1; 
 
}
<div class="wrapper"> 
 
    <header></header> 
 
    <section class="grow"></section> 
 
    <footer></footer> 
 
</div>

+0

マージンと何も関係ありません。答えには 'overflow'プロパティは含まれていません。 – pleasedesktop

関連する問題