js實(shí)現(xiàn)移動(dòng)端輪播圖滑動(dòng)切換
本文實(shí)例為大家分享了js實(shí)現(xiàn)移動(dòng)端輪播圖滑動(dòng)切換的具體代碼,供大家參考,具體內(nèi)容如下
移動(dòng)端手勢(shì)
輪播圖分析
1、自動(dòng)輪播且無縫 [定時(shí)器、過渡動(dòng)畫]
2、分頁器要隨著圖片的輪播而改變 [根據(jù)索引切換]
3、滑動(dòng)效果 [touch事件]
4、圖片隨著分頁器變化
5、滑動(dòng)結(jié)束的時(shí)候,如果滑動(dòng)的距離不超過屏幕的1/3,就恢復(fù)回去 [過渡]
6、滑動(dòng)結(jié)束的時(shí)候,如果滑動(dòng)的距離超過屏幕的1/3,就切換 [滑動(dòng)方向 + 過渡]]
html頁面結(jié)構(gòu)
<!--輪播圖--> <div class="jd_banner"> <ul class="clearfix"> <li><a href="#" ><img src="images/l8.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l1.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l2.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l3.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l4.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l5.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l6.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l7.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l8.jpg" alt=""></a></li> <li><a href="#" ><img src="images/l1.jpg" alt=""></a></li> </ul> <ul class="clearfix"> <li class="now"></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul> </div>
js部分
/* 動(dòng)態(tài)設(shè)置過渡 */
var addTransition = function (ele) {
ele.style.transition = "all .6s";
ele.style.webkitTransition = "all .6s";
};
/* 移除過渡效果 */
var removeTransition = function (ele) {
ele.style.transition = "none";
ele.style.webkitTransition = "none";
};
/* 設(shè)置容器平移 -- 也就是滑動(dòng)動(dòng)畫
ele:當(dāng)前元素
xwidth:平移的距離
*/
var setTranslateX = function (ele, xwidth) {
ele.style.transform = "translateX(" + xwidth + "px)";
ele.style.webkitTransform = "translateX(" + xwidth + "px)";
}
var banner = function () {
/** 輪播圖分析 */
/** 1 自動(dòng)輪播且無縫 [定時(shí)器、過渡動(dòng)畫]
* 2 點(diǎn)要隨著圖片的輪播而改變 [根據(jù)索引切換]
* 3 滑動(dòng)效果 [touch事件]
* 4 圖片隨著點(diǎn)而變化
* 5 滑動(dòng)結(jié)束的時(shí)候,如果滑動(dòng)的距離不超過屏幕的1/3,就恢復(fù)回去 [過渡]
* 6 滑動(dòng)結(jié)束的時(shí)候,如果滑動(dòng)的距離超過屏幕的1/3,就切換 [滑動(dòng)方向 + 過渡]]
*/
var timer = ''
/* 封裝定時(shí)器函數(shù) */
var startInterval = function () {
timer = setInterval(function () {
index++;// 基于索引 做位移
addTransition(imgBox); // 為輪播圖片組的ul設(shè)置過渡函數(shù)
setTranslateX(imgBox, -index * width);// 根據(jù)當(dāng)前索引值計(jì)算平移的距離
}, 2000);
}
var banner = document.querySelector(".jd_banner");
var width = banner.offsetWidth; // 屏幕的寬度
var imgBox = banner.querySelector("ul:first-child"); // 輪播圖片ul
var length = imgBox.querySelectorAll("li").length; // 圖片的個(gè)數(shù)
var pointBox = banner.querySelector("ul:last-child");// 分頁器ul
var points = pointBox.querySelectorAll("li");// 分頁器集合
var index = 1; // 初始化索引,由于要無縫銜接,索引從1開始
startInterval();
/* transitionend事件:當(dāng)元素過渡動(dòng)畫結(jié)束后執(zhí)行
每次輪播動(dòng)畫結(jié)束后,判斷當(dāng)前索引值
*/
imgBox.addEventListener("transitionend", function () {
if (index >= length - 1) {
index = 1;
// 清過渡,瞬間定位imgBox
removeTransition(imgBox);
setTranslateX(imgBox, -index * width);
}
// 滑動(dòng)的時(shí)候也需要無縫
else if (index <= 0) {
index = 8;
removeTransition(imgBox);
setTranslateX(imgBox, -index * width);
}
showPoint(index - 1); // 改變分頁器狀態(tài)
});
var showPoint = function (index) {
for (var i = 0; i < points.length; i++) {
points[i].className = '';
}
points[index].className = "now";
};
/* 滑動(dòng)切換 (touch事件) */
var startX = 0; // 觸摸起始點(diǎn)
imgBox.addEventListener("touchstart", function (e) {
// 記錄起始位置的X坐標(biāo)
clearInterval(timer);
startX = e.touches[0].clientX;
});
var distanceX = 0;
var translateX = 0;
// **** 加一個(gè)標(biāo)識(shí),判斷用戶有沒有滑動(dòng)
var isMove = false
imgBox.addEventListener("touchmove", function (e) {
var moveX = e.touches[0].clientX;
// 計(jì)算位移,有正負(fù)方向
distanceX = moveX - startX;
// 計(jì)算目標(biāo)元素的位移
// 元素將要的定位 = 當(dāng)前定位 + 手指移動(dòng)的距離
translateX = -index * width + distanceX;
// ********** 要想圖片實(shí)時(shí)地跟著手指走,一定要把過渡清楚掉
removeTransition(imgBox)
setTranslateX(imgBox, translateX);
isMove = true;// 確定用戶有滑動(dòng)
e.preventDefault(); // 去除移動(dòng)端瀏覽器默認(rèn)的滑動(dòng)事件
});
imgBox.addEventListener("touchend", function (e) {
if (isMove) {
if (Math.abs(distanceX) > width / 3) {
// 切換
if (distanceX > 0) {
// 上一張
index = index - 1;
} else {
// 下一張
index = index + 1;
}
addTransition(imgBox); // 設(shè)置過渡動(dòng)畫
setTranslateX(imgBox, -index * width);
if (index >= 9) {
index = 1;
}
if (index <= 0) {
index = 8;
}
showPoint(index - 1);
} else {
// 不滿足滑動(dòng)條件,回退到之前的狀態(tài)
addTransition(imgBox);
setTranslateX(imgBox, -index * width);
showPoint(index - 1);
}
}
// **** 最好做一次參數(shù)的重置
startX = 0;
distanceX = 0;
isMove = false;
// ****** 為了嚴(yán)謹(jǐn),再清一次定時(shí)器
clearInterval(timer)
// 加上定時(shí)器
startInterval();
});
};
總結(jié)
原生js實(shí)現(xiàn)滑動(dòng)切換的原理主要還是利用移動(dòng)端的手勢(shì)事件
- touchstart 當(dāng)手指觸摸屏幕時(shí)觸發(fā)
- touchmove 當(dāng)手指在屏幕中滑動(dòng)的時(shí)候觸發(fā)
- touchend 當(dāng)手指離開屏幕時(shí)觸發(fā)
利用touch相關(guān)事件實(shí)現(xiàn)移動(dòng)端常見滑動(dòng)效果和移動(dòng)端常見的手勢(shì)事件。
而swiper插件的底層實(shí)現(xiàn)原理也是這個(gè),因此,為了快速開發(fā),還是使用swiper插件最好
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaScript+canvas實(shí)現(xiàn)框內(nèi)跳動(dòng)小球
這篇文章主要為大家詳細(xì)介紹了JavaScript+canvas實(shí)現(xiàn)框內(nèi)跳動(dòng)小球,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
JS中產(chǎn)生20位隨機(jī)數(shù)以0-9為例也可以是a-z A-Z
本節(jié)主要介紹了JS如何產(chǎn)生隨機(jī)數(shù),本例產(chǎn)生20位隨機(jī)數(shù)以0-9為例也可以是a-z A-Z,需要的朋友可以參考下2014-08-08
JavaScript基礎(chǔ)之靜態(tài)方法和實(shí)例方法分析
這篇文章主要介紹了JavaScript基礎(chǔ)之靜態(tài)方法和實(shí)例方法,簡單分析了javascript靜態(tài)方法及實(shí)例方法的定義、使用相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2018-12-12
JavaScript嚴(yán)格模式禁用With語句的原因
看了很多遍JavaScript嚴(yán)格模式,其中有說“禁用With語句”今天禁不住想知道為何“嚴(yán)格模式”就容不下with語句呢,如果你也表示疑惑可以看看哦2014-10-10
javascript 判斷頁面訪問方式電腦或者移動(dòng)端
這篇文章主要介紹了 判斷頁面訪問方式電腦或者移動(dòng)端的相關(guān)資料,這里提供了三種方法,需要的朋友可以參考下2016-09-09
javascript對(duì)象的創(chuàng)建和訪問
這篇文章主要為大家詳細(xì)介紹了javascript對(duì)象的創(chuàng)建和訪問實(shí)現(xiàn)方法,感興趣的小伙伴們可以參考一下2016-03-03

