jQueryでスクロールすると表示する系いろいろ
最近はスクロールするときにいろいろ仕掛けをするのが流行なようです。
ここではシンプルにある要素の位置とか最下部までスクロールしたら何か表示するということをやってみます。
1.ちょっとスクロールしたら「トップへ戻るボタン」を表示
ちょっとスクロールするとフェードして「トップへ戻るボタン」を表示を表示します。
ボタンは下の方にこんな感じで配置します。
html
<p id="page-top"><a href="#wrap">PAGE TOP</a></p>
fixedにすると固定配置されます。
css
#page-top {
position: fixed;
bottom: 20px;
right: 20px;
font-size: 77%;
}
#page-top a {
background: #666;
text-decoration: none;
color: #fff;
width: 100px;
padding: 30px 0;
text-align: center;
display: block;
border-radius: 5px;
}
#page-top a:hover {
text-decoration: none;
background: #999;
}
「100」というのが出現位置になるので適当に変更してください。
javascript
$(function() {
var topBtn = $('#page-top');
topBtn.hide();
//スクロールが100に達したらボタン表示
$(window).scroll(function () {
if ($(this).scrollTop() > 100) {
topBtn.fadeIn();
} else {
topBtn.fadeOut();
}
});
//スクロールしてトップ
topBtn.click(function () {
$('body,html').animate({
scrollTop: 0
}, 500);
return false;
});
});
スライドアニメーションして表示
先ほどの「トップへ戻るボタン」を下からにょきっとアニメーションして表示したらかっこいいかもしれない。
javascript
$(function() {
var showFlug = false;
var topBtn = $('#page-top');
topBtn.css('bottom', '-100px');
var showFlug = false;
//スクロールが100に達したらボタン表示
$(window).scroll(function () {
if ($(this).scrollTop() > 100) {
if (showFlug == false) {
showFlug = true;
topBtn.stop().animate({'bottom' : '20px'}, 200);
}
} else {
if (showFlug) {
showFlug = false;
topBtn.stop().animate({'bottom' : '-100px'}, 200);
}
}
});
//スクロールしてトップ
topBtn.click(function () {
$('body,html').animate({
scrollTop: 0
}, 500);
return false;
});
});
4、10、15行目の数値はボタンの配置場所によって変更してください。
2.スクロールするとヘッダーに固定表示(アニメーションバージョン)
jQueryでスクロールすると上部に固定されるナビゲーションというのを作ったとき、ドロップダウンしたら実用的かもというご意見をいただきましたのでやってみました。
html
<div class="nav"> <ul class="clearfix"> <li><a href="#">HOME</a></li> <li><a href="#">ABOUT</a></li> <li><a href="#">NEWS</a></li> <li><a href="#">LINK</a></li> </ul> <!-- /#nav --></div>
css
.nav {
padding: 0 20px;
margin: 0 auto 60px;
width: 760px;
}
.fixed {
position: fixed;
top: 0;
left: 0;
width: 100%;
}
javascript
$(function() {
var nav = $('.nav');
//表示位置
var navTop = nav.offset().top+500;
//ナビゲーションの高さ(シャドウの分だけ足してます)
var navHeight = nav.height()+10;
var showFlug = false;
nav.css('top', -navHeight+'px');
//ナビゲーションの位置まできたら表示
$(window).scroll(function () {
var winTop = $(this).scrollTop();
if (winTop >= navTop) {
if (showFlug == false) {
showFlug = true;
nav
.addClass('fixed')
.stop().animate({'top' : '0px'}, 200);
}
} else if (winTop <= navTop) {
if (showFlug) {
showFlug = false;
nav.stop().animate({'top' : -navHeight+'px'}, 200, function(){
nav.removeClass('fixed');
});
}
}
});
});
4行目の表示位置はアニメーションするのでちょっと余裕をもたせて下の方で表示するようにしています。
ムダなところがけっこうあるかもしれません。
3.下部までスクロールすると横からスライドして表示
ホームページを作る人のネタ帳さんのエントリーページは一番下までスクロールすると横から人気記事一覧が表示されてびっくりしますね。
それっぽいことをしてみます。
html
<div id="footer"> <div id="slide"> <div id="slide-in"> <h3>Footer</h3> <p>フッターコンテンツ</p> <p id="close"><a>閉じる</a></p> </div> </div> </div>
css
#footer {
overflow: hidden;
position: fixed;
width: 100%;
bottom: 0;
}
#slide {
background: #555;
color: #fff;
width: 100%;
}
#slide-in {
padding: 20px;
}
#footer a {
color: #fff;
text-decoration: none;
cursor: pointer;
}
javascript
$(function() {
var winWidth = $('body').outerWidth(true);
var footer = $('#footer');
var slide = $('#slide');
//画面下位置を取得
var bottomPos = $(document).height() - $(window).height() -500;
var showFlug = false;
//slideを画面右外へ配置
$('#slide').css('margin-left', winWidth+'px');
$(window).scroll(function () {
if ($(this).scrollTop() >= bottomPos) {
if (showFlug == false) {
showFlug = true;
slide.stop().animate({'marginLeft' : '0px'}, 200);
}
} else {
if (showFlug) {
showFlug = false;
slide.stop().animate({'marginLeft' : winWidth+'px'}, 200);
}
}
});
//閉じるボタン
$('#close').click(function(){
footer.hide();
});
//ウィンドウリサイズしたらwidth変更
$(window).resize(function(){
winWidth = $('body').outerWidth(true);
bottomPos = $(document).height() - $(window).height() - 500;
});
});
表示位置ですが、scrollTopはウィンドウ上部の位置なので「$(document).height() 」(ドキュメントの高さ)だけだと足りませんね。
「$(document).height() – $(window).height()」(ドキュメントの高さ – ウィンドウの高さ)画面下ぴったりの位置で表示することができます。
ここでは画面下よりちょっと上で表示したかったので「-500」しています。
下部までスクロールすると右下に配置したコンテンツが開く
最近こういうのも見ますよね。
あれはプラグインかなにかなのでしょうか。
ということでやってみます。
開くボタンは画像で配置しています。
html
<div id="slide"> <div id="slide-in"> <div id="open-btn"><img src="img/open-btn.gif" width="20" height="20" /></div> <h3>開くかも</h3> <div id="slide-contents"> <p>これは開くかもしれない。開きましたか?</p> </div> </div> </div>
閉じるボタンはcssでバックグラウンドに配置しています。
css
#slide {
position: fixed;
width: 200px;
height: 30px;
bottom: 0;
right: 0;
color: #666;
background: #fff;
border-left: solid 1px #999;
border-top: solid 1px #999;
box-shadow: 0px 0px 10px 0px rgba(0,0,0,1);
}
#slide-in {
padding: 5px 10px;
}
#slide a {
text-decoration: none;
cursor: pointer;
}
#slide h3 {
margin-bottom: 10px;
}
#slide #open-btn {
position: absolute;
right: 5px;
top: 5px;
width: 20px;
height: 20px;
cursor: pointer;
background: url(img/close-btn.gif);
}
javascript
$(function() {
var slide = $('#slide');
var contents = $('#slide-contents');
//開くボタン
var openBtn = $('#open-btn img');
var btnOpenFlug = false;
var openFlug = false;
var panelSwitch = function() {
//閉じる
if (openFlug == true ) {
slide.stop().animate({'width' : '200px','height' : '30px'}, 500);
openBtn.show(); //開くボタンにする
}
//開く
else if (openFlug == false) {
slide.stop().animate({'width' : '400px','height' : '200px'}, 500);
openBtn.hide(); //閉じるボタンにする
}
};
//開くボタンクリックしたら
$('#open-btn').click(function(){
panelSwitch();
openFlug = !openFlug;
btnOpenFlug = true;
});
//画面下位置を取得
var bottomPos = $(document).height() - $(window).height() - 500;
$(window).scroll(function () {
if (!btnOpenFlug) {
if ($(this).scrollTop() >= bottomPos) {
if (openFlug == false) {
panelSwitch();
openFlug = true;
}
} else {
if (openFlug) {
panelSwitch();
openFlug = false;
}
}
}
});
});
どれも似たようなものばかりでちょっと退屈だったかもしれませんが以上です。