固定ヘッダー、スクロール可能なコンテンツを含むフッター


83

スクロール可能なコンテンツを含む固定ヘッダー、フッターを取得するにはどうすればよいですか?このページのようなもの。ソースを見てCSSを取得できますが、これを機能させるために必要な最小限のCSSとHTMLを知りたいだけです。

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


これらの修飾子と同じ質問:角度、具体化...
mobibob

回答:


130

このようなもの

<html>
  <body style="height:100%; width:100%">
    <div id="header" style="position:absolute; top:0px; left:0px; height:200px; right:0px;overflow:hidden;"> 
    </div> 
    <div id="content" style="position:absolute; top:200px; bottom:200px; left:0px; right:0px; overflow:auto;"> 
    </div> 
    <div id="footer" style="position:absolute; bottom:0px; height:200px; left:0px; right:0px; overflow:hidden;"> 
    </div>
  </body>
</html> 

反対票とは関係ありませんが、私はここに着きましたが、これはうまくいきませんでした(そして私は文字通りスタイルをコピーしました)。おそらくjQueryMobileがいじり回っています。しかし、それがうまくいったとしても、私は固定寸法をハーコードするのは好きではありません。HTML / cssはネイティブUIコンポーネントから一歩遅れていると思います。私が使用したすべてのネイティブプラットフォームで、スクロール可能なコンテナーを作成するのは簡単でした。
ミスタースミス

@MisterSmith申し訳ありませんが、コンテナの右側をロックするスタイルを追加するのを明らかに忘れていました。さらに、このコードはそのコンテナのサイズにのみレンダリングされます。それがbodyタグの下にあり、フルスクリーンが必要な場合は、高さと幅を100%に設定する必要があります。最後に、ハードコードされたスタイルに関しては、これは単なる例であり、製品リリースではありません。このようなインラインスタイルをリリースすることは決してありませんが、答えを説明するためのより適切な方法のようです。
John Hartsock 2013年

@JohnHartsock間違いなくJQMが悪いことをしていました。ハードコードされた寸法に関しては、絶対的な高さをピクセル単位で設定するのは好きではありません。私が使用した他のプラットフォームでは、コンテナーを作成して、必要なすべての高さを使用するように指示することができました。
ミスタースミス

@ミスタースミス。寸法をpxでハードコーディングする必要はありません。必要に応じてパーセンテージを使用できます。さらに、タグのstyle属性を使用してスタイルを設定する必要はなく、IDを参照するcssスタイルシートを設定するだけです。非常に理解しやすいように、答えはこのようにしただけです。
John Hartsock 2013年

2
@JohnHartsockは、おそらくインラインcssであり、コピーアンドペーストの回答である理由を説明していないため、
反対票を投じてい

61

フレキシブルボックスをサポートするブラウザをターゲットにしている場合は、次のようにすることができます 。http://jsfiddle.net/meyertee/AH3pE/

HTML

<div class="container">
    <header><h1>Header</h1></header>
    <div class="body">Body</div>
    <footer><h3>Footer</h3></footer>
</div>

CSS

.container {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
}

header {
    flex-shrink: 0;
}
.body{
    flex-grow: 1;
    overflow: auto;
    min-height: 2em;
}
footer{
    flex-shrink: 0;
}

更新:フレキシブルボックスのブラウザサポートについては、
「使用できますか」を参照してください。


高さが可変のヘッダーとフッターを使用していますが、これでうまくいくと思います。幸いにも最新のブラウザをターゲットにしています。ありがとうございました!
Jimmie Tyrrell 2014

すごい!そのような別の構造物をその.bodyエリアに配置する方法はありますか?これを行うと、.container内側.body .bodyが完全に下にスクロールされるとすぐに、外側がビューからスクロールアウトします。
philk 2016

1
これは私の意見では最良の答えであり、これが最良の答えであるはずです!ありがとうございました!
2017年

私が間違っていなければ、これは別の質問への答えですか?ここでは、スクロールバーがページ全体に表示されますが、ジョンの回答では、スクロールバーはメインコンテンツに表示されます(これが質問の内容です)。少なくともそれは私がフィドルで見ているものです。
bersling

49

アプローチ1-フレックスボックス

既知の高さ要素と未知の高さ要素の両方に最適です。必ず外部divをheight: 100%;に設定し、デフォルトをmarginにリセットしてくださいbodyブラウザのサポート表を参照してください。

jsFiddle

html, body {
  height: 100%;
  margin: 0;
}
.wrapper {
  height: 100%;
  display: flex;
  flex-direction: column;
}
.header, .footer {
  background: silver;
}
.content {
  flex: 1;
  overflow: auto;
  background: pink;
}
<div class="wrapper">
  <div class="header">Header</div>
  <div class="content">
    <div style="height:1000px;">Content</div>
  </div>
  <div class="footer">Footer</div>
</div>

アプローチ2-CSSテーブル

既知および未知の高さ要素の両方。IE8などのレガシーブラウザでも動作します。

jsFiddle

アプローチ3- calc()

ヘッダーとフッターの高さが固定されている場合は、CSSを使用できます calc()

jsFiddle

アプローチ4-すべての%

ヘッダーとフッターが既知の高さであり、それらもパーセンテージである場合は、単純な計算を行って、それらを100%の高さにすることができます。

jsFiddle


6

これでCSSグリッドができました。2019へようこそ。

/* Required */
body {
   margin: 0;
   height: 100%;
}

#wrapper {
   height: 100vh;
   display: grid;
   grid-template-rows: 30px 1fr 30px;
}

#content {
   overflow-y: scroll;
}

/* Optional */
#wrapper > * {
   padding: 5px;
}

#header {
   background-color: #ff0000ff;
}

#content {
   background-color: #00ff00ff;
}

#footer {
   background-color: #0000ffff;
}
<body>
   <div id="wrapper">
      <div id="header">Header Content</div>
      <div id="content">
         Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
      </div>
      <div id="footer">Footer Content</div>
   </div>
</body>


1
身長は必要ありません。ラッパーの高さを100vhに設定するだけで、ここでも実際でも機能します。
HenriqueErzinger19年

5

2013年現在:これが私のアプローチです。 jsFiddle:


HTML

<header class="container global-header">
    <h1>Header (fixed)</h1>
</header>

<div class="container main-content">
    <div class="inner-w">
        <h1>Main Content</h1>
    </div><!-- .inner-w -->
</div> <!-- .main-content -->

<footer class="container global-footer">
    <h3>Footer (fixed)</h3>
</footer>


SCSS

// User reset

* { // creates a natural box model layout
    -moz-box-sizing: border-box; 
    -webkit-box-sizing: border-box; 
    box-sizing: border-box; 
} // asume normalize.css


// structure

.container {
    position: relative;
    width: 100%;
    float: left;
    padding: 1em;
}


// type

body {
    font-family: arial;   
}

.main-content {
    h1 {
        font-size: 2em;
        font-weight: bold;
        margin-bottom: .2em;
    }
} // .main-content


// style

    // variables
    $global-header-height: 8em;
    $global-footer-height: 6em;

.global-header {
    position: fixed;
    top: 0; left: 0;
    background-color: gray;
    height: $global-header-height;
}

.main-content {
    background-color: orange;
    margin-top: $global-header-height;
    margin-bottom: $global-footer-height;
    z-index: -1; // so header will be on top
    min-height: 50em; // to make it long so you can see the scrolling
}

.global-footer {
    position: fixed;
    bottom: 0;
    left: 0;
    height: $global-footer-height;
    background-color: gray;
}

2016年の時点でフレックスボックスを使用する可能性があります。ただし、常にコンテキストによって異なります。トリッキーな状況!:)
sheriffderek 2016

5

これが私のために働いたものです。フッターがコンテンツを食いつぶさないように、マージンボトムを追加する必要がありました。

header {
  height: 20px;
  background-color: #1d0d0a;
  position: fixed;
  top: 0;
  width: 100%;
  overflow: hide;
}

content {
  margin-left: auto;
  margin-right: auto;
  margin-bottom: 100px;
  margin-top: 20px;
  overflow: auto;
  width: 80%;
}

footer {
  position: fixed;
  bottom: 0px;
  overflow: hide;
  width: 100%;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.