功能描述: 自動無縫輪播圖片,底部小圓點跟圖片保持一致;手指左右移動輪播圖,移動距離大於50px播放下一張(或上一張),小於50px則回彈 具體功能實現: 1.定時器 自動輪播圖片 先聲明一個index=0用來存圖片索引; 添加一個定時器,每隔兩秒調用一次,每調用一次定時器(圖片播放一次)index ...
功能描述:
自動無縫輪播圖片,底部小圓點跟圖片保持一致;手指左右移動輪播圖,移動距離大於50px播放下一張(或上一張),小於50px則回彈
具體功能實現:
1.定時器 自動輪播圖片
先聲明一個index=0用來存圖片索引;
添加一個定時器,每隔兩秒調用一次,每調用一次定時器(圖片播放一次)index就加一;
通過transform(變形)屬性和transition(過渡)屬性實現圖片的輪播。
1 var index = 0; 2 var timer = setInterval(function() { 3 index++; 4 var translatex = -index * w; // ul要移動的距離 5 ul.style.transition = 'all .4s'; 6 ul.style.transform = 'translateX(' + translatex + 'px)'; 7 }, 2000);
2.實現無縫輪播並讓小圓點和圖片一致
給ul綁定監聽函數(每次輪播移動的都是整個ul),過渡結束(transitionend)時執行;
判斷索引index是否大於等於3,是的話說明已經播放到最後一張,讓index=0並去掉過渡效果,快速回到第一張;
判斷索引是否小於0,小於0說明用戶一開始是往前滑的,讓index=2並去掉過渡效果,快速到最後一張;
讓底部小圓點跟著一起動(給當前li添加類,把其他的li刪除類)
1 ul.addEventListener('transitionend', function() { 2 if(index >= 3) { 3 index = 0; 4 ul.style.transition = ''; // 去掉過渡效果 5 var translatex = -index * w; 6 ul.style.transform = 'translateX(' + translatex + 'px)'; 7 } else if(index < 0) { 8 index = 2; 9 ul.style.transition = ''; 10 var translatex = -index * w; 11 ul.style.transform = 'translateX(' + translatex + 'px)'; 12 } 13 // 讓底部小圓點跟著一起動 14 // 將帶有current類的li去掉該類 15 ol.querySelector('.current').classList.remove('current'); 16 // 給當前li添加current類 17 ol.children[index].classList.add('current'); 18 })
3.實現圖片跟隨手指移動先聲明幾個變數用來存儲手指初始位置、手指是否在屏幕上移動以及手指移動的距離
var startX = 0; // 手指初始位置 var moveX = 0; // 手指在屏幕上移動的距離 var flag = false; // 記錄用戶是否移動了手指
給ul綁定手指觸摸事件,記錄手指觸摸的初始位置,並清除定時器(不讓它自動輪播了)
1 ul.addEventListener('touchstart', function(e) { 2 startX = e.targetTouches[0].pageX; // 手指的初始觸摸位置(左右輪播,只記錄x就可以了) 3 clearInterval(timer); 4 })
給ul綁定手指移動事件
1 ul.addEventListener('touchmove', function(e) { 2 moveX = e.targetTouches[0].pageX - startX; // 手指移動的距離 3 var translatex = -index * w + moveX; 4 ul.style.transition = 'none'; 5 ul.style.transform = 'translateX(' + translatex + 'px)'; 6 flag = true; // 手指移動了,將flag改為true 7 e.preventDefault(); // 阻止屏幕滾動的預設行為(防止用戶移動輪播圖的時候屏幕也跟著上下滾動) 8 })
4.實現手指離開後圖片的軌跡看用戶是否移動了圖片,flag為true才去判斷:
①手指移動距離大於50px圖片播放上一張或下一張②手指移動距離小於50px圖片回彈;
結束後把flag改為false,並重新開啟定時器讓它繼續自動輪播
1 ul.addEventListener('touchend', function(e) { 2 if(flag) { // flag==true(移動圖片)時才去判斷用戶的移動方向和距離 3 if(Math.abs(moveX) > 50) { // 移動距離大於50時 滑向上一張或下一張(moveX可能為正也可能為負,Math.abs()取絕對值) 4 if(moveX > 0) { // 大於0右滑 圖片索引減一 5 index--; 6 } else { // 小於0左滑 圖片索引加一 7 index++; 8 } 9 var translatex = -index * w; 10 ul.style.transition = 'all .3s'; 11 ul.style.transform = 'translateX(' + translatex + 'px)'; 12 } else { // 小於50px就回彈 13 var translatex = -index * w; 14 ul.style.transition = 'all .1s'; 15 ul.style.transform = 'translateX(' + translatex + 'px)'; 16 } 17 } 18 // 結束後 把flag重新改為false,並開啟定時器讓圖片開始輪播 19 flag = false; 20 // 先清除再開啟,保證只有一個定時器在運行(不然會有bug) 21 clearInterval(timer); 22 timer = setInterval(function() { 23 index++; 24 var translatex = -index * w; 25 ul.style.transition = 'all .4s'; 26 ul.style.transform = 'translateX(' + translatex + 'px)'; 27 }, 2000); 28 })
註:功能還可以繼續優化,比如動態添加圖片,動態添加底部小圓點等。具體實現方法可以參照我上一篇 JavaScript實現動態輪播圖效果 。
具體實現代碼如下:
HTML代碼:
1 <div class="focus"> 2 <ul> 3 <!-- 用戶可能一開始往上一張滑,所以要多添加一個focus3 --> 4 <li><img src="images/focus3.jpg" alt=""></li> 5 <li><img src="images/focus1.jpg" alt=""></li> 6 <li><img src="images/focus2.jpg" alt=""></li> 7 <li><img src="images/focus3.jpg" alt=""></li> 8 <li><img src="images/focus1.jpg" alt=""></li> 9 </ul> 10 <ol> 11 <li class="current"></li> 12 <li></li> 13 <li></li> 14 </ol> 15 </div>
CSS代碼:
1 * { 2 margin: 0; 3 padding: 0; 4 } 5 body { 6 margin: 0 auto; 7 max-width: 540px; 8 min-width: 320px; 9 background: #f6f6f6; 10 } 11 .focus { 12 width: 100%; 13 position: relative; 14 margin-top: 50px; 15 overflow: hidden; 16 } 17 .focus ul { 18 width: 500%; 19 overflow: hidden; 20 margin-left: -100%; 21 } 22 .focus ul li { 23 float: left; 24 width: 20%; 25 } 26 .focus ul img { 27 width: 100%; 28 } 29 .focus ol { 30 position: absolute; 31 bottom: 5px; 32 right: 5px; 33 34 } 35 .focus ol li { 36 width: 5px; 37 height: 5px; 38 display: inline-block; 39 background-color: #fff; 40 border-radius: 4px; 41 transition: all .2s; 42 } 43 .focus .current { 44 width: 15px; 45 }
JavaScript代碼:
1 window.addEventListener('load', function() { 2 var focus = document.querySelector('.focus'); 3 var ul = focus.children[0]; // 獲取focus的第一個孩子,也就是ul 4 var ol = focus.children[1]; 5 var w = focus.offsetWidth; // 獲取focus的寬度 6 var index = 0; // 用來記錄圖片索引 7 var timer = setInterval(function() { // 添加定時器,兩秒調用一次 8 index++; // 每調用一次(輪播一次),圖片索引號+1 9 var translatex = -index * w; // ul要移動的距離 10 ul.style.transition = 'all .4s'; // 添加過渡屬性(css3里的屬性) 11 ul.style.transform = 'translateX(' + translatex + 'px)'; 12 }, 2000); 13 // 給ul綁定監聽函數(每次輪播移動的都是整個ul) 過渡結束(transitionend)時執行 14 ul.addEventListener('transitionend', function() { 15 if(index >= 3) { // 索引 > 3說明已經輪播到最後一張了 16 index = 0; 17 // 去掉過渡效果 快速回到第一張 18 ul.style.transition = ''; 19 var translatex = -index * w; 20 ul.style.transform = 'translateX(' + translatex + 'px)'; 21 } else if(index < 0) { // 索引 < 0說明用戶一開始是往前滑的 22 index = 2; 23 ul.style.transition = ''; 24 var translatex = -index * w; 25 ul.style.transform = 'translateX(' + translatex + 'px)'; 26 } 27 // 讓底部小圓點跟著一起動 28 // 將帶有current類的li去掉該類 29 ol.querySelector('.current').classList.remove('current'); 30 // 給當前li添加current類 31 ol.children[index].classList.add('current'); 32 }) 33 // 手指滑動輪播圖 34 var startX = 0; // 用來存儲手指初始位置 35 var moveX = 0; // 用來存儲手指在屏幕上移動的距離 36 var flag = false; // 記錄用戶是否在圖上移動了手指 37 // 給ul綁定手指觸摸事件 38 ul.addEventListener('touchstart', function(e) { 39 startX = e.targetTouches[0].pageX; // 手指的初始觸摸位置(左右輪播,只記錄x就可以了) 40 clearInterval(timer); // 當手指觸摸屏幕時清除定時器(不讓它自動輪播了) 41 }) 42 // 給ul綁定手指移動事件 43 ul.addEventListener('touchmove', function(e) { 44 moveX = e.targetTouches[0].pageX - startX; // 手指移動的距離 45 var translatex = -index * w + moveX; 46 ul.style.transition = 'none'; 47 ul.style.transform = 'translateX(' + translatex + 'px)'; 48 flag = true; // 手指移動了,將flag改為true 49 e.preventDefault(); // 阻止屏幕滾動的預設行為 50 }) 51 // 給ul綁定手指離開事件 52 ul.addEventListener('touchend', function(e) { 53 if(flag) { // flag==true(移動圖片)時才去判斷用戶的移動方向和距離 54 if(Math.abs(moveX) > 50) { // 移動距離大於50時 滑向上一張或下一張(moveX可能為正也可能為負,Math.abs()取絕對值) 55 if(moveX > 0) { // 大於0右滑 圖片索引減一 56 index--; 57 } else { // 小於0左滑 圖片索引加一 58 index++; 59 } 60 var translatex = -index * w; 61 ul.style.transition = 'all .3s'; 62 ul.style.transform = 'translateX(' + translatex + 'px)'; 63 } else { // 小於50px就回彈 64 var translatex = -index * w; 65 ul.style.transition = 'all .1s'; 66 ul.style.transform = 'translateX(' + translatex + 'px)'; 67 } 68 } 69 // 結束後 把flag重新改為false,並開啟定時器讓圖片開始輪播 70 flag = false; 71 // 先清除再開啟,保證只有一個定時器在運行(不然會有bug) 72 clearInterval(timer); 73 timer = setInterval(function() { 74 index++; 75 var translatex = -index * w; 76 ul.style.transition = 'all .4s'; 77 ul.style.transform = 'translateX(' + translatex + 'px)'; 78 }, 2000); 79 }) 80 })