2013
6
19
$(function(){
$("div").bind({
//①タッチ開始イベント
'touchstart' : function(e){
$("#hoge").text("タッチされました!!(゚∀゚)");
},
//②フリック中イベント
'touchmove' : function(e){
$("#hoge").text("フリック移動中!!(゚Д゚≡゚Д゚)");
},
//③タッチ終了イベント
'touchend' : function(e){
$("#hoge").text("タッチ終了(´・ω・`)");
}
})
});
<div id="flame"> <ul class="clearfix" id="slider"> <li><img alt="" src="画像一枚目" width="300" height="381" /></li> <li><img alt="" src="画像二枚目" width="300" height="381" /></li> <li><img alt="" src="画像三枚目" width="300" height="381" /></li> </ul> <p id="prev">«</p> <p id="next">»</p> </div>
#flame {
width:300px;
height:381px;
position:relative;
overflow:hidden;
margin: 10px auto;
}
ul#slider {
position:absolute;
z-index:0;
background:#999;
width:900px;
}
ul#slider li {
float:left;
width:300px;
height:381px;
background:#333;
list-style:none;
}
ul#slider li img{
width: 100%;
}
.clearfix:after {
clear: both;
content: ".";
display: block;
height: 0;
visibility: hidden;
}
p#prev, p#next {
position:absolute;
top:30%;
width:60px;
height:100px;
text-indent:-9999px;
display:block;
z-index:100;
}
p#prev {
left:0;
background:url(前項アイコン画像のパス) no-repeat left center;
}
p#next {
right:0;
background:url(次項アイコン画像のパス) no-repeat right center;
}
$(function(){
var flickBox = $('#flame'); //①
var flickList = $('ul#slider'); //②
var flickListImg = flickList.children('li'); //③
var imgListCount = flickListImg.length; //④
var imgListWidth = 300; //⑤
var imgListHeight = 381; //⑥
var slideLoop = true; //⑦
var next = $('p#next'); //⑧
var prev = $('p#prev'); //⑨
var slideSpeed = 300; //⑩
var imgListCotainer = imgListWidth * imgListCount; //⑪
prev.click(function () { //⑫
var offset = flickList.position().left; //⑬
switch (true){
case (offset == 0):
if(slideLoop == true){
flickList.animate({left: -(imgListWidth * 2) },slideSpeed); //⑭
}else{
flickList.animate({left: 100 },100).animate({left: 0 },slideSpeed); //⑮
}
break;
case (offset == -imgListWidth):
flickList.animate({left: 0 },slideSpeed);
break;
case (offset == -(imgListWidth * 2)):
flickList.animate({left: -imgListWidth },slideSpeed);
break;
}
});
next.click(function () { //⑯
var offset = flickList.position().left;
switch (true){
case (offset == 0):
flickList.animate({left: -imgListWidth },slideSpeed);
break;
case (offset == -imgListWidth):
flickList.animate({left: -(imgListWidth * 2) },slideSpeed);
break;
case (offset == -(imgListWidth * 2)):
if(slideLoop == true){
flickList.animate({left: 0 },slideSpeed);
}else{
flickList.animate({left: -(imgListWidth * 2 + 100) },100).animate({left: -600 },slideSpeed);
}
break;
}
});
});
$(function () {
var flickBox = $('#flame');
var flickList = $('ul#slider');
var flickListImg = flickList.children('li');
var imgListCount = flickListImg.length;
var slideLoop = true;
var slideSpeed = 500;
var prev = $('p#prev');
var next = $('p#next');
//①フリック画像初期レイアウト設定
var imgListWidth = 300;
var imgListHeight = 381;
var imgListCotainer = imgListWidth * imgListCount;
var slideDecision = imgListWidth / 2;
var slideLimit = imgListCotainer - imgListWidth;
$(flickList).bind({
//②タッチ開始イベント処理
'touchstart': function(e) {
this.touchX = event.changedTouches[0].pageX;
this.slideX = flickList.position().left;
},
//③フリックイベント処理
'touchmove': function(e) {
this.slideX = this.slideX - (this.touchX - event.changedTouches[0].pageX );
this.accelX = (event.changedTouches[0].pageX - this.touchX) * 5;
this.touchX = event.changedTouches[0].pageX;
$(this).css("left", this.slideX);
},
//④タッチ終了イベント処理
'touchend': function(e) {
if(this.accelX > slideDecision){
this.accelX = slideDecision;
}
if(this.accelX < -slideDecision){ this.accelX = -slideDecision; } this.slideX += this.accelX; this.accelX = 0; //⑤左の端までフリックした場合の跳ね返り if(this.slideX > 0) {
this.slideX = 0;
if(slideLoop == true){
$(this).animate({left: -((imgListWidth * imgListCount) - imgListWidth) },slideSpeed);
}else{
$(this).animate({left:this.slideX},slideSpeed);
};
//⑥右の端までフリックした場合の跳ね返り
}else if(this.slideX < -slideLimit - 100) { if(slideLoop == true){ $(this).animate({left: 0 },slideSpeed); }else{ this.slideX = -slideLimit; $(this).animate({left:this.slideX},slideSpeed); } //⑦スライドの慣性エフェクト }else{ var edge = this.slideX % imgListWidth; if(edge > -(imgListWidth / 3)){
this.slideX -= edge;
$(this).animate({left:this.slideX},100,"linear");
}else{
this.slideX = this.slideX - edge - imgListWidth;
$(this).animate({left:this.slideX},100,"linear");
}
}
}
});
});
</pre> <ul class="panelNavi clearfix"> <li><a href="#"><img alt="" src="1枚目の画像" width="96" height="122" /></a></li> <li><a href="#"><img alt="" src="2枚目の画像" width="96" height="122" /></a></li> <li><a href="#"><img alt="" src="3枚目の画像" width="96" height="122" /></a></li> </ul> <pre>
ul.panelNavi {
margin: 0 auto;
width: 318px;
}
.clearfix:after {
clear: both;
content: ".";
display: block;
height: 0;
visibility: hidden;
}
.panelNavi li {
float: left;
padding: 3px;
text-align: center;
width: 100px;
}
.panelNavi li a{
display:block;
margin:2px;
}
.panelNavi li a.imgHover{
border:#4ae 2px solid;
}
.panelNavi li a.imgNoHover{
border:#FFF 2px solid;
}
thumbnail.click(function(){
var index = thumbnail.index(this);
var i=0;
while (i <= index){
flickList.animate({left: -(imgListWidth * i) },slideSpeed);
i=i+1;
}
});
以上、フリック対応機能、ON/OFF切り替えができるループ機能、タップしてもスライドさせられるページャー機能、サムネイル画像からもスライドできる機能を加えたフリックスライダーのテスト版ができました。
あくまでロジックの把握を兼ねてテスト版で自作したものなので、動作のエラー等はご愛嬌というコトで・・・。
今回たくさん勉強になりましたが、記事の執筆中に色々と回収が必要なところが出てきて違う仕様を思いついたので、近日中に改良版を公開できればと思います。
乞うご期待!!!・・・はしなくて大丈夫です。
