2017-01-19 8 views
0

私のページに固定されたheaderfooterが必要ですが、これは常に画面上にとどまる必要があります。横パネルはasideにあり、主な内容はsectionです。スティッキーヘッダーとフッタースクロール可能なメインエリア

JavaScriptを使用して、私はasideの残りの高さ(window.height - header.height - footer.height)をすべて使用していました。しかし、それはsectionがそれほど高くない場合にのみ機能します。ウィンドウのサイズを変更すると、ウィンドウの下端にあるfooterが消えていることがわかります。sectionに空きがあります。

私はoverflow-y(その内にdivの中のsectionの内部)の多くの異なる組み合わせを試してみましたが、無駄です。どうすれば解決できますか?

jsfiddle exampleを作成しました。

function resize() { 
 
    var hPage = window.innerHeight; 
 
    var hHead = document.getElementById('header').offsetHeight; 
 
    var hFoot = document.getElementById('footer').offsetHeight; 
 
    document.getElementById('spn').innerHTML = 'Page: ' + hPage + '<BR>Head: ' + hHead + '<BR>Foot: ' + hFoot; 
 
    document.getElementById('aside').style.height = (hPage - hHead - hFoot) + 'px'; 
 
}
html, 
 
body { 
 
    height: 100%; 
 
    margin: 0; 
 
    overflow-x: hidden; 
 
    overflow-y: hidden; 
 
} 
 
header { 
 
    background-color: green; 
 
    color: white; 
 
    text-align: center; 
 
    font-weight: bold; 
 
    font-size: 30px; 
 
} 
 
section { 
 
    float: right; 
 
    width: 80%; 
 
    overflow-x: auto; 
 
    overflow-y: auto; 
 
} 
 
section div { 
 
    padding: 10px; 
 
    overflow-x: auto; 
 
    overflow-y: auto; 
 
} 
 
aside { 
 
    float: left; 
 
    background-color: lightgreen; 
 
    width: 20%; 
 
} 
 
aside p { 
 
    margin-left: 20px; 
 
} 
 
footer { 
 
    background-color: green; 
 
    color: white; 
 
    text-align: center; 
 
    clear: both; 
 
} 
 
table { 
 
    border-collapse: collapse; 
 
} 
 
th { 
 
    border: 1px solid black; 
 
    text-align: center; 
 
    font-weight: bold; 
 
} 
 
td { 
 
    border: 1px solid black; 
 
    text-align: center; 
 
}
<body onload='resize()' onresize='resize()'> 
 
    <header id='header'>Test 0.1</header> 
 
    <aside id='aside'> 
 
    <p>Menu 1</p> 
 
    <p>Menu 2</p> 
 
    <p>Menu 3</p> 
 
    <p>Menu 4</p> 
 
    <p><span id='spn'>n</span> 
 
    </p> 
 
    </aside> 
 
    <section> 
 
    <div id='divMain'> 
 
     <table> 
 
     <tr> 
 
      <th>Col1</th> 
 
      <th>Col2</th> 
 
      <th>Col3</th> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     </table> 
 
    </div> 
 
    </section> 
 
    <footer id='footer'>Address, 
 
    <br>phone, 
 
    <br>etc. 
 
    <br> 
 
    <br>Address, 
 
    <br>phone, 
 
    <br>etc.</footer> 
 
</body>

答えて

2

はフレキシボックスのアプローチを試してみてくださいです。 <main>要素が<aside><section>をラップして追加されました。あなたの例では

jsFiddle

html, 
 
body { 
 
    height: 100%; 
 
} 
 
body { 
 
    margin: 0; 
 
    display: flex; 
 
    flex-direction: column; 
 
} 
 
header { 
 
    background-color: green; 
 
    color: white; 
 
    text-align: center; 
 
    font-weight: bold; 
 
    font-size: 30px; 
 
} 
 
main { 
 
    flex: 1; 
 
    display: flex; 
 
    min-height: 0; 
 
} 
 
aside { 
 
    background-color: lightgreen; 
 
    width: 20%; 
 
    overflow: auto; 
 
} 
 
aside p { 
 
    margin-left: 20px; 
 
} 
 
section { 
 
    width: 80%; 
 
    overflow: auto; 
 
} 
 
section div { 
 
    padding: 10px; 
 
} 
 
footer { 
 
    background-color: green; 
 
    color: white; 
 
    text-align: center; 
 
} 
 
table { 
 
    border-collapse: collapse; 
 
} 
 
th { 
 
    border: 1px solid black; 
 
    text-align: center; 
 
    font-weight: bold; 
 
} 
 
td { 
 
    border: 1px solid black; 
 
    text-align: center; 
 
}
<header id='header'> 
 
    Test 0.1 
 
</header> 
 
<main> 
 
    <aside id='aside'> 
 
    <p>Menu 1</p> 
 
    <p>Menu 2</p> 
 
    <p>Menu 3</p> 
 
    <p>Menu 4</p> 
 
    <p><span id='spn'>n</span> 
 
    </p> 
 
    </aside> 
 
    <section> 
 
    <div id='divMain'> 
 
     <table> 
 
     <tr> 
 
      <th>Col1</th> 
 
      <th>Col2</th> 
 
      <th>Col3</th> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     <tr> 
 
      <td>A</td> 
 
      <td>B</td> 
 
      <td>C</td> 
 
     </tr> 
 
     <tr> 
 
      <td>1</td> 
 
      <td>2</td> 
 
      <td>3</td> 
 
     </tr> 
 
     </table> 
 
    </div> 
 
    </section> 
 
</main> 
 
<footer id='footer'> 
 
    Address, 
 
    <br>phone, 
 
    <br>etc. 
 
    <br> 
 
    <br>Address, 
 
    <br>phone, 
 
    <br>etc. 
 
    <br> 
 
</footer>

+0

あなたの例はここやjsfiddleでは動作しません。フッターが消えています。スクロールバーは、ページ全体ではなくセクション/メインdiv内にある必要があります。 – Rodrigo

+0

@Rodrigo私はそれを修正したので、Firefoxでもうまく動作するはずです。お知らせ下さい。 – Stickers

+0

すばらしい、パングロス!今、それは魅力のように働いた!どうもありがとうございました! – Rodrigo

0

あなたはそれはあなたがスクロールオプションを追加する必要があり、高さがオーバーフロー、だ場合は、テーブルを表示することもフッター&にposition:fixedを適用することができます。ここで

あなたはheaderfooterは、あなたがposition:fixed属性を使用する必要があります固定位置を持つようにしたい場合

#footer{ 
    position:fixed; 
    bottom:0; 
width:100% 
} 
#divMain{ 
overflow-y:auto; // scrollbar will only appear when require 
height:500px; // you can adjust this height 
} 

DEMO

+0

、スクロールバーが表示されますが、部分的にフッターの後ろに隠します。 – Rodrigo

0

助けるかもしれCSSです。ここで

にはjavascriptのを必要としない、fiddle

+0

あなたのフィドルでは、フッターはページに残りますが、セクション/メインディビジョンにスクロールバーはありません。また、メニュー1は消えてしまった。 – Rodrigo

関連する問題