图片描述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