2419

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

このページには、ロゴとアカウント情報を含むヘッダーがあります。これは任意の高さである可能性があります。コンテンツ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>

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

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

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

アップデート:

コンテンツ内の要素のdiv高さもパーセンテージに設定されます。したがって、100%内側の何かdivがそれを底まで埋めます。50%の2つの要素もそうです。

アップデート2:

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

4

37 に答える 37

1501

2015 アップデート: フレックスボックス アプローチ

flexboxについて簡単に言及している回答が他に 2 つあります。ただし、これは 2 年以上前のことであり、例はありません。flexbox の仕様は確実に確定しています。

注: 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 には、フレキシブル ボックス モデルの優れた紹介があります。

于 2014-07-27T08:14:37.147 に答える
261

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

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

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

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

于 2008-09-18T08:16:50.090 に答える
181

元の投稿は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>

于 2011-10-21T15:02:20.973 に答える
120

CSS のみのアプローチ (高さが既知/固定の場合)

中央の要素を垂直方向にページ全体にまたがらせたい場合calc()は、CSS3 で導入された which を使用できます。

高さと要素が固定されており、タグが利用可能な垂直方向の高さ全体を占めるようにしたいとします ...headerfootersection

デモ

想定されるマークアップと 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%;親要素に必ず使用してください。

于 2014-04-27T12:05:12.067 に答える
78

Used: height: calc(100vh - 110px);

code:

  
.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>

于 2016-05-22T03:20:04.223 に答える
48

CSSvhでの略をview height単に使用するのはどうですか...

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

body {
  padding: 0;
  margin: 0;
}

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

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

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

于 2017-06-17T18:19:17.007 に答える
35

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>

私はそれをチェックしました, それはすべての主要なブラウザで動作します: Chrome, IE, およびFireFox

于 2014-09-14T21:09:51.377 に答える
27

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

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

于 2011-04-11T15:48:06.217 に答える
24

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

padding-bottom: 100%;
于 2011-10-17T14:00:39.203 に答える
18
<!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 は高さを正しく解釈しないため、上記のようにヘッダーをコンテンツ内に配置する必要があります。オーバーフロー: auto は IE でダブル スクロール バーを発生させます (ビューポート スクロールバーは常に表示されますが、無効になっています)。

于 2008-09-18T06:01:58.840 に答える
16

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

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

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

2020 年更新: すべての最新ブラウザーは、 と の両方display: flexをサポートしていdisplay: gridます。唯一欠けているのはsubgrid、Firefox でのみサポートされているサポートです。MSIE は仕様ではどちらもサポートしていませんが、MSIE 固有の CSS ハックを追加したい場合は、動作させることができます。MSIE を無視することをお勧めします。Microsoft でさえ、MSIE はもう使用すべきではないと言っているからです。Microsoft Edge はこれらの機能を適切にサポートしています (Chrome と Blink レンダリング エンジンを共有しているため、サブグリッドのサポートを除きます)。

使用例display: grid

html, body
{
  min-height: 100vh;
  padding: 0;
  margin: 0;
}

body
{
  display: grid;
  grid:
    "myheader" auto
    "mymain" minmax(0,1fr)
    "myfooter" auto /
    minmax(10rem, 90rem);
}

header
{
  grid-area: myheader;
  background: yellow;
}

main
{
  grid-area: mymain;
  background: pink;
  align-self: center
    /* or stretch
      + display: flex;
      + flex-direction: column;
      + justify-content: center; */
}

footer
{
  grid-area: myfooter;
  background: cyan;
}
<header>Header content</header>
<main>Main content which should be centered and the content length may change.
<details><summary>Collapsible content</summary>
<p>Here's some text to cause more vertical space to be used.</p>
<p>Here's some text to cause more vertical space to be used (2).</p>
<p>Here's some text to cause more vertical space to be used (3).</p>
<p>Here's some text to cause more vertical space to be used (4).</p>
<p>Here's some text to cause more vertical space to be used (5).</p>
</details>
</main>
<footer>Footer content</footer>

使用例display: flex

html, body
{
  min-height: 100vh;
  padding: 0;
  margin: 0;
}

body
{
  display: flex; 
}

main
{
  background: pink;
  align-self: center;
}
<main>Main content which should be centered and the content length may change.
<details><summary>Collapsible content</summary>
<p>Here's some text to cause more vertical space to be used.</p>
<p>Here's some text to cause more vertical space to be used (2).</p>
<p>Here's some text to cause more vertical space to be used (3).</p>
<p>Here's some text to cause more vertical space to be used (4).</p>
<p>Here's some text to cause more vertical space to be used (5).</p>
</details>
</main>

于 2013-05-03T10:55:31.650 に答える
12

私はしばらくこれと格闘し、最終的に次のようになりました。

コンテンツ 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%;
}
于 2011-06-20T09:36:23.250 に答える
11

なぜこのようにしないのですか?

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 (この順序で) 高さを指定してから、要素に高さを指定しますか?

私のために働く

于 2012-02-20T09:21:45.677 に答える
7

ヴィンセント、あなたの新しい要件を使ってもう一度答えます。コンテンツが長すぎてもコンテンツが隠されてもかまわないので、ヘッダーをフロートする必要はありません。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>
于 2008-09-18T17:52:16.683 に答える
5

これを試して

var sizeFooter = function(){
    $(".webfooter")
        .css("padding-bottom", "0px")
        .css("padding-bottom", $(window).height() - $("body").height())
}
$(window).resize(sizeFooter);
于 2013-04-27T11:45:48.100 に答える
4

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

于 2012-09-14T08:02:34.660 に答える
3

CSS Gridを使用したもう 1 つのソリューション

グリッドを定義

.root {
  display: grid;
  grid-template-rows: minmax(60px, auto) minmax(0, 100%);
}

最初の行 (ヘッダー): 最小の高さを設定でき、最大の高さはコンテンツによって異なります。2 行目 (コンテンツ) は、ヘッダーの後に残った空き領域に合わせようとします。

このアプローチの利点は、ヘッダーとは無関係にコンテンツをスクロールできるため、ヘッダーが常にページの上部にあることです。

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

.root {
  display: grid;
  grid-template-rows: minmax(60px, auto) minmax(0, 100%);
  height: 100%;
}

.header {
  background-color: lightblue;
}

button {
  background-color: darkslateblue;
  color: white;
  padding: 10px 50px;
  margin: 10px 30px;
  border-radius: 15px;
  border: none;
}

.content {
  background-color: antiquewhite;
  overflow: auto;
}

.block {
  width: calc(100% - 20px);
  height: 120px;
  border: solid aquamarine;
  margin: 10px;
}
<div class="root">
  <div class="header">
    <button>click</button>
    <button>click</button>
    <button>click</button>
    <button>click</button>
    <button>click</button>
  </div>
  <div class="content">
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
    <div class="block"></div>
</div>
  <div class="footer"></div>
</div>

于 2020-10-15T14:58:47.173 に答える
0

これは、Javascript を使用したほうがよい、remining 画面スペースを動的に計算するものです。

以下の lib のように、CSS-IN-JS テクノロジを使用できます。

https://github.com/cssobj/cssobj

デモ: https://cssobj.github.io/cssobj-demo/

于 2016-10-13T02:28:18.047 に答える
-2

NICCAIが最初の回答で提案したように、JavaScriptを使用する以外の方法ではうまくいきませんでした。私はそのアプローチを使用し<div>て、Google マップで を再スケーリングしています。

これを行う方法の完全な例を次に示します (Safari/FireFox/IE/iPhone/Andorid で動作します (回転で動作)):

CSS

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

.header {
  height: 100px;
  background-color: red;
}

.content {
  height: 100%;
  background-color: green;
}

JS

function resize() {
  // Get elements and necessary element heights
  var contentDiv = document.getElementById("contentId");
  var headerDiv = document.getElementById("headerId");
  var headerHeight = headerDiv.offsetHeight;

  // Get view height
  var viewportHeight = document.getElementsByTagName('body')[0].clientHeight;

  // Compute the content height - we want to fill the whole remaining area
  // in browser window
  contentDiv.style.height = viewportHeight - headerHeight;
}

window.onload = resize;
window.onresize = resize;

HTML

<body>
  <div class="header" id="headerId">Hello</div>
  <div class="content" id="contentId"></div>
</body>
于 2011-08-06T03:30:33.450 に答える