JavaScript+css+HTML實現移動端輪播圖(含原始碼)
阿新 • • 發佈:2022-01-22
目錄
- 1.移動輪播圖
- 2.案例分析
- 3.關於anime.
1.移動輪播圖
移動端輪播圖與PC段輪播圖,在技術選擇上是有區別的,因為移動端的瀏覽器版本非常好,對於H5和3的支援非常完美,所以很多效果可以CSS3的方式實現,比如可以使用 Transorm
屬性替代原來的動畫函式
- 可以自動播放圖片
- 手指可以拖動播放輪播圖
- 新增指示器,但只起到指示作用,點選不能切換圖片
- 不需要左右導航
- 因為移動端輪播圖的寬度一般與螢幕一樣寬,所以focus不設定寬度
- 移動端使用CSS3的方式進行圖片切換,所以可以給 focus_img 去掉 定位和 left屬性
- 因為li標籤設定為float:left 後,就變成了行內塊元素,其寬度由內容決定,而其內容圖片的寬度為520,,所以導致第四章圖片被記下來,解決方案:設定每個li標籤的寬度為ul的20%,再設定圖片的寬度與li標籤一樣狂
2.案例分析
- 自動播放功能
- 開啟定時器
- 移動端移動,可以使用translate 移動
- 想要圖片優雅的移動,請新增過渡效果
- 自動播放功能-無縫滾動
- 注意,我們判斷條件是要等到圖片滾動完畢再去判斷,就是過渡完成後判斷
- 此時需要新增檢測過渡完成事件 transitionend
- 判斷條件:如果索引號等於 3 說明走到最後一張圖片,此時 索引號要復原為 0
- 此時圖片,去掉過渡效果,然後移動
- 如果索引號小於0, 說明是倒著走, 索引號等於2
- 此時圖片,去掉過渡效果,然後移動
3.關於anime.js
Anime.js (/æn..me/)
是一個輕量的 動畫庫, 擁有簡單而強大的API。可對 CSS 屬性、 SVG、 DOM 和Script 物件進行動畫。
下面我們輪播圖的實現就是基於這個js外掛(可以訪問官網下載外掛)
程式碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>輪播圖</title> <style> * { margin: 0; padding: 0; } ul { list-style-type: none; } .focus { position: relative; /*再移動端,如果不設定如下的樣式,則其中的元素可以拖動*/ overflow: hidden; } ul.focus_img { width: 600%; margin-left: -100%; /* 以iphone6 為例 375*5 */ } .focus_img li { /* border: 1px solid black; */ float: left; width: 16.666%; /*375*6*0.2*/ } .focus_img img { width: 100%; /*375*6*0.2*/ } .focus_sort { position: absolute; right: 20px; bottom: 20px; border-radius: 5px; /* border: 1px solid black; */ } .focus_sort li { display: inline-block; width: 20px; height: 10px; background-color: #fff; margin-right: 10px; cursor: pointer; } .focus_sort .current { background-color: red; } </style> </head> <body> <div class="focus"> <!--輪播圖片--> <ul class="focus_img"> <li><img src="./images/focus4.jpg" alt="JavaScript+css+HTML實現移動端輪播圖(含原始碼)"></li> <li><img src="./images/focus1.webp" alt="JavaScript+css+HTML實現移動端輪播圖(含原始碼)"></li> <li><img src="./images/focus2.webp" alt="JavaScript+css+HTML實現移動端輪播圖(含原始碼)"></li> <li><img src="./images/focus3.jpg" alt="JavaScript+css+HTML實現移動端輪播圖(含原始碼)"></li> <li><img src="./images/focus4.jpg" alt="JavaScript+css+HTML實現移動端輪播圖(含原始碼)"></li> <li><img src="./images/focus1.webp" alt="JavaScript+css+HTML實現移動端輪播圖(含原始碼)"></li> </ul> <ul class="focus_sort"> <li class="current" data-index="0"></li> <li data-index="1"></li> <li data-index="2"></li> <li data-inhttp://www.cppcns.comdex="3"></li> </ul> </div> <script> var focus_img = document.querySelector('.focus_img') var focus = document.querySelector('.focus') var focusWidth客棧 = focus.offsetWidth var focus_sort = document.querySelector('.focus_sort') // 宣告變數,用來儲存輪播圖的計數器 var index = 0 // 宣告變數,儲存指示器計數器 var sort = 0 var timer = setInterval(function () { index++ var translatex = -index * focusWidth focus_img.style.transition = 'all 1s' focus_img.style.transform = 'TranslateX(' + translatex + 'px)' // 指示器切換 changeSort() },3000) // 切換指示器 function changeSort() { // for (var i = 0; i < focus_sort.children.length; i++) { // focus_sort.children[i].className = '' // } // 將上面的程式碼替換成使用classList實現 focus_sort.querySelector('.current').classList.remove('current') focus_sort.children[sort].className = 'current' } // 為focus_img 新增過渡結束事件(transitionend),每當過渡效果完成後 // 會觸發這個事件 // 如果使用者快速拖動元素,在過渡沒有完成的情況下就再次拖動元素,則會 // 打破過渡的執行,導致不http://www.cppcns.com會觸發這個事件 focus_img.addEventListener('transitionend',function () { /*如果index==4,說明當前輪播圖切換完成後,顯示的是最後一張圖片 而最後一張圖片與第一張圖片一樣,所以可以做如下操作: 快速的將ul拖動到初始位置*/ if (index == 4) { index = 0 focus_img.style.transition = 'none' focus_img.style.transform = 'TranslateX(0px)' } else if (index < 0) { index = 3 var translatex = -index * focusWidth focus_img.style.transition = 'none' focus_img.style.transform = 'TranslateX(' + translatex + 'px)' } // 將九流閥設定為true flag = true sort = index changeSort() }) /* 實現手指拖動實現輪播效果 1)手指按下,停止自動輪播,手指離開螢幕繼續開啟自動輪播 2)實現輪播圖(focus_img)隨著手指的移動而移動 3)手指離開屏幕後,判斷使用者手指的移動距離,根據距離判斷是切換輪播圖還是回彈輪播圖 4)如果使用者只是按下手指,並沒有移動,然後手指就離開螢幕,可以不執行第三步。:如何判斷: 只要使用者移動手指就會觸發touchmove事件,如果使用者沒有移動手指,不會觸發這個事件 */ // 宣告變數,儲存手指的按下時的位置 var startx = 0 // 宣告變數,儲存手指的移動距離 var movex = 0 // 宣告一個變數,節流閥,用於指示是否可以切換輪播圖;如果只為true:可以,值為false:不可以 var flag = true // 定義變數,標誌使用者是否移動了手指 isMoove = false // false 表示沒有移動手指 focus_img.addEventListener('touchstart',function (e) { // 停止計時器 clearInterval(timer) // 獲取手指按下時的位置,賦值給startx startx = e.targetTouches[0].pageX }) focus_img.addEventListener('touchmove',function (e) { // 只要使用者觸發了touchmove事件,就說明使用者的手指在元素上移動了 isMoove = true if (flag) { // 獲取手指的移動距離 movex = e.targetTouches[0].pageX - startx // 計算focwww.cppcns.comus_img 的新座標:原始位置+手指移動距離 var translatex = - index * focusWidth + movex focus_img.style.transition = 'none' this.style.transform = 'TranslateX(' + translatex + 'px)' } }) focus_img.addEventListener('touchend',function () { if (!isMoove) { return false } isMoove = false console.log(movex); if (flag) { // 將節流閥設定為false flag = false // console.log(movex); if (Math.abs(movex) >= 50) { if (movex > 0) { index-- } else { index++ } var translatex = -index * focusWidth focus_img.style.transition = 'all 1s' this.style.transform = 'TranslateX(' + translatex + 'px)' } else { // 顯示當前的輪播圖 var translatex = -index * focusWidth focus_img.style.transition = 'all .3s' this.style.transform = 'TranslateX(' + translatex + 'px)' } } // 重新開啟自動輪播圖 clearInterval(timer) timer = setInterval(function () { index++ var translatex = -index * focusWidth focus_img.style.transition = 'all 1s' focus_img.style.transform = 'TranslateX(' + translatex + 'px)' },3000) }) </script> </body> </html>