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ご指摘あればをお願いします。

(件名or本文内でキーワード検索できます)



  • << 前のページ
  • 次のページ >>
ページトップへ