移動端橫向滑屏之輪播圖

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

clipboard.png

三. 自動輪播 + 小圓點邏輯

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

  • 輪播的同時,小圓點跟着動,排他思想,先移走全部小圓點的類名,再單獨添加
  • 輪播到 10 張時,快速切換到第 5 張圖,因爲全部的滑動都是採用過渡,快速切換採用的清除過渡,因此要設置一個短暫的延時,讓清除過渡不被覆蓋。

clipboard.png

四. 手指移入移出開關定時器

相關文章
相關標籤/搜索