1. 程式人生 > >原生js實現簡單的移動端輪播圖效果

原生js實現簡單的移動端輪播圖效果

近期接觸了移動端html5和css3,想加入些輪播圖,於是在網上搜集整理了一些資料,經自己補充改進使之較為完善

原生JavaScript 移動端web輪播圖片

實現功能

  1. 索引小圓點
  2. 過渡滑動動畫的定時輪播
  3. 移動端可以滑動切換圖片
  4. 滑動距離不夠則吸附回去

效果圖

程式碼

  1. slideshow.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport"
              content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
        <title>移動端-輪播圖</title>
        <link rel="stylesheet" href="slideshow.css">
    </head>
    <body>
    <div class="layout">
        <div class="banner">
            <ul class="swipe" id="swipe">
                <li><a href="#"><img src="images/l5.jpg"></a></li>
                <li><a href="#"><img src="images/l1.jpg"></a></li>
                <li><a href="#"><img src="images/l2.jpg"></a></li>
                <li><a href="#"><img src="images/l3.jpg"></a></li>
                <li><a href="#"><img src="images/l4.jpg"></a></li>
                <li><a href="#"><img src="images/l5.jpg"></a></li>
                <li><a href="#"><img src="images/l1.jpg"></a></li>
            </ul>
            <ul class="swipe-btn-list" id="swipe-btn-list">
                <li class="now"></li>
                <li></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
        </div>
    </div>
    
    <script src="base.js"></script>
    <script src="slideshow.js"></script>
    </body>
    </html>
  2. slideshow.css
    *,
    ::before,
    ::after{
        padding: 0;
        margin: 0;
        -webkit-box-sizing: border-box;/*相容移動端主流瀏覽器*/
        box-sizing: border-box;
        -webkit-tap-highlight-color: transparent;/*清除移動端點選高亮效果*/
    }
    body{
        font-family:Microsoft YaHei,sans-serif;
        font-size: 14px;
        color: #333;
    }
    ol,ul{
        list-style: none;
    }
    /*清除浮動*/
    .swipe::before,
    .swipe::after{
        content: "";
        display: block;
        height: 0;
        line-height: 0;
        visibility: hidden;
        clear: both;
    }
    
    .layout{
        width: 100%;
        max-width: 750px;
        min-width: 320px;
        margin: 0 auto;
        position: relative;
    }
    .banner{
        width: 100%;
        overflow: hidden;
        position: relative;
    }
    .swipe{
        width: 1000%;
        -webkit-transform: translateX(-10%);
        transform: translateX(-10%);
    }
    .swipe li{
        width: 10%;
        float: left;
    }
    .swipe li a{
        display: block;
        width: 100%;
    }
    .swipe li a img{
        width: 100%;
        display: block;
    }
    .swipe-btn-list{
        position: absolute;
        bottom: 6px;
        width: 100%;
        text-align: center;
    }
    .swipe-btn-list li{
        width: 6px;
        height: 6px;
        border: 1px solid #fff;
        border-radius: 50%;
        display: inline-block;
        margin-left: 10px;
    }
    .swipe-btn-list li:first-child{
        margin-left: 0;
    }
    .swipe-btn-list li.now{
        background: #fff;
    }
  3. base.js
    /**
     * Improved by yanzuyue on 2018/10/20.
     */
    
    /*封裝一些公用的事件或者公用的方法*/
    /*定義的一個名稱空間*/
    window.my = {};
    /*封裝一個事件 過渡結束事件*/
    my.transitionEnd = function(dom,callback){
        //1.給誰加事件
        //2.事件觸發後處理什麼業務
        if(!dom || typeof dom != 'object'){
            //沒dom的時候或者不是一個物件的時候 程式停止
            return false;
        }
        dom.addEventListener('transitionEnd', function(){
            callback && callback();
        });
        dom.addEventListener('webkitTransitionEnd', function(){
            callback && callback();
        });
    }
    
  4. slideshow.js
    /**
     * Improved by yanzuyue on 2018/10/20.
     */
    window.onload = function(){
        /*
         * 1.設定定時器 自動輪播 無縫銜接
         * 2.點需要隨著輪播的滾動改變對應的點  改變當前樣式
         * 3.手指滑動的時候讓輪播圖滑動   touch事件  記錄座標軸的改變 改變輪播圖的定位(位移css3)
         * 4.當滑動的距離不超過一定的距離的時候  需要吸附回去
         * 5.當滑動超過了一定的距離 需要跳到下一張或者上一張
         * */
    
        var imageCount = 5; //頁面中用來輪播的圖片有5張
        var banner = document.querySelector('.banner');//輪播圖大盒子
        var width = banner.offsetWidth;//圖片的寬度
        var imageBox = document.getElementById("swipe");//圖片盒子
        var pointBox = document.getElementById("swipe-btn-list");//點盒子
        var points = pointBox.querySelectorAll('li');//所有的點
    
        //公用方法
        //加過渡滑動動畫(CSS3 transition 屬性)(根據需要可新增ease,linear等屬性)
        var addTransition = function(){
            imageBox.style.transition = "all 0.3s";
            imageBox.style.webkitTransition = "all 0.3s";
        };
        //清除過渡(清除圖片的 transition 屬性)
        var removeTransition = function(){
            imageBox.style.transition = "none";
            imageBox.style.webkitTransition = "none";
        }
        //設定圖片的位置,定位(CSS3 transform 屬性)
        var setTranslateX = function(translateX){
            imageBox.style.transform = "translateX("+translateX+"px)";
            imageBox.style.webkitTransform = "translateX("+translateX+"px)";
        }
    	
        //自動輪播  定時器  無縫銜接  動畫結束瞬間定位
        var index = 1;
        var timer = setInterval(function(){
            index++;		//自動輪播到下一張
            //改變定位  動畫的形式去改變  transition transform translate
            addTransition();    //加過渡動畫
            setTranslateX(-index * width);  //定位
    		if(index > imageCount)
    			index = 1;
    		setPoint();
        },3500);//設定每隔3.5秒切換一次
    
        //等過渡結束之後來做無縫銜接
    	my.transitionEnd(imageBox, function(){
            removeTransition(); //清除過渡
            setTranslateX(-index * width);  //定位
        });
    	
        //改變當前樣式  當前圖片的索引(小圓點)
        var setPoint = function(){
            //清除上一次的now
            for(var i = 0 ; i < points.length ; i++){
                points[i].className = " ";
            }
            //給圖片對應的點加上樣式
            points[index-1].className = "now";
        }
    
        /*
         手指滑動的時候讓輪播圖滑動   touch事件  記錄座標軸的改變 改變輪播圖的定位(位移css3)
         當滑動的距離不超過一定的距離的時候  需要吸附回去  過渡的形式去做
         當滑動超過了一定的距離  需要 跳到 下一張或者上一張  (滑動的方向) 一定的距離(螢幕的三分之一)
         */
        //touch事件
        var startX = 0; //記錄起始  剛剛觸控的點的位置 x的座標
        var moveX = 0;  //滑動的時候x的位置
        var distanceX = 0;  //滑動的距離
        var isMove = false; //是否滑動過
    
        imageBox.addEventListener('touchstart', function(e){
            clearInterval(timer);   //清除定時器
            startX = e.touches[0].clientX;  //記錄起始X
        });
    
        imageBox.addEventListener('touchmove',function(e){
            moveX = e.touches[0].clientX;   //滑動時候的X
            distanceX = moveX - startX; //計算移動的距離
            //計算當前定位  -index*width+distanceX
            removeTransition(); //清除過渡
            setTranslateX(-index * width + distanceX);  //實時的定位
            isMove = true;  //證明滑動過
        });
    
        //在模擬器上模擬的滑動會有問題 丟失的情況  最後在模擬器的時候用window
        imageBox.addEventListener('touchend', function(e){
            // 滑動超過 1/4 即為滑動有效,否則即為無效,則吸附回去
            if(isMove && Math.abs(distanceX) > width/4){
                //5.當滑動超過了一定的距離  需要 跳到 下一張或者上一張  (滑動的方向)*/
                if(distanceX > 0){  //上一張
                    index --;
                }
                else{   //下一張
                    index ++;
                }
            }
            addTransition();    //加過渡動畫
            setTranslateX(-index * width);    //定位
    
            if(index > imageCount ){
                index = 1;
            }else if(index <= 0){
                index = imageCount;
            }
            setPoint();
    
            //重置引數
            startX = 0;
            moveX = 0;
            distanceX = 0;
            isMove = false;
            //加定時器
            clearInterval(timer);   //嚴謹 再清除一次定時器
            timer = setInterval(function(){
    			index++;
    			addTransition();
    			setTranslateX(-index * width);
    			if(index > imageCount)
    				index = 1;
    			setPoint();
    		},3500);
        });
    };