残りの画面スペースの高さをdivで埋める


1910

コンテンツを画面全体の高さいっぱいにしたいWebアプリケーションに取り組んでいます。

このページには、ロゴを含むヘッダーとアカウント情報があります。これは任意の高さになる可能性があります。content divでページの残りの部分を一番下まで埋めてほしい。

ヘッダーdivとコンテンツがありdivます。現時点では、次のようなレイアウトにテーブルを使用しています。

CSSとHTML

#page {
    height: 100%; width: 100%
}

#tdcontent {
    height: 100%;
}

#content {
    overflow: auto; /* or overflow: hidden; */
}
<table id="page">
    <tr>
        <td id="tdheader">
            <div id="header">...</div>
        </td>
    </tr>
    <tr>
        <td id="tdcontent">
            <div id="content">...</div>
        </td>
    </tr>
</table>

ページの高さ全体が埋められ、スクロールは必要ありません。

content divの内部では、設定top: 0;によりヘッダーのすぐ下に配置されます。コンテンツは、高さが100%に設定された実際のテーブルになる場合があります。header内部contentに置くと、これは機能しません。

を使用せずに同じ効果を達成する方法はありtableますか?

更新:

コンテンツ内の要素のdiv高さもパーセントに設定されます。したがって、内部に100%の何かがあると、divそれが底まで満たされます。2つの要素が50%になります。

アップデート2:

たとえば、ヘッダーが画面の高さの20%を占める場合、内部で50%に指定されたテーブル#contentは画面スペースの40%を占めます。これまでのところ、機能するのはテーブル全体をラップすることだけです。


31
将来ここでつまずく人のために、display:tableと関連するプロパティを使用して、テーブルマークアップなしで、ほとんどのブラウザで目的のテーブルレイアウトを取得できます。非常に類似した質問に対するこの回答を参照してください。
AmeliaBR 2014年

3
-私はあなたのセットアップrecereateしようとしましたjsfiddle.net/ceELsを -しかし、そのは動作していない、何が私が逃したのですか?
Gill Bates

5
@氏。エイリアンの答えはシンプルで便利です。http://stackoverflow.com/a/23323175/188784
Gohan

4
実際には、表を使用しても、説明した内容は機能しません。コンテンツが画面の高さよりも垂直方向のスペースを大きく取ると、表のセルと表全体が画面の下部を超えて拡大します。コンテンツのoverflow:autoはスクロールバーを表示しません。
ダミアン2014

あなたがで親要素の外観の高さを指定した後、それが動作します@GillBates jsfiddle.net/ceELs/5を
ミハルVašut

回答:


1113

2015年の更新:フレックスボックスアプローチ

flexboxについて簡単に述べた他の2つの答えがあります。しかし、それは2年以上前のことであり、それらは例を提供していません。フレックスボックスの仕様は間違いなく確定しました。

注:CSSフレキシブルボックスレイアウト仕様は勧告候補段階にありますが、すべてのブラウザーで実装されているわけではありません。WebKit実装の前には-webkit-を付ける必要があります。Internet Explorerは、-ms-が前に付いた古いバージョンの仕様を実装しています。Opera 12.10は、接頭辞なしの最新バージョンの仕様を実装しています。最新の互換性ステータスについては、各プロパティの互換性表を参照してください。

https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Flexible_boxesから取得)

すべての主要なブラウザとIE11 +がFlexboxをサポートしています。IE 10以前では、FlexieJS shimを使用できます。

現在のサポートを確認するには、こちらもご覧ください:http : //caniuse.com/#feat=flexbox

実施例

フレックスボックスを使用すると、固定サイズ、コンテンツサイズのサイズ、または残りスペースのサイズの行または列を簡単に切り替えることができます。私の例では、ヘッダーをそのコンテンツにスナップするように設定しました(OPの質問に従って)、フッターを追加して固定高さの領域を追加する方法を示し、コンテンツ領域を設定して残りのスペースを埋めます。

html,
body {
  height: 100%;
  margin: 0;
}

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

.box .row {
  border: 1px dotted grey;
}

.box .row.header {
  flex: 0 1 auto;
  /* The above is shorthand for:
  flex-grow: 0,
  flex-shrink: 1,
  flex-basis: auto
  */
}

.box .row.content {
  flex: 1 1 auto;
}

.box .row.footer {
  flex: 0 1 40px;
}
<!-- Obviously, you could use HTML5 tags like `header`, `footer` and `section` -->

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

上記のCSSでは、flexプロパティはflex-growflex-shrink、およびflex-basisプロパティを省略して、フレックスアイテムの柔軟性を確立します。Mozillaは、フレキシブルボックスモデルを紹介しています。


9
すべてのdivでオーバーライドさflex: 0 1 30px;box .rowているため、なぜ属性が含まれるのですか?
Erdal G.

11
これがflexboxのブラウザサポートです。すべての緑が表示されて嬉しいです-caniuse.com/#feat=flexbox
Brian Burns

1
Flexie.jsへのリンクは無効です。ここでgithubプロジェクトgithub.com/doctyper/flexie
ses3ion

52
間違いなく、これは非常に優れたアプローチであり、ほとんど機能します;)div.contentのコンテンツが元のflex-edの高さを超えると、小さな問題が発生します。現在の実装では、「フッター」は低くなり、これは開発者が期待するものではありません;)そのため、私は非常に簡単な修正を行いました。jsfiddle.net/przemcio/xLhLuzf9/3コンテナとオーバーフロースクロールに追加フレックスを追加しました。
przemcio

12
@przemcioいい点ですが、スクロール可能なコンテンツを持つことはすべての開発者が期待することだとは思いません;)— ただし、必要なことを達成するために追加overflow-y: autoする必要があるだけです.row.content
Pebbl 2016年

226

CSSでこれを行うための健全なブラウザ間での方法は実際にはありません。レイアウトが複雑であると仮定すると、JavaScriptを使用して要素の高さを設定する必要があります。あなたがする必要があるの本質は:

Element Height = Viewport height - element.offset.top - desired bottom margin

この値を取得して要素の高さを設定できたら、ウィンドウのonloadとonresizeの両方にイベントハンドラーをアタッチして、サイズ変更関数を起動できるようにする必要があります。

また、コンテンツがビューポートよりも大きくなる可能性がある場合は、overflow-yをスクロールに設定する必要があります。


2
それは私が疑ったものです。ただし、アプリはJavascriptをオフにしても動作するため、テーブルを使い続けると思います。
ヴィンセントマクナブ

6
ヴィンセント、あなたの立場を立てる方法。私はまったく同じことをしようとしていましたが、CSSでは不可能だと思われますか?確かではありませんが、他の多くの解決策のどれもあなたが説明したことを実行しません。この時点で正しく機能するのは、javascriptのみです。
トラビス

5
ウィンドウの高さが変化した場合
Techsin 2013年

4
つまり、なぜ2013年にcalcを使用しないのですか?
kamii 14

4
高さ:calc(100vh-400px); この投稿の内容を正確に実行する有効なCSSスタイルです。他のすべてのソリューションは、親の高さまたはブロック表示を固定することに依存しています。
WilliamX 2018年

167

元の投稿は3年以上前です。私のようにこの投稿にアクセスする多くの人々は、アプリのようなレイアウトソリューションを探していると思います。もしそうなら、この投稿は役立つかもしれません、それはIE7 +などで動作します

http://blog.stevensanderson.com/2011/10/05/full-height-app-layouts-a-css-trick-to-make-it-easier/

そして、ここにその投稿からのいくつかのスニペットがあります:

@media screen { 
  
  /* start of screen rules. */ 
  
  /* Generic pane rules */
  body { margin: 0 }
  .row, .col { overflow: hidden; position: absolute; }
  .row { left: 0; right: 0; }
  .col { top: 0; bottom: 0; }
  .scroll-x { overflow-x: auto; }
  .scroll-y { overflow-y: auto; }

  .header.row { height: 75px; top: 0; }
  .body.row { top: 75px; bottom: 50px; }
  .footer.row { height: 50px; bottom: 0; }
  
  /* end of screen rules. */ 
}
<div class="header row" style="background:yellow;">
    <h2>My header</h2>
</div> 
<div class="body row scroll-y" style="background:lightblue;">
    <p>The body</p>
</div> 
<div class="footer row" style="background:#e9e9e9;">
    My footer
</div>


74
これにはただ1つの問題があります。ヘッダーとフッターが自動サイズ調整されません。それが本当の難しさであり、それが現在「これは不可能である」という答えが一番上にある
理由

55pxのヘッダーと、ドキュメントの残りの高さを埋めるdivが必要でした。これが解決策です!
マティアスCánepa

あなたは爆弾です。私はこれを長い間試してきましたが、これが私が見つけた唯一の解決策です。nav要素の上部の高さを60pxにし、残りを100%にする必要がありましたが、これで解決しました。
アダムウェイト2013年

これは、私がわずかな問題を抱えていることを除いてうまくいきます-要素をdisplay: tableボディに入れると、ボディからオーバーフローするようです。そのheight: 100%ため、正しい高さが生成されません。
GSTAR 2014年

4
.col使われていませんか?
slartidan 2015年

143

マークアップでテーブルを使用する代わりに、CSSテーブルを使用できます。

マークアップ

<body>    
    <div>hello </div>
    <div>there</div>
</body>

(関連)CSS

body
{
    display:table;
    width:100%;
}
div
{
    display:table-row;
}
div+ div
{
    height:100%;  
}

FIDDLE1および FIDDLE2

この方法のいくつかの利点は次のとおりです。

1)マークアップの削減

2)マークアップは表形式のデータではないため、テーブルよりもセマンティックです。

3)ブラウザーサポートは非常に優れています:IE8 +、すべての最新のブラウザーとモバイルデバイス(カニウス


完全を期すために、CSSテーブルモデルの cssプロパティと同等のHtml要素を以下に示します。

table    { display: table }
tr       { display: table-row }
thead    { display: table-header-group }
tbody    { display: table-row-group }
tfoot    { display: table-footer-group }
col      { display: table-column }
colgroup { display: table-column-group }
td, th   { display: table-cell }
caption  { display: table-caption } 

3
私はCSSテーブルのテクニックを指摘されまし。回答はすでにこの回答済みの質問にすでに含まれていることが判明しました。これは、最善の解決策。クリーンでエレガント、正確なツールを意図したとおりに使用する。CSSテーブル
Ian Boyd

フィドルコードは、ここでの答えと完全には一致しません。html, body { height: 100%, width: 100% }テストでは、追加することが重要だと思われました。
mlibby 2013年

8
CSSテーブルの迷惑な機能は、通常のテーブルとまったく同じです。コンテンツが大きすぎると、セルが拡大されて収まります。これは、サイズを制限する(max-height)か、ページが動的な場合はコードから高さを設定する必要があることを意味します。Silverlightグリッドが本当に恋しいです!:(
Gone Coding

3
常に絶対位置のコンテナをテーブル行要素内に追加し、その幅と高さを100%に設定できます。table-row要素でも位置を相対的に設定することを忘れないでください。
Mike Mellor 2016年

1
@MikeMellorはIE11では機能しませんが、要素のrelative配置を無視しているように見えるためtable-row、テーブル要素ではない最初に配置された上位の高さを取得します。
2016

96

CSSのみのアプローチ(高さがわかっている/固定されている場合)

中央の要素をページ全体に垂直に広げたい場合は、 calc()に広げは、CSS3で導入された。

高さ headerfooter要素が固定されていて、sectionタグで利用可能な垂直方向の高さ全体を取得したいとします...

デモ

想定されるマークアップとCSSは

html,
body {
  height: 100%;
}

header {
  height: 100px;
  background: grey;
}

section {
  height: calc(100% - (100px + 150px));
  /* Adding 100px of header and 150px of footer */
  background: tomato;
}

footer {
  height: 150px;
  background-color: blue;
}
<header>100px</header>
<section>Expand me for remaining space</section>
<footer>150px</footer>

したがって、ここでは、要素の高さを合計し、100%使用から差し引くのではなく、calc()関数のます。

height: 100%;親要素に使用することを確認してください。


13
OPによると、ヘッダーは任意の高さにすることができます。したがって、事前に高さがわからない場合は、calc :(
Danield

1
@Danieldそれが私が固定高さについて言及した理由です:)
エイリアン氏

3
これは私にとって有効なソリューションであり、フレックスボックスの周りにある既存のページを再設計する必要がありませんでした。LESS、すなわちBootstrapを使用している場合は、calc()関数をエスケープしてLESSが処理しないようにする方法に関するcoderwallの投稿を確認してください。
jlyonsmith 2015

1
Opは、「これは任意の高さになる可能性がある」と述べました。任意の手段は、設計者によって決定されたため、修正されました。このソリューションは断然最高です。
jck '25

57

中古: height: calc(100vh - 110px);

コード:

  
.header { height: 60px; top: 0; background-color: green}
.body {
    height: calc(100vh - 110px); /*50+60*/
    background-color: gray;
}
.footer { height: 50px; bottom: 0; }
  
<div class="header">
    <h2>My header</h2>
</div> 
<div class="body">
    <p>The body</p>
</div> 
<div class="footer">
    My footer
</div>


1
私の意見では、最もクリーンなソリューションです。確かに、JavaScriptを追加するよりはましです。(しかし、答えはすでに2015年に誰かによって投稿されました)
bvdb '22

これはずっときれいに感じます。
プログラマー

44

flexboxを使用した簡単なソリューション:

html,
body {
  height: 100%;
}

body {
  display: flex;
  flex-direction: column;
}

.content {
  flex-grow: 1;
}
<body>
  <div>header</div>
  <div class="content"></div>
</body>

Codepenサンプル

divがコンテンツdivの中央に配置される代替ソリューション


4
これは確かに最良の答えです。hero-imgホームページの魅力のような作品、またはhero-imgとナビゲーションバーの組み合わせ
noobcoderiam

jsfiddle.net/31ng75du/5 Chrome、FF、Edge、Vivaldiでテスト
user2360831

これはシンプルで最高です。
Dev Anand

38

どのように単に使用についてvhの略view heightCSS ...

以下で作成したコードスニペットを見て実行します。

body {
  padding: 0;
  margin: 0;
}

.full-height {
  width: 100px;
  height: 100vh;
  background: red;
}
<div class="full-height">
</div>

また、私があなたのために作成した下の画像を見てください:

残りの画面スペースの高さをdivで埋める


10
これは、divをウィンドウの高さ全体に広げたい場合にのみ有効です。ヘッダーdivをその上に配置し、高さが不明です。
LarryBud 2018年

@LarryBud正解です。これによりラッパーdivが作成されるため、すべてがこのdiv内に入るはずです
Alireza

34

CSS3シンプルな方法

height: calc(100% - 10px); // 10px is height of your first div...

最近のすべての主要なブラウザーがそれをサポートしているので、ヴィンテージのブラウザーをサポートする必要がない場合は先に進んでください。


4
これは、他の要素の高さがわからない場合(たとえば、要素に可変数の子要素が含まれている場合)は機能しません。
Ege Ersoz

100vhを使用することもできます。これを行う場合は、マイナスと要素の間にスペースを入れてください
htafoya

28

それは純粋に次をCSS使用することによって行うことができますvh

#page {
    display:block; 
    width:100%; 
    height:95vh !important; 
    overflow:hidden;
}

#tdcontent {
    float:left; 
    width:100%; 
    display:block;
}

#content {      
    float:left; 
    width:100%; 
    height:100%; 
    display:block; 
    overflow:scroll;
}

そしてその HTML

<div id="page">

   <div id="tdcontent"></div>
   <div id="content"></div>

</div>

私はそれをチェックしました、それはすべての主要なブラウザで動作します:ChromeIEし、FireFox


2
うわー、聞いたことがないvhvw前のユニット。詳細:snook.ca/archives/html_and_css/vm-vh-units
スティーブベネット

残念ながら、これはIE8をサポートしていません:(
Scott

2
私はこの方法を試しheight: 100%ました#contentが、の高さがの高さに一致し、の高さは完全に#page無視#tdcontentされました。大量のコンテンツがある場合、スクロールバーはページの下部を超えて広がります。
ブランドン

28

コンテンツが高すぎるときに下部のdivをスクロールする必要がある場合、投稿されたソリューションはどれも機能しません。その場合に機能するソリューションは次のとおりです。

.table {
  display: table;
}

.table-row {
  display: table-row;
}

.table-cell {
  display: table-cell;
}

.container {
  width: 400px;
  height: 300px;
}

.header {
  background: cyan;
}

.body {
  background: yellow;
  height: 100%;
}

.body-content-outer-wrapper {
  height: 100%;
}

.body-content-inner-wrapper {
  height: 100%;
  position: relative;
  overflow: auto;
}

.body-content {
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}
<div class="table container">
  <div class="table-row header">
    <div>This is the header whose height is unknown</div>
    <div>This is the header whose height is unknown</div>
    <div>This is the header whose height is unknown</div>
  </div>
  <div class="table-row body">
    <div class="table-cell body-content-outer-wrapper">
      <div class="body-content-inner-wrapper">
        <div class="body-content">
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
          <div>This is the scrollable content whose height is unknown</div>
        </div>
      </div>
    </div>
  </div>
</div>

元のソース:CSSでオーバーフローを処理しながらコンテナーの残りの高さを埋める

JSFiddleライブプレビュー


ありがとうございました!!!テーブルやフレックスボックス以外のすべての回答を試しましたが、100%正しく機能したのはこれだけです。1つの質問:元のソースにはのみがありbody-content-wrapper、ダブルラッパーなし(table-cells なし)では問題なく動作するようです。その方法でそれを行うことに問題がありますか?
ブランドン

1
@BrandonMinternテーブルセルがない場合、IE8およびIE9では機能しません。(元の記事のコメントを参照してください。)
John Kurlak

はい、IE10でもセルが必要です。残念ながら、IE10以前では、.body高さはに設定された高さと同じになり.containerます。垂直スクロールバーはまだ適切な場所にありますが、.container最終的に必要以上に大きくなります。全画面表示の場合.body、画面下部が画面下部に表示されます。
Brandon

ありがとう、@ JohnKurlak。これが私の状況で機能した唯一のソリューションです(フレックスボックスの方法は、クライアントが使用しているChromeの特定のバージョンのバグのある動作によってブロックされました)
Maksym Demidas

聖なる****!私は長い間この答えを探していました!どうもありがとうございます。Flexboxはここでは機能しませんでしたが、テーブルセルは実際に機能しました。すごい。
aabbccsmith

25

私もこれに対する答えを探していました。IE8以上をターゲットにできる幸運な場合は、display:tableおよび関連する値を使用して、divを含むブロックレベルの要素を持つテーブルのレンダリングルールを取得できます。

さらに幸運で、ユーザーがトップ層のブラウザーを使用している場合(たとえば、これが私の制御するコンピューター上のイントラネットアプリである場合、私の最新のプロジェクトのように)、CSS3の新しいフレキシブルボックスレイアウトを使用できます!


22

(divが別のdiv内にあり、他のすべての状況で私が想定している)私にとってうまくいったのは、下のパディングを100%に設定することです。つまり、これをcss /スタイルシートに追加します。

padding-bottom: 100%;

14
何の100%?これを試してみると、巨大な空白が表示され、スクロールが発生し始めます。
mlibby 2013年

ビューポートサイズの100%はおそらく@mlibbyです。htmlとbodyも100%の高さに設定すると、divは100%になります。divが1つだけの場合、100%はdivコンテンツに対して相対的になります。ネストされたdivでは試しませんでした。
Jess

1
これは、要素の高さ(要素のパディングとして追加)の100%を意味し、高さを2倍にします。それがページを埋める保証はなく、質問への答えは間違いありません。すでに気づいているように、実際にはビューポートよりも多くを埋めることができます。
マーティン

2
padding-bottom:100%は高さ+親コンテナーの幅の
Romeno

1
from w3school:要素の幅のパーセントで下パディングを指定します。w3schools.com/cssref/pr_padding-bottom.asp
mehdi.loa

21

免責事項:受け入れられた答えは解決策のアイデアを与えますが、私はそれが不必要なラッパーとcssルールで少し肥大化しているのを見つけています。以下は、CSSルールが非常に少ないソリューションです。

HTML 5

<body>
    <header>Header with an arbitrary height</header>
    <main>
        This container will grow so as to take the remaining height
    </main>
</body>

CSS

body {
  display: flex;
  flex-direction: column;
  min-height: 100vh;       /* body takes whole viewport's height */
}

main {
  flex: 1;                 /* this will make the container take the free space */
}

上記のソリューションでは、ビューポートユニットフレックスボックスを使用していますを使用しているため、IE10 +であり、IE10の古い構文を使用できます。

Codepenで遊ぶ:codepenへのリンク

または、これは、コンテンツがオーバーフローした場合にメインコンテナをスクロール可能にする必要がある場合:codepenへのリンク


メイン{高さ:10px; フレックス:1; オーバーフロー:自動}
Naeem Baghi

2
時間を無駄にしていくつかのアプローチをテストした後、これが最高でした!簡潔でシンプル、かつスマートです。
marciowb

19

今はたくさんの答えがありますが、私は height: 100vh;は山ほどありますが、垂直方向の利用可能なスペース全体を埋める必要のあるdiv要素の作業にしている。

このようにして、表示や配置をいじる必要がありません。これは、Bootstrapを使用して、サイドバーとメインがあるダッシュボードを作成するときに役立ちました。メインが縦のスペース全体を引き伸ばして塗りつぶし、背景色を適用できるようにしました。

div {
    height: 100vh;
}

IE9以上をサポート:クリックしてリンクを表示


14
しかし、100vhは残りの高さではなく、すべての高さのように聞こえます。ヘッダーがあり、残りを埋めたい場合
Epirocks

14
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test</title>
<style type="text/css">
body
,html
{
    height: 100%;
    margin: 0;
    padding: 0;
    color: #FFF;
}

#header
{
    float: left;
    width: 100%;
    background: red;
}

#content
{
    height: 100%;
    overflow: auto;
    background: blue;
}

</style>
</head>
<body>

    <div id="content">
        <div id="header">
                Header
                <p>Header stuff</p>
        </div>
            Content
            <p>Content stuff</p>
    </div>

</body>
</html>

すべての正常なブラウザーでは、兄弟としてコンテンツの前に「ヘッダー」divを置くことができ、同じCSSが機能します。ただし、その場合、フロートが100%の場合、IE7-は高さを正しく解釈しないため、上記のようにヘッダーをコンテンツに含める必要があります。overflow:autoはIEでダブルスクロールバーを発生させます(常にビューポートスクロールバーが表示されますが、無効になっています)がなければ、コンテンツはオーバーフローするとクリップします。


閉じる!私が欲しいものはほぼ何でも、他のものをdiv...に配置するつもりです...つまりtop: 0;、ヘッダーのすぐ下に何かを置きます。私はもう一度質問を変更します。あなたが完全に答えたので、それでも私が望むものではないからです!コンテンツが収まるように、オーバーフローを非表示にします。
ヴィンセントマクナブ

-1:この答えは、画面全体をカバーするコンテンツと呼ばれるdivを作成します。 、残りの画面のを
Casebash

11

私はしばらくこれに取り組み、次のようになりました:

コンテンツDIVを親と同じ高さにするのは簡単ですが、親の高さからヘッダーの高さを差し引くのは明らかに難しいので、コンテンツdivを全高にして、左上隅に完全に配置し、パディングを定義することにしました。ヘッダーの高さを持つトップ用。このように、コンテンツはヘッダーの下にきちんと表示され、残りのスペース全体を埋めます。

body {
    padding: 0;
    margin: 0;
    height: 100%;
    overflow: hidden;
}

#header {
    position: absolute;
    top: 0;
    left: 0;
    height: 50px;
}

#content {
    position: absolute;
    top: 0;
    left: 0;
    padding-top: 50px;
    height: 100%;
}

15
ヘッダーの高さがわからない場合はどうなりますか?
Yugal Jindle 2013年

11

古いブラウザー(つまり、MSIE 9以前)をサポートしていないことに対処できる場合は、フレキシブルボックスレイアウトモジュールでこれを行うことができます。すでにW3C CRであるを。このモジュールでは、コンテンツの並べ替えなど、その他の素晴らしいテクニックも使用できます。

残念ながら、MSIE 9以下はこれをサポートしておらず、Firefox以外のすべてのブラウザーのCSSプロパティにベンダープレフィックスを使用する必要があります。うまくいけば、他のベンダーもすぐにプレフィックスを削除します。

もう1つの選択肢はCSSグリッドレイアウトですが、ブラウザーの安定バージョンではサポートがさらに少なくなります。実際には、MSIE 10のみがこれをサポートしています。

2020年の更新:すべての最新ブラウザーはdisplay: flexおよびの両方をサポートしdisplay: gridます。不足しているのはsubgrid、Firefoxでのみサポートされているサポートだけです。MSIEはどちらの仕様もサポートしていませんが、MSIE固有のCSSハックを追加する場合は、動作させることができます。MSIEはもう使用すべきではないとマイクロソフトが言っているので、単にMSIEを無視することをお勧めします。


10

CSSグリッドソリューション

bodywith display:gridgrid-template-rowsusing autofrvalueプロパティを定義するだけです。

* {
  margin: 0;
  padding: 0;
}

html {
  height: 100%;
}

body {
  min-height: 100%;
  display: grid;
  grid-template-rows: auto 1fr auto;
}

header {
  padding: 1em;
  background: pink;
}

main {
  padding: 1em;
  background: lightblue;
}

footer {
  padding: 2em;
  background: lightgreen;
}

main:hover {
  height: 2000px;
  /* demos expansion of center element */
}
<header>HEADER</header>
<main>MAIN</main>
<footer>FOOTER</footer>

グリッドの完全ガイド@ CSS-Tricks.com


9

どうしてこれだけじゃないの?

html, body {
    height: 100%;
}

#containerInput {
    background-image: url('../img/edit_bg.jpg');
    height: 40%;
}

#containerControl {
    background-image: url('../img/control_bg.jpg');
    height: 60%;
}

htmlとbodyを(この順序で)高さを指定して、要素の高さを指定しますか?

私のために働く


重要なのは、ユーザーが大画面を使用してこのページを確認し、ヘッダーの高さが100pxに正確に固定されており、現在の高さの40%未満である場合、ヘッダーと本文のコンテキストの間に大きな空白のギャップが生じることです。
Saorikido

8

を実際に使用display: tableして、領域を2つの要素(ヘッダーとコンテンツ)に分割できます。ヘッダーの高さはさまざまで、コンテンツは残りのスペースを埋めます。ページ全体でこれは作品だけでなく、面積は単純に位置する他の要素の内容であるpositionにセットrelativeabsoluteまたはfixed。親要素の高さが0でない限り、機能します。

このフィドルと以下のコードも参照してください

CSS:

body, html {
    height: 100%;
    margin: 0;
    padding: 0;
}

p {
    margin: 0;
    padding: 0;
}

.additional-padding {
    height: 50px;
    background-color: #DE9;
}

.as-table {
    display: table;
    height: 100%;
    width: 100%;
}

.as-table-row {
    display: table-row;
    height: 100%;
}

#content {
    width: 100%;
    height: 100%;
    background-color: #33DD44;
}

HTML:

<div class="as-table">
    <div id="header">
        <p>This header can vary in height, it also doesn't have to be displayed as table-row. It will simply take the necessary space and the rest below will be taken by the second div which is displayed as table-row. Now adding some copy to artificially expand the header.</p>
        <div class="additional-padding"></div>
    </div>
    <div class="as-table-row">
        <div id="content">
            <p>This is the actual content that takes the rest of the available space.</p>
        </div>
    </div>
</div>

2
私が賛成しましたが、残念ながらIE8ではうまくいきません。これはまだ長い間存在します。
Vincent McNabb 2013

Gmailのようなアプリケーションは、サイジングにJavaScriptを使用します。これは、ほとんどの場合、CSSよりも優れたソリューションです。
Vincent McNabb 2013

私は彼らがJavaScriptを使用していると思います。他の優れたクロスブラウザCSSソリューションがなく、それが優れているからではありません。
グレッグ

1
@VincentMcNabbはIE8 w3schools.com/cssref/pr_class_display.aspで動作します。!DOCTYPE宣言が必要です。表示属性のテーブル値についてさえ知らなかった。クールなソリューション。+1
Govind Rai

8
 style="height:100vh"

私のために問題を解決しました。私の場合、これを必要なdivに適用しました


6

ヴィンセント、私はあなたの新しい要件を使用してもう一度答えます。コンテンツが長すぎる場合でも、コンテンツが非表示になることを気にする必要がないため、ヘッダーをフロートさせる必要はありません。htmlタグとbodyタグにオーバーフローを隠し、#content高さを100%に設定するだけです。コンテンツは常にヘッダーの高さだけビューポートよりも長くなりますが、非表示になり、スクロールバーが発生することはありません。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Test</title>
    <style type="text/css">
    body, html {
      height: 100%;
      margin: 0;
      padding: 0;
      overflow: hidden;
      color: #FFF;
    }
    p {
      margin: 0;
    }

    #header {
      background: red;
    }

    #content {
      position: relative;
      height: 100%;
      background: blue;
    }

    #content #positioned {
      position: absolute;
      top: 0;
      right: 0;
    }
  </style>
</head>

<body>
  <div id="header">
    Header
    <p>Header stuff</p>
  </div>

  <div id="content">
    Content
    <p>Content stuff</p>
    <div id="positioned">Positioned Content</div>
  </div>

</body>
</html>

すでにこれを考えていました。しかし、それも機能しません。tableそれが機能するので、私はに固執するつもりです。更新してくれてありがとう。
ヴィンセントマクナブ

5

これを試して

var sizeFooter = function(){
    $(".webfooter")
        .css("padding-bottom", "0px")
        .css("padding-bottom", $(window).height() - $("body").height())
}
$(window).resize(sizeFooter);

4

私にとってそれは単なる設計上の問題だったので、私は非常に単純な解決策を見つけました。ページの残りの部分が赤いフッターの下で白くならないようにしました。だから私はページの背景色を赤に設定しました。そしてコンテンツの背景色を白に。コンテンツの高さを例えばに設定します。20emまたは50%のほとんど空のページでは、ページ全体が赤くなることはありません。


4

私は同じ問題を抱えていましたが、上記のフレックスボックスで解決策を実行できませんでした。そこで、次のような独自のテンプレートを作成しました。

  • 固定サイズの要素を持つヘッダー
  • フッター
  • 残りの高さを占めるスクロールバー付きのサイドバー
  • コンテンツ

フレックスボックスを使用しましたが、より単純な方法では、プロパティdisplay:flexおよびflex-direction:row | columnのみを使用します

私は角度を使用していますが、コンポーネントのサイズを親要素の100%にしたいと思っています。

重要なのは、サイズを制限するために、すべての親のサイズ(パーセント)を設定することです。次の例では、myappの高さはビューポートの100%です。

ヘッダーとフッターは5%であるため、メインコンポーネントにはビューポートの90%があります。

テンプレートをここに投稿しました:https : //jsfiddle.net/abreneliere/mrjh6y2e/3

       body{
        margin: 0;
        color: white;
        height: 100%;
    }
    div#myapp
    {
        display: flex;
        flex-direction: column;
        background-color: red; /* <-- painful color for your eyes ! */
        height: 100%; /* <-- if you remove this line, myapp has no limited height */
    }
    div#main /* parent div for sidebar and content */
    {
        display: flex;
        width: 100%;
        height: 90%; 
    }
    div#header {
        background-color: #333;
        height: 5%;
    }
    div#footer {
        background-color: #222;
        height: 5%;
    }
    div#sidebar {
        background-color: #666;
        width: 20%;
        overflow-y: auto;
     }
    div#content {
        background-color: #888;
        width: 80%;
        overflow-y: auto;
    }
    div.fized_size_element {
        background-color: #AAA;
        display: block;
        width: 100px;
        height: 50px;
        margin: 5px;
    }

HTML:

<body>
<div id="myapp">
    <div id="header">
        HEADER
        <div class="fized_size_element"></div>

    </div>
    <div id="main">
        <div id="sidebar">
            SIDEBAR
            <div class="fized_size_element"></div>
            <div class="fized_size_element"></div>
            <div class="fized_size_element"></div>
            <div class="fized_size_element"></div>
            <div class="fized_size_element"></div>
            <div class="fized_size_element"></div>
            <div class="fized_size_element"></div>
            <div class="fized_size_element"></div>
        </div>
        <div id="content">
            CONTENT
        </div>
    </div>
    <div id="footer">
        FOOTER
    </div>
</div>
</body>

4

モバイルアプリの場合、VHとVWのみを使用します

<div class="container">
  <div class="title">Title</div>
  <div class="content">Content</div>
  <div class="footer">Footer</div>
</div>

.container {
  width: 100vw;
  height: 100vh;
  font-size: 5vh;
}

.title {
  height: 20vh;
  background-color: red;
}

.content {
  height: 60vh;
  background: blue;
}

.footer {
  height: 20vh;
  background: green;
}

デモ-https://jsfiddle.net/u763ck92/


3
これは正しい解決策ではありません。vhはモバイルブラウザで一貫していません。詳細はこちらをご覧ください:stackoverflow.com/questions/37112218/...
HarshMarshmallow

3

エイリアン氏のアイデアをスピンオフ...

これは、CSS3対応のブラウザーでよく使用されるフレックスボックスよりもクリーンなソリューションのようです。

contentブロックに対してcalc()でmin-height(高さの代わりに)を使用するだけです。

calc()は100%で始まり、ヘッダーとフッターの高さを引きます(パディング値を含める必要があります)

「height」の代わりに「min-height」を使用すると、JavaScriptでレンダリングされたコンテンツやAngular2などのJSフレームワークで機能するため、特に便利です。そうでない場合、JavaScriptでレンダリングされたコンテンツが表示されると、計算によってフッターがページの下部にプッシュされません。

両方に高さ50pxと20pxパディングを使用したヘッダーとフッターの簡単な例を次に示します。

HTML:

<body>
    <header></header>
    <div class="content"></div>
    <footer></footer>
</body>

CSS:

.content {
    min-height: calc(100% - (50px + 20px + 20px + 50px + 20px + 20px));
}

もちろん、数学は単純化することができますが、あなたはアイデアを得ます...


3

ブートストラップで:

CSSスタイル:

html, body {
    height: 100%;
}

1)残りの画面スペースの高さを埋めるだけです。

<body class="d-flex flex-column">
  <div class="d-flex flex-column flex-grow-1>

    <header>Header</header>
    <div>Content</div>
    <footer class="mt-auto">Footer</footer>

  </div>
</body>

![ここに画像の説明を入力してください


2)残りの画面スペースの高さを埋め、コンテンツを親要素の中央に配置します。

<body class="d-flex flex-column">
  <div class="d-flex flex-column flex-grow-1">

    <header>Header</header>
    <div class="d-flex flex-column flex-grow-1 justify-content-center">Content</div>
    <footer class="mt-auto">Footer</footer>

  </div>
</body>

![ここに画像の説明を入力してください


1

これは、Pebblのソリューションの最小バージョンです。IE11で動作させるためのトリックを見つけるために永遠に努力しました。(Chrome、Firefox、Edge、Safariでもテストされています。)

<!DOCTYPE html>
<html>
<head>
<style>
html {
    height: 100%;
    }
body {
    height: 100%;
    margin: 0;
    }
section {
    display: flex;
    flex-direction: column;
    height: 100%;
    }
div:first-child {
    background: gold;
    }
div:last-child {
    background: plum;
    flex-grow: 1;
    }
</style>
</head>
<body>
    <section>
      <div>FIT</div>
      <div>GROW</div>
    </section>
</body>
</html>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.