一定量スクロールするとヘッダやツールバーがスクロールせずに固定される枠を作成するコードを紹介します。
補足
jQueryを利用するほうが簡単に実装できます。jQueryを利用した実装は
こちらの記事を参照してください。
プログラム
コード
下記のHTMLファイルCSSファイルを記述します。
FixedHeader.html
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<meta charset="utf-8" />
<link rel="stylesheet" type="text/css" href="FixedHeader.css"/>
<script type="text/javascript">
window.onscroll = function () {
var fixedBarObj = document.getElementById("fixedbar");
if (document.documentElement.scrollTop > 96) {
fixedBarObj.className = "fixed";
} else {
fixedBarObj.className = "";
}
}
</script>
</head>
<body>
<div class="header">ヘッダ</div>
<div id="fixedbar">固定のバー</div>
<div class="fixedbarReserved"></div>
<div>
<div style="height:60px;background-color:#ff7070">コンテンツ</div>
<div style="height:60px;background-color:#ff708e">コンテンツ</div>
<div style="height:60px;background-color:#ff70a9">コンテンツ</div>
<div style="height:60px;background-color:#ff70d2">コンテンツ</div>
<div style="height:60px;background-color:#ff70e9">コンテンツ</div>
<div style="height:60px;background-color:#d870ff">コンテンツ</div>
<div style="height:60px;background-color:#bd70ff">コンテンツ</div>
<div style="height:60px;background-color:#9f70ff">コンテンツ</div>
<div style="height:60px;background-color:#7370ff">コンテンツ</div>
<div style="height:60px;background-color:#709cff">コンテンツ</div>
<div style="height:60px;background-color:#70ceff">コンテンツ</div>
<div style="height:60px;background-color:#70ffe6">コンテンツ</div>
<div style="height:60px;background-color:#70ffbd">コンテンツ</div>
<div style="height:60px;background-color:#70ff88">コンテンツ</div>
<div style="height:60px;background-color:#8bff70">コンテンツ</div>
<div style="height:60px;background-color:#b7ff70">コンテンツ</div>
<div style="height:60px;background-color:#d8ff70">コンテンツ</div>
<div style="height:60px;background-color:#fdff70">コンテンツ</div>
<div style="height:60px;background-color:#ffe670">コンテンツ</div>
<div style="height:60px;background-color:#ffcb70">コンテンツ</div>
<div style="height:60px;background-color:#ffa970">コンテンツ</div>
<div style="height:60px;background-color:#ff7070">コンテンツ</div>
</div>
</body>
</html>
FixedHeader.css
body{
margin:0px 0px 0px 0px;
}
.header{
height:96px;
background-color:white;
}
#fixedbar{
position:absolute;
height:48px;
width:100%;
color:white;
background-color:#303030;
}
#fixedbar.fixed{
position:fixed;
top:0px;
}
.fixedbarReserved{
height:48px; /*fixedbar の高さと合わせる*/
}
解説
window.onscroll にイベントハンドラを設定します。ウィンドウがスクロールするたびに関数が実行されます。
関数内では、下方向にスクロールした距離がヘッダの高さ(今回は96ピクセル)を超えた場合に、[固定のバー]の枠に"fixed"クラスを付与します。"fixed"クラスには、"position:fixed;" "top:0px;"が指定されているため、画面の上部で固定されてスクロールアウトしなくなります。スクロール量の取得部分の詳細は
こちらの記事を参照してください。
表示結果
HTMLファイルをWebブラウザで表示します。下図の画面が表示されます。
画面を下方向にスクロールします。白の[ヘッダ]がスクロールアウトします。
白の[ヘッダ]がすべてスクロールアウトします。
さらに下にスクロールします。通常であれば黒の[固定のバー]がスクロールアウトしますが、[固定のバー]は画面の上部に固定されスクロールアウトしません。
赤の[コンテンツ]がスクロールアウトします。
[固定のバー]は固定されたまま[コンテンツ]の枠がスクロールアウトします。
方向を変え、上方向に向かってスクロールします。
[コンテンツ]の枠がすべて表示されると、白の[ヘッダ]がスクロールインします。
補足:コードの記述について
「fixedbarReserved」の枠は下記のどちらの書き方でも正しく動作します。
どちらの記述方式を選択するかは好みかと思われます。
書式1
[固定のバー]はスクロールから外れ、画面に固定されるため、独立して書きたい。
<div class="header">ヘッダ</div>
<div id="fixedbar">固定のバー</div>
<div class="fixedbarReserved"></div>
<div>
<div style="height:60px;background-color:#ff7070">コンテンツ</div>
......
</div>
書式2
意味的に[固定のバー]はfixedbarReservedの領域に配置するバーであるので、fixedbarReservedのDIVタグ内に記述したい。
<div class="header">ヘッダ</div>
<div class="fixedbarReserved">
<div id="fixedbar">固定のバー</div>
</div>
<div>
<div style="height:60px;background-color:#ff7070">コンテンツ</div>
......
</div>
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2016-03-02
作成日: 2016-02-20