ヘッダ、フッタを固定してみる。

カテゴリ:CSSテクニック 2007年2月 7日 09:30

ひさびさの更新です。
さてさて、今回はとある案件で調べ物をしているときに見つけた手法で、面白かったので自分で作りつつ解説をしてみようと思います。

ヘッダ、フッタの固定 デモ

概要を話すと、縦幅 100% 表示にしたコンテンツボックスの上と下に、position を絶対指定にして固定配置したもの。肝は、body と html 部分にoverflow: hiddenを設定するところかな。

CSSソース

html,body#wrapperheight: 100%を指定することで#wrapperのボックスは縦幅いっぱいに広がります。
また、#wrapperposition: relativeを指定することでヘッダとフッタ部分の絶対配置の基準にします。

ヘッダとフッタに関しては

CSSソース

絶対配置をすること、z-indexをコンテンツのボックスより大きく設定することと、コンテンツ部分のスクロールバーを表示するために右側に余白を設けています。
(余白と書いていますが、幅をコンテンツ部分より 15px ほど短くすることで余白としています)

最後にコンテンツ部分です。

CSSソース

メインコンテンツ部分は、ふたつのボックスからなります。
まず、コンテンツを表示する部分。ここにoverflow: autoを設定し、溢れた物をスクロールできるようにします。

そして内包するボックスに対してpaddingを設定します。
この値は、上下のヘッダ、フッタ部分にかぶらないように余白を設定しているものです。
(今回のサンプルではヘッダ、フッタと同じ手法で左側にメニューをおいているため、左側にも余白を取っています)

合わせて読むと役に立つかもなエントリー

この記事のカテゴリー一覧を見る⇒CSSテクニック

トラックバックURL

http://css-eblog.com/cgi-bin/mt/mt-tb.cgi/34

コメント

1 - 通りすがり さん

サンプルについてですが、画面が小さい時に横スクロールバーが表示されないのは仕様でしょうか?→ 結果:肝心の縦スクロールバーも表示されないn(ff2.0, ie7, ie6ともに)

2008年1月18日 11:34

2 - えど さん

>>通りすがりさんnコメントありがとうございます。nそうですね、これはサンプルの仕様です。nこの固定の方法は、htmlおよびbody部分に「overflow: hidden」を使い、n全体をひとつのdiv要素で括っています。nその中の1要素にスクロールバーを表示(overflow: auto)しているのでこのような挙動になっています。nそのため、ウィンドウが小さい場合でも、中のdiv要素自体は縮小されないためnスクロールバーが出ていない状態になっています。

2008年1月18日 12:08

3 - 名無し さん

サンプル参考にさせていただきました。n質問なのですが、他ブラウザは問題ないのですがOperaでだけ表示が少しおかしくなります。nスクロールするともう一段階下がるというか、フッタの下に余白ができてしまうのです。n自分でも模索してみたのですが良い解決方法が見つかりませんでした。n何か方法はないでしょうか?

2008年12月11日 14:30

4 - えど Author Profile Pageさん

>>3 - 名無し さんOperaではあまり正確にテストしていなかったかもです;n時間があるときに確認したいと思います。nご指摘ありがとうございます。

2008年12月18日 11:07

5 - ABYSS さん

この方法でヘッダを固定すると、本文中のアンカーにジャンプしたときにアンカーのある部分がブラウザの先頭部分(ヘッダに隠されている部分)になってしまい、ジャンプ先が隠れてしまうんですが、これの解決方法はないんでしょうか?

2008年12月25日 22:49

6 - えど Author Profile Pageさん

>>5 - ABYSS さんそうですね、ちょっとむずかしいかもしれません。。nIE6を無視してもいいのであれば、position:fixedを使ったら確実なんですが・・。nページ内のアンカーは想定していないので、すみません。

2008年12月27日 12:39

7 - k さん

サンプルを参考にさせていただいています。nひとつ可能かお聞きしたいのですが、nリキッドレイアウトで、ブラウザの縦の長さを最小限まで縮めた時、一定の高さ以上は縮まないという設定はCSSでは可能でしょうか。

2009年1月29日 12:40

8 - えど Author Profile Pageさん

>>7 - k さんCSSでは、という問いなら「可能です」。nCSSにはmin-heightというプロパティがあり、nそこで指定されているpx(や%など)以下にはならないようになります。n最低でもこの高さは確保したい、というときに使いますが、n今回のサンプルでは高さが100%のため、nブラウザのサイズを変えた時にそれ以下にならないようする、nという使い方ができます。n(サンプルの場合は#wrapperにmin-heightを設定します)nしかしながらこのmin-height、残念ながらIE6は対応していません。nさらに、IE7も互換モードの場合はこのmin-heightを解釈してくれないため、n同様に使うことができません。nただ、どちらも解釈されないだけで指定をしておいてもn特に影響はないのでモダンブラウザ(と標準モードのIE7)向けに指定しておくと希望の動きになるかと思います。n(IE6で、となるとCSSだけでは無理ですので、Javascriptなどを使う必要が出てきます)nさらに別の問題として、body要素のoverflowがhiddenのため、nもし仮に、このmin-heightで最低限の高さを確保しても、nbodyにはスクロールバーが出てくれないので、nフッターなどのコンテンツを見ることができなくなってしまう可能性があります。n参考になりましたでしょうか?

2009年1月29日 13:13

9 - k さん

えどさんへ。nなるほど…。nmin-height !ちょっとこれを使って調整してみます…。nものすごく参考になりした!n(Javaも検討してみようと思います)nご丁寧に、どうも有難うございました!!

2009年1月29日 17:00

10 - -e- さん

サンプル参考させていただきました。n知ってたら教えてください。n固定の要領で各ページに同じメニューバーを固定できますか?nうまくできず困ってます(><)njavaは難しい・・・・・。

2009年2月 3日 16:04

11 - Toby さん

はじめまして

ブログのポストをwrapperで決められた縦長さの中に納めてスクロールさせて閲覧したいのですが、調整がうまく行かず出来ません。

あるブログでは出来たのですが、現在編集してるブログではうまく行かず、複数のポスト投稿をすると指定してある縦長さのブロックに表示だけは収まっているのですが隠れているテキスト行分の余白がdivブロックを突き抜けて表示されてしまいます。

上手く調整することは可能だと思うのですが方法が分らず教えてもらえませんか。

2010年9月26日 22:55

12 - えど Author Profile Pageさん

>>11 - Toby さん
コメントありがとうございます。
コメントの件ですが、ちょっと質問内容だけでは判断できかねます。
ただ、"テキスト行分の余白がdivブロックを突き抜けて表示されてしまいます。" ということなので、
そのテキストを囲んでいる div 要素なりに overflow: auto を指定したらダメなのでしょうか?

それであればあふれた場合に自動的にスクロールバーが表示されるので。

2010年10月 3日 23:10

13 - Toby さん

返信ありがとうございます。

[CSS]
#main-wrapper {
background: url(http://4.bp.blogspot.com/_-OOofo3fgKU/TKtDvsgFqLI/AAAAAAAAANk/NdTGCWPhGAg/s1600/mainwrapperback.png) repeat;
width: 620px;
padding:0 0 0 10px;
float: left;
word-wrap: break-word; /* fix for long text breaking sidebar float in IE */
/* fix for long non-text content breaking IE sidebar float */
overflow:auto;
width:630px;
height:1630px;
margin:0 0 0 0;
scrollbar-3dlight-color:#7f6d55;
scrollbar-arrow-color:#484848;
scrollbar-darkshadow-color:#7f6d55;
scrollbar-face-color:#7f6d55;
scrollbar-highlight-color:#7f6d55;
scrollbar-shadow-color:#7f6d55;
scrollbar-track-color:#484848;
}

[HTML]

ブログポスト


bodyのheight高さはスクロールしても約1900pxで全体を納めるようにしてあるのですが、ブログポストを複数投稿するとその投稿の数だけbodyが伸びてしまい、cssでheight1630pxで指定しても表示はその指定高さで切れるのですが、余白としてbodyが表示されてしまいレイアウトが崩れてる状態です。

firefoxでは、最初同じく余白が出来てbodyが伸びるのですが、ポストをスクロールさせて一回上まで上げてやると正常に表示されます。しかしこの作業をいちいちしなければなりません。

IE8では駄目です。

通常はoverflow::scroll、autoであろうと非表示になりこのような減少は起きないと思うのですが。

wrapperにheight指定しても駄目です。

2010年10月 8日 20:49

コメントを投稿





承認されるまでコメントは表示されません。しばらくお待まちください。