CSSでヘッダーを固定する

| コメント(0) | トラックバック(0)

CSSでフッターを固定することが出来たので、次はヘッダーを固定してみる。

まずは、一般的なホームページの書き方から。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CSSでヘッダーを固定する 第1歩</title>
<style type="text/css">
body {
 margin:0px;
}
#header {
 background:#ccffcc;
 height:100px;
}

#main {
 background:#ffff99;
}

#footer {
 background:#ffcc99;
 height:80px;
}
</style>
</head>
<body>

<div id="header">
ヘッダー
</div>

<div id="main">
コンテンツ1<br />
コンテンツ2<br />
コンテンツ3<br />
コンテンツ4<br />
コンテンツ5<br />
コンテンツ6<br />
コンテンツ7<br />
コンテンツ8<br />
コンテンツ9<br />
コンテンツ10<br />
コンテンツ11<br />
コンテンツ12<br />
コンテンツ13<br />
コンテンツ14<br />
コンテンツ15<br />
コンテンツ16<br />
コンテンツ17<br />
コンテンツ18<br />
コンテンツ19<br />
コンテンツ20<br />
コンテンツ21<br />
コンテンツ22<br />
コンテンツ23<br />
コンテンツ24<br />
コンテンツ25<br />
コンテンツ26<br />
コンテンツ27<br />
コンテンツ28<br />
コンテンツ29<br />
コンテンツ30<br />
コンテンツ31<br />
</div>

<div id="footer">
フッター
</div>

</body>
</html>

サンプルはこちらです。
当然ですが、このままだと、ヘッダーはブラウザの上に固定されません。

ヘッダーをブラウザの上に固定するには、次のコードのように
html と body の高さを100%にし、ヘッダーの位置を fixed にします。これだけだとヘッダーの幅が小さくなってしまうので幅は100%に。#main がヘッダの下に潜り込んでしまうので padding でヘッダーの高さ分だけずらします。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CSSでヘッダーを固定する 第2歩</title>
<style type="text/css">
html {
 height:100%;
}

body {
 margin:0px;
 height:100%;
}
#header {
 background:#ccffcc;
 height:100px;
 width:100%;
 position:fixed;
}

#main {
 padding-top:100px;
 background:#ffff99;
}

#footer {
 background:#ffcc99;
 height:80px;
}
</style>
</head>
<body>

<div id="header">
ヘッダー
</div>

<div id="main">
コンテンツ1<br />
コンテンツ2<br />
コンテンツ3<br />
コンテンツ4<br />
コンテンツ5<br />
コンテンツ6<br />
コンテンツ7<br />
コンテンツ8<br />
コンテンツ9<br />
コンテンツ10<br />
コンテンツ11<br />
コンテンツ12<br />
コンテンツ13<br />
コンテンツ14<br />
コンテンツ15<br />
コンテンツ16<br />
コンテンツ17<br />
コンテンツ18<br />
コンテンツ19<br />
コンテンツ20<br />
コンテンツ21<br />
コンテンツ22<br />
コンテンツ23<br />
コンテンツ24<br />
コンテンツ25<br />
コンテンツ26<br />
コンテンツ27<br />
コンテンツ28<br />
コンテンツ29<br />
コンテンツ30<br />
コンテンツ31<br />
</div>

<div id="footer">
フッター
</div>

</body>
</html>

サンプルはこちらです。
FirefoxとIE7はこれでヘッダーが固定されるのですが、IE6は fixed が使えないので、ヘッダは固定されていません。そこで、IE6だけ別のスタイルを指定します。コンディショナルコメントを使います。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CSSでヘッダーを固定する 第3歩</title>
<style type="text/css">
html {
 height:100%;
}
body {
 margin:0px;
 height:100%;
}
#header {
 background:#ccffcc;
 height:100px;
 width:100%;
 position:fixed;
}

#main {
 padding-top:100px;
 background:#ffff99;
}

#footer {
 background:#ffcc99;
 height:80px;
}
</style>
<!--[if IE 6]>
<link rel="stylesheet" href="./fixheader_ie6.css" type="text/css" />
<![endif]-->
</head>
<body>

<div id="header">
ヘッダー
</div>

<div id="main">
コンテンツ1<br />
コンテンツ2<br />
コンテンツ3<br />
コンテンツ4<br />
コンテンツ5<br />
コンテンツ6<br />
コンテンツ7<br />
コンテンツ8<br />
コンテンツ9<br />
コンテンツ10<br />
コンテンツ11<br />
コンテンツ12<br />
コンテンツ13<br />
コンテンツ14<br />
コンテンツ15<br />
コンテンツ16<br />
コンテンツ17<br />
コンテンツ18<br />
コンテンツ19<br />
コンテンツ20<br />
コンテンツ21<br />
コンテンツ22<br />
コンテンツ23<br />
コンテンツ24<br />
コンテンツ25<br />
コンテンツ26<br />
コンテンツ27<br />
コンテンツ28<br />
コンテンツ29<br />
コンテンツ30<br />
コンテンツ31<br />
</div>

<div id="footer">
フッター
</div>

</body>
</html>

fixheader_ie6.css は以下のとおり

html {
 overflow:hidden;/*スクロールバーが出てしまうので*/
}
body {
 overflow:auto;/*スクロールバーを表示*/
}
#header {
 position:absolute;
}

サンプルはこちらです。
これでIE6でも”いちおう”ヘッダーが固定されました。
でもちょっと変です。。。

スタイルシートのコメントにもあるように、IE6の場合、ブラウザのスクロールバーを一旦消して、body の overflow:auto; でスクロールバーを表示してます。なので、ヘッダー(#header)の下にスクロールバーが入り込んでしまってます。

これの回避と、通常は横幅固定で中央寄せでウェブサイトを作ることが多い(と勝手に決め付けてますが…)ので、そのような体裁にします。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CSSでヘッダーを固定する 第4歩</title>
<style type="text/css">
html {
 height:100%;
}
body {
 margin:0px;
 height:100%;
}
#body {
 width:700px;
 margin:0px auto;
}


#header {
 background:#ccffcc;
 height:100px;
/* width:100%;*/
 width:700px;
 position:fixed;
}

#main {
 padding-top:100px;
 background:#ffff99;
}

#footer {
 background:#ffcc99;
 height:80px;
}
</style>
<!--[if IE 6]>
<link rel="stylesheet" href="./fixheader_ie6.css" type="text/css" />
<![endif]-->
</head>
<body>
<div id="body">

<div id="header">
ヘッダー
</div>

<div id="main">
コンテンツ1<br />
コンテンツ2<br />
コンテンツ3<br />
コンテンツ4<br />
コンテンツ5<br />
コンテンツ6<br />
コンテンツ7<br />
コンテンツ8<br />
コンテンツ9<br />
コンテンツ10<br />
コンテンツ11<br />
コンテンツ12<br />
コンテンツ13<br />
コンテンツ14<br />
コンテンツ15<br />
コンテンツ16<br />
コンテンツ17<br />
コンテンツ18<br />
コンテンツ19<br />
コンテンツ20<br />
コンテンツ21<br />
コンテンツ22<br />
コンテンツ23<br />
コンテンツ24<br />
コンテンツ25<br />
コンテンツ26<br />
コンテンツ27<br />
コンテンツ28<br />
コンテンツ29<br />
コンテンツ30<br />
コンテンツ31<br />
</div>

<div id="footer">
フッター
</div>

</div>
</body>
</html>

サンプルはこちらです。
最後はちょっと強引な逃げ方ですが、これでヘッダーが固定されました。

確認はCSSでフッターを固定する同様、WindowsXP IE6、WindowsXP Firefox3、WindowsVista IE7 で行いました。Macは持ってないので確認してません。Macの結果をいただけたらうれしいです。

今回参考にさせていただいたページです。
CSSだけでフレームを作るテクニック
非対応セレクタを利用した CSS ハックの注意点


■2008.11.2追記
最後のサンプルの場合、ブラウザの幅を狭くしていくと、スクロールバーが消えてしまいます。
あと、各コードの先頭に

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

と宣言しています。この宣言がないとIE6では正常に動作しません。
何故だろう…ってところですが。

■2008.11.3追記
森下屋さんからのご報告。
Mac - Safari 3.1.2
Mac - FireFox 2.0.0.17
でも問題なく動作します。
森下屋さん、いつもありがとうございます。

トラックバック(0)

トラックバックURL: http://www.karakuriya.biz/mt/mt-tb.cgi/808

コメントする

ウェブページ

Powered by Movable Type 4.261

このブログ記事について

このページは、H.Imaiが2008年11月 2日 17:31に書いたブログ記事です。

ひとつ前のブログ記事は「CSSでフッターを固定する」です。

次のブログ記事は「Googleで に関するブログ記事」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。