スクロールの位置に応じてナビゲーションのカレント表示を変更
縦長のサイトでコンテンツの位置に応じて、ナビゲーションのカレント表示を変更する方法です。
HTML
<ul id="nav"> <li><a href="#section01">menu</a></li> <li><a href="#section02">menu</a></li> <li><a href="#section03">menu</a></li> </ul> </div> <div class="section" id="section01"> ..... </div> <div class="section" id="section02"> ..... </div> <div class="section" id="section03"> ..... </div>
CSS
body{ padding-top: 100px; } #nav{ position: fixed; top: 0; left: 0; width: 100%; } #nav ul{ overflow: hidden; width: 100%; } #nav li{ display: block; float: left; width: 33.3333%; padding: 10px 0; text-align: center; background-color: #ccc; } #nav li.on{ background-color: #f00; } .section{ height: 500px; }
ナビゲーションはTop固定にします。
jQuery
$(function(){ var margin = 100, //ウインドウ上部からどれぐらいの位置で変化させるか sectionTop = new Array, //sectionのTop位置格納用 current = -1; //現在のカレント位置 //(1)各sectionの縦位置を取得 $('.section').each(function(i) { sectionTop[i] = $(this).offset().top; }); //init changeNavCurrent(0); //スクロールした時の処理 $(window).scroll(function(){ scrollY = $(window).scrollTop(); //(2)各セクションの位置とスクロール位置を比較して、条件にあったらchangeNavCurrentを実行 for (var i = sectionTop.length - 1 ; i >= 0; i--) { if (scrollY > sectionTop[i] - margin) { changeNavCurrent(i); break; } }; }); //(3)ナビの処理 function changeNavCurrent(curNum) { if (curNum != current) { current = curNum; curNum2 = curNum + 1;//HTML順序用 $('#nav li').removeClass('on'); $('#nav li:nth-child(' + curNum2 +')').addClass('on'); } }; });
(1)
各セクションのtopの位置を取得します。
下記のような結果になります。
sectionTop[0]=100 sectionTop[1]=600 sectionTop[2]=1100
(2)
各セクションの位置とスクロール位置を順番に比較して、条件にあったらchangeNavCurrentを実行します。
例えばスクロール位置が800の場合、
sectionTop[2]ではfalse
、sectionTop[1]ではtrue
となるのでchangeNavCurrent(1)
が実行されます。
今回のサンプルでは更にmargin
という変数を使い、比較対象となるセクションのtopの位置を調整してます。
この値はサイトの構成によって適時調整するといいでしょう。
(3)
渡された引数を使って、カレントのナビゲーションのクラス属性にon
を付与します。
Comment
コメント(0)
コメントはまだありません。
コメントする
Trackback(0)