New CSS Sticky Footer -CSSでフッターを下に固定する-
CSSでフッターを下部に固定する方法ですが、おそらく有名なのはCSSStickyFooterでしょう。コンテンツ部分のpadding-bottomにフッターのheightを指定してフッターのmargin-topにheight分のネガティブマージンを指定するという物です。
CSSStickyで紹介されている(X)HTMLとCSSだと全体を包むdivがありません。よくあるサイトのデザインとして全体を包んだdivの左右にドロップシャドウをつけた画像を縦軸にリーピートさせるものがあります。今回は このCSSStickyFooterを少々改造して全体を包むコンテナを含んだワイヤーフレームに対応させてみました。
ワイヤーフレームの構造は、ヘッダー(header)、メインのコンテンツ(primary)、サイドバー(secondary)、フッター(footer)となっています。その他にラップするdivとしてprimaryとsecondaryをラップするpageBody、headerとpageBodyをラップするcontainerInner、全てをラップするcontainerとなっています。
CSSStickyのCSSは以下のようになっています。
html, body, #wrap {height: 100%;}
body > #wrap {height: auto; min-height: 100%;}
#main {padding-bottom: 150px;} /* must be same height as the footer */
#footer {position: relative;
margin-top: -150px; /* negative value of footer height */
height: 150px;
clear:both;}
/* CLEAR FIX*/
.clearfix:after {content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;}
.clearfix {display: inline-block;}
/* Hides from IE-mac \*/
* html .clearfix { height: 1%;}
.clearfix {display: block;}
/* End hide from IE-mac */
この中で#wrapに該当するのが#containerInner、#mainに該当するのが#pageBodyになるのでそれぞれの名前を書き換えました。また、全体をラップする#containerが含まれているので、body > #wrapの部分を#container > #containerInnerに書き換えます。
#pageBodyと#footerの部分に色をつけてあります。#pageBodyに#footerのheight分のpadding-bottomを指定していますが、この部分を#footerは突き抜けます。コンテンツ部分である#primary、#secondaryには影響しませんが、#pageBodyはつっかえ棒的な役割のみにして背景画像などは指定しない方がよさそうです。
全CSSコード ※CSSStickyの部分と構造の部分を分けています
* { margin: 0; padding: 0; }
body {
background-color: #000;
color: #666;
}
div#containerInner {
width: 950px;
margin: 0 auto;
background-color: #fff;
}
div#header {
margin: 0 20px 1em;
border-bottom: 1px solid #666;
}
div#pageBody { background-color: #eee; }
div#primary {
display: inline; /* ltr win ie6 */
float: left;
width: 630px;
margin-left: 20px;
}
div#secondary {
width: 259px;
margin-left: 650px;
margin-right: 20px;
padding-left: 20px;
border-left: 1px solid #666;
}
div#footer {
margin-right: auto;
margin-left: auto;
width: 950px;
background-color: #9cf;
}
/*
Sticky Footer Solution
by Steve Hatcher
http://stever.ca
http://www.cssstickyfooter.com
*/
html,body,div#containerInner,div#container { height: 100%; }
div#container > div#containerInner { height: auto; min-height: 100%; }
div#pageBody { padding-bottom: 150px; } /* must be same height as the footer */
div#footer {
position: relative;
clear: both;
height: 150px;
margin-top: -150px; /* negative value of footer height */
}
.clearfix:after {
content: ".";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix { display: inline-block; }
/* Hides from IE-mac \*/
* html .clearfix { height: 1%;}
.clearfix { display: block; }
/* End hide from IE-mac */


1
こんにちは。Sticky Footerについて調べていたところ、こちらにたどり着きました。
2009年8月の日記の件で恐縮ですが、その日記のコメントがエラーでできなかったので、こちらに書かせてください><;
まさに私がやりたいことだったので、サンプルをお借りいたしました。
それに関して質問があるのですが…
サンプルにて、footer部分にフッターのナビゲーション、コピーライト用のボックスを二つ入れてみました。それぞれのボックスのheightは指定していません。
そうしたところ、読み込んだ際にフッターがずれてしまい(フッター下部部に隙間ができてしまいます)、画面をクリックしたり、リンクにカーソルを合わせたりするととフッターが下にくっつく(通常の状態に戻る)という状態になります。
画面をクリック、リンクにカーソルを合わせる、などにより、height:100%を認識して表示し直す、というような挙動をします。
これをどうにか改善する方法ないでしょうか?
2
コメントありがとうございます。エラーが出たとの報告もありがとうございます。
内容がSticky Footerの事でしたので、コメントをこちらに移させて頂きました。
私の方で#footer内にフッターナビゲーション、コピーライトを入れたデモを作ってみました。
Win IE6/7/8, Mac FF3.6, Mac Cromeで確認したところ特に問題はありませんでした。
http://www.nk0206.com/demo/css/sticky_footer2.html
モモさんのソースコードがどのようなマークアップになってるかはわからなかったので、
フッターナビはul、コピーライトはaddressでマークアップしてあります。
デモを確認してみてください。
3
お返事遅くなり、申し訳ございません。
コメントレスありがとうございます。
お忙しいところ、Sticky_footer2のデモをくださって、非常にありがたいです。
これを元に1から作り直してみたところ、上記の症状は見られなくなったようです。
まだ途中までなのですが、とり急ぎご報告させていただきました。
StickyFooterについて探していた中で、まさにやりたいことだったのですが、非常にわかりやすい説明だったので、どうしてもこちらの方法を使ってみたかったのです。
お手数かけさせてしまい、申し訳ございません;
4
>上記の症状は見られなくなったようです。
おお、良かったです。
>非常にわかりやすい説明だったので
わかりやすい説明を心がけていますが、分からない表記等ありましたらコメント欄にどうぞ。
答えられる範囲で答えさせていただきますね。
5
お世話になっております。
しばらくは思ったような動作をしていたのですが、
またも同じ状態に遭遇しました。
IEのみ、上記の症状が出ます。
元のStickyFooterとこちらの方法との違いを見つつ、
なんとなく
div#container > div#containerInner
の部分を削除してみたところ、症状が出なくなりました。
ただ、height: auto; min-height: 100%の部分は大事な部分だと思うので…どこかに入れないといけないと思うのですが、poundhoundさんの方法では、どこに入れたらいいのでしょうか?
お手数おかけして申し訳ないのですが、教えていただけると幸いです。
本家のStickyFooterのソースも見てみたのですが、
body > #wrap {height: auto; min-height: 100%;}
の部分がありませんでした。
6
すみません、書き忘れてしまいました。
div#container > div#containerInner { height: auto; min-height: 100%; }の部分の
min-heightを削除…変化なし
height:autoを削除…期待通りの結果
上記を両方書いた場合…読み込み後に上に若干ずれる、リンクや文字をクリックするとカクンと元に戻り、フッターが下にくっつく
という症状でした。
7
コメントありがとうございます。
申し訳ございませんが、ちょっとバタバタしていて中々検証する時間がとれません。
時間が取れ次第検証させて頂きたいと思います。
8
>本家のStickyFooterのソースも見てみたのですが、body > #wrap {height: auto; min-height: 100%;}
の部分がありませんでした。
本当ですね。前はあったと思うのですが、ソースコードが変わったんですかね。
なので#container > #containerInner { height: auto; min-height: 100%; }の部分を、#containerInner { min-height: 100%; }でどうでしょうか?
IE7で不具合があるようなので
<!--[if !IE 7]>
<style type="text/css">
#containerInner { display: table; height: 100% }
</style>
<![endif]-->
でどうでしょうか。
9
たびたびすみませんです; ありがとうございます!
やってみます><