スクロール位置に応じてグローバルナビを点灯させる
まず、各divやsectionの座標を保存しておき、
スクロールがあったときは、jsで都度座標を取得して、どのメニューに対応した場所なのか判定しています。
1. CSSの調整
CSSに関しては細かい解説はしませんが、ヘッダー固定メニューの場合、下記のようなCSSを記述します。
ただし、position: fixed;は一部のスマホでは未対応のため、幅広くブラウザ対応する場合は別のやり方を考慮する必要があります。
#header {
position: fixed;
width: 100%;
height: 50px;
top: 0;
text-align: center;
background: rgba(180, 180, 180, 0.9);
border-bottom: 1px solid #ccc;
}
2. ページ内スクロール用jsの記述
jQueryを使っています。下記のような記述です。
$(function() {
/**
* ページ内スクロール
*/
$('a[href^=#]').click(function(){
var speed = 500;
var href= $(this).attr("href");
var target = $(href == "#" || href == "" ? 'html' : href);
var position = target.offset().top - 50;
$("html, body").animate({scrollTop:position}, speed, "swing");
return false;
});
});
3. 点灯表示用のjsを記述
ちょっと長いですが下記のような記述です。
対応するグローバルメニューのクラスに「active」が付与されるようにしています。
activeが付いたらcssで背景色を変えるなど適宜調整してみてください。
変数のバッティングを防ぐのと、汎用性を高めるため無名関数化しています。
実際に使うときは、最初の
// 配列宣言
の箇所を変更するだけで動作するかと思います。
$(function() {
/**
* 現在スクロール位置によるグローバルナビのアクティブ表示
*/
var scrollMenu = function() {
// 配列宣言
// ここにスクロールで点灯させる箇所のidを記述する
// 数値は全て0でOK
var array = {
'#top': 0,
'#menu-1': 0,
'#menu-2': 0,
'#menu-3': 0,
'#menu-4': 0,
'#menu-5': 0
};
var $globalNavi = new Array();
// 各要素のスクロール値を保存
for (var key in array) {
if ($(key).offset()) {
array[key] = $(key).offset().top - 10; // 数値丁度だとずれるので10px余裕を作る
$globalNavi[key] = $('#header ul li a[href="' + key + '"]');
}
}
// スクロールイベントで判定
$(window).scroll(function () {
for (var key in array) {
if ($(window).scrollTop() > array[key] - 50) {
$('#header ul li a').each(function() {
$(this).removeClass('active');
});
$globalNavi[key].addClass('active');
}
}
});
}
// 実行
scrollMenu();
});