JS實現移動端可滑動輪播圖


JS實現移動端可滑動輪播圖

HTML:

<!--輪播圖-->

<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>
<li class="now"></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
</div>

CSS:

/*輪播圖*/
.jd_banner{
width: 100%;
overflow: hidden;
position: relative;
}
.jd_banner ul:first-child{
width: 1000%;
transform: translateX(-10%);
-webkit-transform: translateX(-10%);
}
.jd_banner ul:first-child li{
width: 10%;
float: left;
}
.jd_banner ul:first-child li a{
display: block;
width: 100%;
}
.jd_banner ul:first-child li a img{
display: block;
width: 100%;
}
.jd_banner ul:last-child{
position: absolute;
width: 118px;
height: 6px;
left: 50%;
margin-left:-59px;
bottom: 6px;
}
.jd_banner ul:last-child li{
width: 6px;
height: 6px;
border-radius: 3px;
border: 1px solid #fff;
margin-left:10px;
float: left;
}
.jd_banner ul:last-child li:first-child{
margin-left:0;
}
.jd_banner ul:last-child li.now{
background: #fff;
}

js:

var banner = function () {
/*1. 自動輪播圖且無縫 定時器,過渡*/
/*2. 點要隨着圖片的輪播改變 根據索引切換*/
/*3. 滑動效果 利用touch事件完成*/
/*4. 滑動結束的時候 如果滑動的距離不超過屏幕的1/3 吸附回去 過渡*/
/*5. 滑動結束的時候 如果滑動的距離超過屏幕的1/3 切換(上一張,下一張)根據滑動的方向,過渡*/

/*輪播圖*/
var banner = document.querySelector('.jd_banner');
/*屏幕寬度*/
var width = banner.offsetWidth;
/*圖片容器*/
var imageBox = banner.querySelector('ul:first-child');
/*點容器*/
var pointBox = banner.querySelector('ul:last-child');
/*所有的點*/
var points = pointBox.querySelectorAll('li');

var addTransition = function () {
imageBox.style.transition = 'all 0.2s';
imageBox.style.webkitTransition = 'all 0.2s';
}
var removeTransition = function () {
imageBox.style.transition = 'none';
imageBox.style.webkitTransition = 'none';
}
var setTranslateX = function (translateX) {
imageBox.style.transform = 'translateX(' + translateX + 'px)';
imageBox.style.webkitTransform = 'translateX(' + translateX + 'px)';
}


/*程序的核心 index */
var index = 1;
var timer = setInterval(function () {
index++;
/*加過渡*/
addTransition();
/*做位移*/
setTranslateX(-index * width);
}, 1000);
/*需要等最后一張動畫結束去判斷 是否瞬間定位第一張*/
//在每次過渡結束后會觸發該函數
imageBox.addEventListener('transitionend', function () {
/*自動滾動的無縫*/
if (index >= 9) {
index = 1;
/*瞬間定位*/
/*清過渡*/
removeTransition();
/*做位移*/
setTranslateX(-index * width);
}
/*滑動的時候也需要無縫*/
else if (index <= 0) {
index = 8;
/*瞬間定位*/
/*清過渡*/
removeTransition();
/*做位移*/
setTranslateX(-index * width);
}
/*根據索引設置點*/
/*此時此刻 index 的取值范圍 1-8(0,8--1,9)*/
/*點索引 index - 1 */
setPoint();
});

/*設置點的方法*/
var setPoint = function () {
/*index 1-8*/
/*清除樣式*/
for (var i = 0; i < points.length; i++) {
var obj = points[i];
obj.classList.remove('now');
}
/*給對應的加上樣式*/
points[index - 1].classList.add('now');
}

/*綁定事件*/
var startX = 0;
var distanceX = 0;
var isMove = false;
imageBox.addEventListener('touchstart', function (e) {
/*清除定時器*/
clearInterval(timer);
/*記錄起始位置的X坐標*/
startX = e.touches[0].clientX;
});
imageBox.addEventListener('touchmove', function (e) {
/*記錄滑動過程當中的X坐標*/
var moveX = e.touches[0].clientX;
/*計算位移 有正負方向*/
distanceX = moveX - startX;
/*計算目標元素的位移 不用管正負*/
/*元素將要的定位=當前定位+手指移動的距離*/
var translateX = -index * width + distanceX;
/*滑動--->元素隨着手指的滑動做位置的改變*/
removeTransition();
setTranslateX(translateX);
//是否發生了移動
isMove = true;
});
imageBox.addEventListener('touchend', function (e) {
/*4. 5. 實現*/
/*要使用移動的距離*/
if (isMove) {
if (Math.abs(distanceX) < width / 3) {
/*吸附*/
addTransition();
setTranslateX(-index * width);
} else {
/*切換*/
/*右滑動 上一張*/
if (distanceX > 0) {
index--;
}
/*左滑動 下一張*/
else {
index++;
}
/*根據index去動畫的移動*/
addTransition();
setTranslateX(-index * width);
}
}
/*最好做一次參數的重置*/
startX = 0;
distanceX = 0;
isMove = false;
/*加上定時器*/
clearInterval(timer);
timer = setInterval(function () {
index++;
/*加過渡*/
addTransition();
/*做位移*/
setTranslateX(-index * width);
}, 1000);
});


}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM