お仕事で、JavaScriptで「前へ」「次へ」を実装することになりました。まぁ、jQuery使ってOKで、ちゃんとレビューしてくれる技術者も居ますので勉強がてら試作してみます。
横方向に滑らかにスクロールするのは「カルーセル」(carousel)と呼ばれてるらしく、こんなのもあるようです。
今回は単純にページ遷移無しで表示が切り替われば良いので、ページの単位となるdivタグブロックを"display: none"でページ数分出力しておき(実際はプログラムが動的に生成すると思われます)、「前へ」「次へ」クリックされた時にdisplayを順繰りに"block"にしていけばOKっぽいです。というか動作原理として。
というわけで、ちょっと長いですが試作品第一号。
ID属性とかかなり決め打ち使ってますので汎用性は低いです。あと、{next|prev}page()がbooleanを返していますが、作り始めた当初はこれで前/次のリンク状態を交信させようとしてたからです。{next|prev}ok()とupdate_navilinks()を実装したら、使わなくなっちゃいました。
<html>
<head>
<style type="text/css">
<!--
/* 前/次のリンクでアンダーライン付(有効)/無し(無効)切り替えする為のCSSクラス */
a.pagenavi_enabled:link {
text-decoration: underline;
}
a.pagenavi_enabled:visited {
text-decoration: underline;
}
a.pagenavi_disabled:link {
text-decoration: none;
}
a.pagenavi_disabled:visited {
text-decoration: none;
}
-->
</style>
<script src="../jquery-1.2.6.min.js" type="text/javascript" ></script>
<script type="text/javascript">
var objPager = {
all : 0,
current : 1,
nextok : function() {
/* 「次へ」リンクが使えるか否かを返す */
if (2 > this.all) {
return false;
}
if (this.current == this.all) {
return false;
}
return true;
},
prevok : function() {
/* 「前へ」リンクが使えるか否かを返す */
if (2 > this.all) {
return false;
}
if (1 == this.current) {
return false;
}
return true;
},
nextpage : function() {
var cur = this.current;
cur++;
if (cur > this.all) {
return false;
} else {
this.current = cur;
return !((cur + 1) > this.all);
}
},
prevpage : function() {
var cur = this.current;
cur--;
if (cur < 1) {
return false;
} else {
this.current = cur;
return (cur - 1) > 0;
}
},
nil : null
};
objPager.update_navilinks = function() {
/* 前/次リンクの状態を更新する */
$('#page_prev').attr(
'class',
this.prevok() ? 'pagenavi_enabled' : 'pagenavi_disabled');
$('#page_next').attr(
'class',
this.nextok() ? 'pagenavi_enabled' : 'pagenavi_disabled');
}
$(document).ready(function(){
objPager.all = $('#page_container > div').size();
if (0 < objPager.all) {
$('#page_container>div:first').css('display', 'block');
$('#pageno_cur').text(objPager.current);
$('#pageno_all').text(objPager.all);
}
if (1 < objPager.all) {
objPager.update_navilinks();
$('#page_prev').click(function(event){
var old = objPager.current;
var r = objPager.prevpage();
var prev = objPager.current;
var id = null;
if (old == prev) {
return;
}
/* ページブロックの表示切り替え */
$('#pageno_cur').text(objPager.current);
id = '#page_' + old;
$(id).css('display', 'none');
id = '#page_' + prev;
$(id).css('display', 'block');
/* 前/次リンクの状態更新 */
objPager.update_navilinks();
event.preventDefault(); // これ、毎回必要なのかな?
});
$('#page_next').click(function(event){
var old = objPager.current;
var r = objPager.nextpage();
var next = objPager.current;
var id = null;
if (old == next) {
return;
}
/* ページブロックの表示切り替え */
$('#pageno_cur').text(objPager.current);
id = '#page_' + old;
$(id).css('display', 'none');
id = '#page_' + next;
$(id).css('display', 'block');
/* 前/次リンクの状態更新 */
objPager.update_navilinks();
event.preventDefault(); // これ、毎回必要なのかな?
});
}
});
</script>
</head>
<body>
<div id="page_navi">
page <span id="pageno_cur"></span> / all <span id="pageno_all"></span>,
<a href="#" id="page_prev" class="pagenavi_disabled">prev</a> /
<a href="#" id="page_next" class="pagenavi_disabled">next</a>
</div>
<hr />
<div id="page_container">
<?php for ($i = 1; $i <= 10; $i++) : ?>
<div id="page_<?php echo $i; ?>" style="display: none">
Page Block No <?php echo $i; ?>.
</div>
<?php endfor; ?>
</div>
</body>
</html>