スクロール途中から位置が固定されるナビゲーションを作ってみる
公開:
更新:
ある程度スクロールすると、途中から位置が固定になるコンテンツを見かけたことはありませんか?
今回はjQueryを使ってそれを作ります。
途中から位置が固定されるナビゲーションのデモ 1 & 2 ダウンロード
今回使うHTMLはこんな感じです。
<div id="header">
<h1>タイトル</h1>
</div>
<div id="container">
<div id="main">左カラム(メインコンテンツ)</div>
<div id="sidebar"><!-- サイドバー -->
<div id="nav">ここを固定する</div>
</div>
</div>
デモ1をご覧ください。 ある程度スクロールしたら、 上記のコードですが、 CSSとJSは以下のようになります。 こっちの欠点は動きがぎこちないというか、ガタガタ動いてしまうことです。#main
と#sidebar
はfloat: left
しています。
これの#nav
が表示エリア上部から20pxの位置まで来たら位置を固定したいと思います。position: fixed
を使って固定する#nav
にfixed
というクラス名をつけます。
CSSとJSは以下のようになります。#sidebar {
position: relative;
float: left;
width: 300px;
}
#nav {
width: 300px;
height: 300px; /* デモ用 */
background: #f88; /* 同上 */
}
.fixed {
position: fixed;
top: 20px;
}
var nav = $('#nav'),
offset = nav.offset();
$(window).scroll(function () {
if($(window).scrollTop() > offset.top - 20) {
nav.addClass('fixed');
} else {
nav.removeClass('fixed');
}
});
スクロールするたびに
top
の値を変更するposition: fixed
はIE 6が対応していません。
その替わりとしてposition: relative
を使い、スクロールするたびにtop
の値を変更して、位置を固定する方法を使ってみます。
デモ2をご覧ください。#sidebar {
float: left;
width: 300px;
}
#nav {
position: relative;
width: 300px;
height: 300px; /* デモ用 */
background: #f88; /* 同上 */
}
var nav = $('#nav'),
offset = nav.offset();
$(window).scroll(function () {
if($(window).scrollTop() > offset.top - 20) {
nav.css('top', $(window).scrollTop() - offset.top + 20);
} else {
nav.css('top', 0)
}
});
使うときは上手いこと分岐させて、IE 6だけこっちを使うとかすればいいんじゃないでしょうか。