圖片描述html
移動端的輪播圖能夠有不少方式實現,最多見的能夠使用定位 + 手指事件。可是我這裏介紹的是 CSS3 中的 2d 變換和手指事件,由於變換屬性的代碼更加簡潔優雅web
* { padding: 0; margin: 0; } img { display: block; } li { list-style: none; } input { outline: none; } a { text-decoration: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } html,body { height: 100%; overflow: hidden; }
CSS 中的初始化瀏覽器
// 阻止瀏覽器的默認行爲 document.addEventListener("touchstart", function(event) { event.preventDefault() }); // rem 適配 (function() { var styleNode = document.createElement("style") var width = document.documentElement.clientWidth styleNode.innerHTML = 'html {font-size: '+ width/16 +'px;}' document.head.appendChild(styleNode) })(); // 點透 (function() { var aNodes = document.querySelectorAll("a") for (var i = 0; i < aNodes.length; i++) { aNodes[i].addEventListener("touchstart", function() { window.location.href = this.href }) } })();
這裏移動端寫頁面以前跟 PC 端有些不一樣,設計師給咱們的像素值可能與移動設備不匹配,首先要進行rem 適配,還有阻止瀏覽器的默認行爲,一般狀況下,還有處理點透。app
<!--模擬頻幕區域--> <section class="wrap"> <ul class="list"> <li> <img src="img/1.jpg" alt="" /> </li> <li> <img src="img/2.jpg" alt="" /> </li> <li> <img src="img/3.jpg" alt="" /> </li> <li> <img src="img/4.jpg" alt="" /> </li> <li> <img src="img/5.jpg" alt="" /> </li> </ul> </section> var list = document.querySelector(".list") var li = document list.innerHTML += list.innerHTML var startX = 0 var eleX = 0 var translateX = 0 var now = 0 list.addEventListener("touchstart", function(event) { list.style.transition = 'none' if (now == 0){ now = 5 } else if (now == 9) { now = 4 } transformCss(list,"translateX",-now*document.documentElement.clientWidth) var touch = event.changedTouches[0] startX = touch.clientX eleX = transformCss(list, "translateX") }) list.addEventListener("touchmove", function(event) { var touch = event.changedTouches[0] var endX = touch.clientX var disX = endX - startX translateX = disX + eleX // 清除過渡 list.style.transition = 'none' list.style.transform = transformCss(list,'translateX',translateX) }) list.addEventListener("touchend", function() { var left = transformCss(list, 'translateX') now = Math.round(-left / document.documentElement.clientWidth) translateX = -now * document.documentElement.clientWidth list.style.transition = '0.5s' transformCss(list,'translateX',translateX) })
這裏設計的無縫輪播很巧妙,把圖片的 li 標籤複製了一份,也就是總共 10 張圖,當滑到 1 圖時,咱們在點擊後迅速切到第 6 張,當滑到最後一張圖時,切換到第 5 張。ide
var autoSlide = function() { setInterval(function() { if(now == 9) { now = 4 } list.style.transition = 'none' transformCss(list, 'translateX', -now * document.documentElement.clientWidth) // 設置一個延時,讓過渡生效 setTimeout(function() { now++ list.style.transition = '0.5s' transformCss(list, 'translateX', -now * document.documentElement.clientWidth) for(var i = 0; i < spans.length; i++) { spans[i].classList.remove("active") } spans[now % 5].classList.add("active") }, 20) }, 1000) }
這裏自動輪播有幾個邏輯this