昨日のエントリーで書いたjQueryでのスクロール制御を応用して、
追尾型メニューリストを作ってみました。
Webページ画面の左だったり右だったりに配置してあるメニューリストを
スクロールをしても位置を固定して画面上から消えないようにするもの。
縦に長くなってしまうサイトなどでは、
これがあるとユーザーにも親切な感じがします。(うっとおしく思う人もいるみたいですが。。。)
今回作るサンプルはサイトヘッダーが高さ「50px」の場合を基準にしています。
※もちろんここの値はどんな形にでも変更可です。
まずは動作サンプルから。
iframe内をスクロールすると画面左のメニューリストが
ヘッダーを過ぎた時(ページ上部から50pxを過ぎた時)に固定となり
ページ内に留まります。(IE6では少々ガタつきますが、もうIE6は放っておきます…)
そして、スクロール位置がヘッダーに差し掛かった時(ページ上部から50px以内に入った時)に
再度CSSを通常時の状態に戻します。
ただそれだけではおもしろくなかったので、
固定になった際にメニューリストに「▲ページTOPへ」のリンクを出現させてみたり。
クリックでスクロールしてページのTOPへ遷移のおまけを付けてみたり。
(この「▲ページTOPへ」を出現させる位置はどこでも変更可能です。)
このサンプルの構成は以下のような感じに
まずはHTMLソースから。
◆HTML <div id="container"> <div id="header">サイトヘッダー</div> <div id="contents"> <p>コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。</p> <p>コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。</p> <p>コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。</p> <p>コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。</p> <p>コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。</p> <p>コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。</p> <p>コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。</p> <p>コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。コンテンツエリアの内容。</p> </div><!--/contents--> <div id="fixedMenu"> <ul> <li id="fixedPagetop"><a href="#">▲ページTOPへ</a></li> <li><a href="#">CONTENTS01</a></li> <li><a href="#">CONTENTS02</a></li> <li><a href="#">CONTENTS03</a></li> <li><a href="#">CONTENTS04</a></li> <li><a href="#">CONTENTS05</a></li> </ul> </div><!--/fixedMenu--> </div><!--/container-->
『id=”fixedMenu”』が固定の対象となるエリアになります。
続いてCSS。
◆CSS
body {
font-size: 100%;
line-height: 140%;
font-family: Arial,Helvetica,sans-serif;
background: #fff;
}
*html body {
background: #fff url(null) fixed;
}
a:link { text-decoration:underline; color: #1b38cc;}
a:visited { text-decoration:underline; color: #1b38cc;}
a:active { text-decoration:none; color: #1b38cc;}
a:hover { text-decoration:none; color: #1b38cc;}
#container {
width: 100%;
position: relative;
}
#header {
width: 100%;
height: 50px;
line-height: 50px;
font-weight: bold;
text-indent: 10px;
background: #efefef;
}
#fixedMenu {
top: 50px;
left: 0;
width: 150px;
position: absolute;
}
*html #fixedMenu {
position: absolute;
top: expression(eval(document.documentElement.scrollTop+0));
}
#fixedMenu ul {
width: 130px;
border-top: #ddd 1px solid;
}
#fixedMenu ul li {
width: 130px;
border-left: #ddd 1px solid;
border-right: #ddd 1px solid;
border-bottom: #ddd 1px solid;
}
#fixedMenu ul li a {
padding: 5px 0;
width: 130px;
text-indent: 10px;
display: block;
}
#fixedMenu ul li#fixedPagetop {
display: none;
}
#fixedMenu ul li#fixedPagetop a {
color: #fff;
font-weight: bold;
background: #555;
}
#contents {
margin-left: 150px;
padding: 10px 0;
width: 300px;
height: 1000px;
}
#contents p {
padding: 0 0 20px 0;
}
固定エリアとなる『#fixedMenu』が重要になります。
CSSファイルではひとまず『position: absolute;』に設定。
CSS内にIE6のガタつき回避の指定をとりあえず入れていますが、
jQuery側で値を変更してしまうので意味を成さず。。。
そして肝心のSCRIPT部分は、以下のような感じに。
◆SCRIPT(jQuery)
$(function(){
$(window).scroll(function () {
var ScrTop = $(document).scrollTop();
if (ScrTop > 50) {
$(‘#fixedMenu’).css({‘position’:’fixed’,’top’:’0′});
if($.browser.msie && $.browser.version < 7){
$('#fixedMenu').css('position','absolute')
.css('top',($(document).scrollTop()) + "px");
}
$('#fixedPagetop').css({'display':'block'});
}
if (ScrTop < 50) {
$('#fixedMenu').css({'position':'absolute','top':'50px'});
$('#fixedPagetop').css({'display':'none'});
}
});
$('#fixedPagetop a').click(function(){
$('html,body').animate({ scrollTop: 0 }, 1000);
return false;
});
});
[/javascript]
スクロール位置を判断して、固定エリアとなる『#fixedMenu』の『position』を
『fixed(固定)』と『absolute』に切り替えて位置を調整しています。
サイトヘッダー高さが50pxではない場合には、
スクリプト内のスクロール位置を判別している『if (ScrTop > 50) 』と『if (ScrTop < 50) 』と
元の位置に戻す際の『top』の値を変更するだけで対応可能です。
今回は単純な追尾型メニューリストですが、
ここからまた応用することで何か新たなインターフェースが出来ないかと考え中です。。。
追尾型のメニューリストが必要になった際に是非。。。
サンプルファイルをダウンロードしたい方はこちらから
