jQueryでカルーセルパネル
カルーセルパネルというのは、右左を行ったりきたりするような動きではなく、右に行って行き止まりだったら、くるっと左へ移動するようなパネルのことです。
サイズ80×60の画像を6枚(2枚×3セットになるように)用意しました。
右矢印のみのカルーセルパネル
手始めに右のボタンだけ配置したものを作ってみましょう。上の画像の矢印の挙動を描きます。

<div id="z1"><!--relative指定のためにやむなく作ったdiv-->
<div id="z2"><img src="../gif/migi.gif" alt="" /></div>
<div id="z3"><!--紙芝居で言う枠の部分-->
<div id="z4" class="clearfix"><!--枠からはみ出て画像が表示されるエリア-->
<ul class="z5 clearfix">
<li><img src="../gif/r1m.gif" alt="" /></li>
<li><img src="../gif/r2m.gif" alt="" /></li>
</ul>
<ul class="z5 clearfix">
<li><img src="../gif/r3m.gif" alt="" /></li>
<li><img src="../gif/r4m.gif" alt="" /></li>
</ul>
<ul class="z5 clearfix">
<li><img src="../gif/r5m.gif" alt="" /></li>
<li><img src="../gif/r6m.gif" alt="" /></li>
</ul>
</div>
</div>
</div>
HTMLからいきますと、一番外枠z1は右矢印をpositionで指定したかったから作ったdivで、ここにrelativeを指定しておけばそこを基点に自由に配置できますからね。
z2は画像をくくるdiv。imgはインライン要素なので、ブロックレベルのdivで囲む。
z3は枠の部分で幅高さはz1の100%に指定、z4ははみ出して表示される部分、z5は2枚単位で画像を動かすので、2枚ずつリストを作成する。そしてCSS。
/*cssの記述*/
#z1 {
width:160px;
height:auto;
margin-left:25px;
position:relative;
}
#z2 {
position:absolute;
top:20px;
left:160px;
cursor:pointer;
}
#z3 {
width:100%;
height:100%;
overflow:hidden;
}
#z4 {
width:480px;
height:100%;
}
ul.z5 {
float:left;
width:160px;
list-style-type:none;
}
ul.z5 li {
float:left;
}
z1は便宜上あるだけだから飛ばし、z2は矢印を絶対配置する場所を示し、z3は枠の部分だから、width:80×2pxで指定して、指定したwidthからはみ出た部分はoverflow:hiddenで隠す。
z4はhiddenで見えない領域を含めた幅なので、80×6枚で480pxとして指定、z5は2枚ずつのliをfloatを使って横並びにしたulをさらにfloatして6枚を横一列に並べる。
floatした親の要素にclearfixを指定して回り込みを解除して、overflowをvisibleにして表示させてみると、
のように配置されているはず。
これにjQueryの命令を適用します。
//jsの記述
$(function(){
$("#z2").click(function(){
$("#z2").hide();
$("#z4").animate({marginLeft:parseInt($("#z4").css("marginLeft"))-160+"px"},"slow","swing",
function(){
$("ul.z5:first").appendTo("#z4");
$("#z4").css("marginLeft","0px");
$("#z2").show();
});
});
});
訳)右矢印ボタンがクリックされると、一旦矢印ボタンを見えなくして、カルーセルで画像が横並びになっているエリアの左マージン(現在値は0)を取得「$("#z4").css("marginLeft")」して、parseIntで数値化「parseInt($("#z4").css("marginLeft"))」後、-160してそれを新しいmarginleftとし、アニメーションで表示させます。それが終わったら、コールバック関数で、先頭のul要素を最後方へ移動すると左にずれるところすかさずmarginを0に戻して画像の動きを抑えて、矢印ボタンを表示します。
:firstや:lastは擬似クラスではなく、jQuery独自のフィルターと呼ばれるものです。:firstは、全てのclassがz5のulの中で最初に出てくる要素を指定します。ul.z5:first-childにしても同じ挙動を示します。
左右矢印のカルーセルパネル
これに、左ボタンも追加して右回りも左回りもできるようにしていきます。
HTMLに以下の2行を継ぎ足し、それに対してスタイルを指定しておきます。
<div id="z1a">
<div id="z6a"><img src="../gif/178.gif" alt="" /></div>
<div id="z2a"><img src="../gif/migi.gif" alt="" /></div>
<div id="z7a">><img src="../gif/hidari.gif" alt="" /></div>
<div id="z3a">
<div id="z4a" class="clearfix">
<ul class="z5a clearfix">
<li><img src="../gif/r1m.gif" alt="" /></li>
<li><img src="../gif/r2m.gif" alt="" /></li>
</ul>
<ul class="z5a clearfix">
<li><img src="../gif/r3m.gif" alt="" /></li>
<li><img src="../gif/r4m.gif" alt="" /></li>
</ul>
<ul class="z5a clearfix">
<li><img src="../gif/r5m.gif" alt="" /></li>
<li><img src="../gif/r6m.gif" alt="" /></li>
</ul>
</div>
</div>
</div>
#z6a {
position:absolute;
top:-20px;
left:-10px;
}
#z7a {
position:absolute;
top:20px;
left:-25px;
cursor:pointer;
}
左矢印ボタンを絶対配置で配置後、上の図のように右と左に画像がある状態であれば、すんなり左右にアニメーションできますが、初期の状態では左に移動対象のパネルがないので、jQueryで予め移動させておくところから開始します。
ここで使用するprependTo()は、指定したセレクターを()内の要素の前に移動させるjQueryの命令で、先頭に移動したulパネルはマイナスマージンの位置に移動するのではなく、移動後マージンは初期位置(図では0の位置)に戻ります。
そのため、右矢印だけのメニューの時もそうでしたが、prependToやappendTo移動のあとに枠内表示を維持するなら、移動後にマージンで移動させてあげなければなりません。
矢印(z66が左、z67が右)をアニメーションの前にその都度消しているので、div#z64:not(animated)とする必要はありません。消さないならつけましょう。
//jsの記述
$(function(){
$("ul.z5a:last").prependTo("#z4a");
$("#z4a").css("marginLeft","-160px"); //ここまでが初期配置設定
//左ボタン
$("#z7a").click(function(){
$("#z2a,#z7a").hide();
$("#z4a").animate({marginLeft:parseInt($("#z4a").css("marginLeft"))+160+"px"},"slow","swing",
function(){
$("#z4a").css("marginLeft","-160px");
$("ul.z5a:last").prependTo("#z4a");
$("#z2a,#z7a").show();
});
});
//右ボタン
$("#z2a").click(function(){
$("#z2a,#z7a").hide();
$("#z4a").animate({marginLeft:parseInt($("#z4a").css("marginLeft"))-160+"px"},"slow","swing",
function(){
$("#z4a").css("marginLeft","-160px");
$("ul.z5a:first").appendTo("#z4a");
$("#z2a,#z7a").show();
});
});
});
これにもし背景の枠を付けたいのであれば、ボタンより前に絶対配置するか、relativeを指定した一番外側のz68の背景imgとして指定します。(例は絶対配置を使用しました)
わかりやすくoverflowを適用しないと下記のようになります。



overflowで見えなくすると、以下。



コメントor補足情報orご指摘あればをお願いします。
- << 前のページ
- 次のページ >>






