JS仿京東移動端手指撥動切換輪播圖效果
如今,移動端web頁面在市場上也是占有相當大的比例,而移動端的輪播圖效果也是很常見的,今天我就來記錄下關于實現(xiàn)一組適用于移動端的可用手指進行撥動切換輪播圖的效果。
這個效果的主要技術點依托于觸屏設備特有的touch事件;好了,接下來就進入主題吧。
首先是html布局:
1. 這里強調(diào)的是記得給html加上viewport這個適口屬性。
2. 由于在撥動第一張圖片以及最后一張圖片的時候需要切換到最后一張以及第一張,要想達到理想效果,需要給第一張圖片前面加上最后一張圖片,而在最后一張圖片后加上第一張圖片。
3. f_l代表的是左浮動
**html代碼如下:**
<ul class='banner_imgs clearfix'> <li class='f_l'> <a href="#"><img src="image/l8.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l1.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l2.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l3.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l4.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l5.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l6.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l7.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l8.jpg" alt="" /></a> </li> <li class='f_l'> <a href="#"><img src="image/l1.jpg" alt="" /></a> </li> </ul> <!-- 輪播圖的 索引 --> <ul class="banner_index clearfix"> <li class="current"></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> <li></li> </ul>
接下來是css樣式:
注意,此處并沒有加上常規(guī)的reset樣式代碼
.jd_banner .banner_imgs {
/* 10倍屏幕寬度 */
width: 1000%;
}
.jd_banner .banner_imgs li {
/* 一倍的屏幕寬度 */
width: 10%;
}
.jd_banner .banner_imgs li a {
display: block;
width: 100%;
}
.jd_banner .banner_imgs li a img {
display: block;
width: 100%;
}
.jd_banner .banner_index {
position: absolute;
bottom: 15px;
left: 50%;
margin-left: -64px;
}
.jd_banner .banner_index li {
float: left;
width: 6px;
height: 6px;
border: 1px solid white;
border-radius: 50%;
margin: 0 5px;
}
.jd_banner .banner_index li.current {
background-color: #fff;
}
最后是最最重要的js代碼啦
1. transitionend 過渡結束后觸發(fā)的效果,在這兒主要是保證圖片切換到最后一張我們手動增加的圖片完成的瞬間,切換回到真正的第一張圖片處;
2. touch事件的三要素: touchstart--手指按上時,touchmove--手指移動時,touchend--手指松開屏幕時;
3. event.touches[0].clientX獲取按下一個手指時的位置,可以打印出event查看其包含有哪些屬性方法;
window.onload = function() {
slide();
}
function slide() {
var bannerImgs = document.querySelector(".banner_imgs");
var Indexs = document.querySelectorAll(".banner_index li");
var imgLis = document.querySelectorAll(".banner_imgs li");
//屏幕寬度
var screenWidth = document.body.offsetWidth;
var index = 1;
//默認顯示的應該是第二張圖片
bannerImgs.style.transform = "translateX(" + screenWidth * index * -1 + "px)";
//添加過渡效果
function setTransition() {
bannerImgs.style.webkitTransition = "all .2s";
bannerImgs.style.transition = "all .2s";
}
//清除過渡效果
function clearTransition() {
bannerImgs.style.webkitTransition = "none";
bannerImgs.style.transition = "none";
}
//設置移動距離
function setTranslateX(distance) {
bannerImgs.style.webkitTransform = "translateX(" + distance + "px)";
bannerImgs.style.transform = "translateX(" + distance + "px)";
}
//控制小圓點
function setPoint() {
for (var i = 0; i < Indexs.length; i++) {
Indexs[i].className = "";
}
Indexs[index - 1].className = "current";
}
//設置定時器
var timer = setInterval(function() {
index++;
setTransition();
setTranslateX(screenWidth * index * -1);
}, 1000);
//添加過渡動畫結束事件
bannerImgs.addEventListener("transitionend", function() {
if (index > 8) {
index = 1;
} else if (index < 1) {
index = 8;
}
clearTransition();
setTranslateX(screenWidth * index * -1);
setPoint();
})
//添加touch事件
var startX = 0;
var moveX = 0;
var isMove = false;
bannerImgs.addEventListener("touchstart", function(event) {
isMove = false;
clearInterval(timer);
startX = event.touches[0].clientX;
})
bannerImgs.addEventListener("touchmove", function(event) {
isMove = true;
moveX = event.touches[0].clientX - startX;
setTranslateX(moveX + index * screenWidth * -1);
})
bannerImgs.addEventListener("touchend", function(event) {
if(isMove && Math.abs(moveX) > screenWidth/3){
if (moveX < 0) {
index++;
} else if (moveX > 0) {
index--;
}
}
setTransition();
setTranslateX(index * screenWidth * -1);
timer = setInterval(function() {
index++;
setTransition();
setTranslateX(screenWidth * index * -1);
}, 1000);
})
}
精彩專題分享:jQuery圖片輪播 JavaScript圖片輪播 Bootstrap圖片輪播
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
JS的函數(shù)調(diào)用棧stack size的計算方法
本篇文章給大家分享了關于JS的函數(shù)調(diào)用棧stack size的計算方法的相關知識點,有興趣的朋友參考學習下。2018-06-06

