定番
新着
履歴

jQuery 要素のスライド

jQuery 要素のスライド
左右のボタンをクリック、タップすると要素が左へ移動します。スワイプにも対応しました。

複数のテキストや画像を並べて表示する場合、そのまま並べてしまうと画面が埋まってしまいます。

そんな時のサンプルです。

高さや幅を固定して、はみ出す部分を隠し、ボタンを押すとアニメーションでひとつずつ表示します。

ボックスの数と横幅の値を取得し、どんなサイズでも最初から最後までで止まります。

横幅が%指定なので、スマホの場合だと横幅に合わせ、見えている部分が狭まります。

<
aaa
bbb
ccc
ddd
>

以下がjQuery部分の上部です。

ボックスの横幅やマージンの値を取得し、一つ分の幅でアニメーションを実行します。

連打防止や押せる状態に見せるクラスの操作をしています。

	item_size = parseInt($(".box_in").find(".item").css('width'), 10);
	item_margin_l = parseInt($(".box_in").find(".item").css('margin-left'), 10);
	item_margin_r = parseInt($(".box_in").find(".item").css('margin-right'), 10);

	size = item_size+item_margin_l+item_margin_r;


	$(".btn_l").on('click', function() {
		//戻る
		item_cnt = $(this).parent().find(".item").length;
		l = parseInt($(this).parent().find(".box_in").css('left'), 10);
		ll = l+size;
		if(l < 0){
			if(l % size == 0){
				$(this).parent().find(".box_in").animate({ left:ll+"px"}, 500);
				$(this).parent().find(".btn_r").addClass("act");
				if(0 == ll){
					$(this).removeClass("act");
				}
			}
		}
	});
	$(".btn_r").on('click', function() {
		//進む
		item_cnt = $(this).parent().find(".item").length;
		min_left = 0 - (item_cnt - 1) * size;
		l = parseInt($(this).parent().find(".box_in").css('left'), 10);
		ll = l-size;
		if(l > min_left){
			if(l % size == 0){
				$(this).parent().find(".box_in").animate({ left:ll+"px"}, 500);
				$(this).parent().find(".btn_l").addClass("act");
				if(min_left == ll){
					$(this).removeClass("act");
				}
			}
		}
	});

以下はスワイプに対応する部分、ほぼクリックと同じ内容です。

		$('.box_out').on('touchstart', onTouchStart); //指が触れたか検知
		$('.box_out').on('touchmove', onTouchMove); //指が動いたか検知
		$('.box_out').on('touchend', onTouchEnd); //指が離れたか検知
		var direction, position;

		//スワイプ開始時の横方向の座標を格納
		function onTouchStart(event) {
			position = getPosition(event);
			direction = ''; //一度リセットする
		}

		//スワイプの方向(left/right)を取得
		function onTouchMove(event) {
			if (position - getPosition(event) > 70) { // 70px以上移動しなければスワイプと判断しない
				direction = 'left'; //左と検知
			} else if (position - getPosition(event) < -70){ // 70px以上移動しなければスワイプと判断しない
				direction = 'right'; //右と検知
			}
		}

		function onTouchEnd(event) {
			if (direction == 'right'){//右へスワイプ 戻る

				item_cnt = $(this).parent().find(".item").length;
				l = parseInt($(this).parent().find(".box_in").css('left'), 10);
				ll = l+size;
				if(l < 0){
					if(l % size == 0){
						$(this).parent().find(".box_in").animate({ left:ll+"px"}, 500);
						$(this).parent().find(".btn_r").addClass("act");
						if(0 == ll){
							$(this).parent().find(".btn_l").removeClass("act");
						}
					}
				}

			} else if (direction == 'left'){//左へスワイプ 進む

				item_cnt = $(this).parent().find(".item").length;
				min_left = 0 - (item_cnt - 1) * size;
				l = parseInt($(this).parent().find(".box_in").css('left'), 10);
				ll = l-size;
				if(l > min_left){
					if(l % size == 0){
						$(this).parent().find(".box_in").animate({ left:ll+"px"}, 500);
						$(this).parent().find(".btn_l").addClass("act");
						if(min_left == ll){
							$(this).parent().find(".btn_r").removeClass("act");
						}
					}
				}


			}
		}

		//横方向の座標を取得
		function getPosition(event) {
			return event.originalEvent.touches[0].pageX;
		}

以下は実装に伴うスタイルですが、要件に応じて調整してください。

.base{
	width: 100%;
	margin:10px 0;
	height:140px;
	clear:both;
}
.box_out{
	float: left;
	width: 90%;
	height: 120px;
	overflow-x: hidden;
	background: #CCC;
	padding: 10px 0;
}
.box_in{
	width: 600px;
	position: relative;
	float: left;
}
.box_in .item{
	background: #EEF;
	width: 120px;
	height: 120px;
	margin: 0 10px 0 0;
	float: left;
	line-height:120px;
	font-size:20px;
	text-align:center;
}
.btn_l{
	float:left;
	background: #999;
	color: #FFF;
	height: 140px;
	line-height: 140px;
	cursor: pointer;
	width:5%;
	text-align: center;
}
.btn_r{
	float:left;
	background: #999;
	color: #FFF;
	height: 140px;
	line-height: 140px;
	cursor: pointer;
	width:5%;
	text-align: center;
}

.act{
	background: #99F;
}


最後に以下はHTMLのタグです。

複数同じ要素が設置されてもよいように、クラスのみで構成しました。

itemクラスは任意の個数の設置が可能です。


<div class="base">
	<div class="btn_l"><</div>
	<div class="box_out">
		<div class="box_in">
			<div class="item">aaa</div>
			<div class="item">bbb</div>
			<div class="item">ccc</div>
			<div class="item">ddd</div>
		</div>
	</div>
	<div class="btn_r act">></div>
</div>

2018-03-10 16:04:51
このページの二次元コード

関連するサンプル

人気記事ランキング

© 2018 kipure
Top