輪播圖完整代碼


 

<!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">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>移動輪播圖</title>

    <style>
        * {
            padding: 0;
            margin: 0;
        }
        li {
            list-style: none;
        }

        .banner {
            position: relative;
            /*padding-top: 44px;*/
            overflow: hidden;
        }

        .banner img {
            width: 100%;
        }
        .banner ul {
            overflow: hidden;/*清楚浮動*/
            width: 500%;
            margin-left: -100%;/*讓第一張漏出來 不添加的話是最后一張*/
        }
        .banner ul li {
            float: left;
            width: 20%; /*500%的20% 就是100%*/
        }
        .banner ol {
            position: absolute;
            bottom: 5px;
            right: 5px;
            margin: 0;/*清除ol的默認值*/
        }
        .banner ol li {
            display: inline-block;
            width: 5px;
            height: 5px;
            background-color: #fff;
            list-style: none;
            border-radius: 2px;
            transition: all .3s;
        }

        .banner ol li.current {
            width: 15px;
        }
    </style>
</head>
<body>

<div class="banner">
    <ul>
        <li><img src="image/b3.jpg" alt=""></li>
        <li><img src="image/b1.jpg" alt=""></li>
        <li><img src="image/b2.jpg" alt=""></li>
        <li><img src="image/b3.jpg" alt=""></li>
        <li><img src="image/b1.jpg" alt=""></li>
    </ul>
    <!-- 小圓點 -->
    <ol>
        <li class="current"></li>
        <li></li>
        <li></li>
    </ol>
</div>

<script>
    var banner = document.querySelector('.banner');
    var ul = banner.children[0];//做運動的主體
    var ol = banner.querySelector('ol');
    var bannerW = banner.offsetWidth;
    console.log(bannerW);

    var index = 0;

    // 圖片自動播放
    //1.1 開啟定時器
    var timer = setInterval(function () {
        index++;
        var translatex = -index * bannerW ;
        //給ul添加過渡效果 讓圖片優雅的移動
        ul.style.transition = 'all .3s';
        ul.style.transform = 'translateX('+ translatex + 'px)';
    },2000);

    //1.2 圖片無縫滾動  不能直接判斷 因為有過渡效果 有延時
    //等過渡完成后 再去判斷  監聽過渡完成的事件 transitionend
    ul.addEventListener('transitionend',function () {
        //判斷是否到了最后一張
        if (index == 3) {
            index = 0;
            ul.style.transition = 'none';//去掉過渡效果 讓ul快速跳到目標位置
            var translatex = -index * bannerW ;//利用最新的索引號 * 寬度 繼續去滾動圖片
            ul.style.transform = 'translateX('+ translatex + 'px)';
        }
        //判斷是否到了第一張
        if (index < 0) {
            index = 2;
            ul.style.transition = 'none';//去掉過渡效果 讓ul快速跳到目標位置
            var translatex = -index * bannerW ;//利用最新的索引號 * 寬度 繼續去滾動圖片
            ul.style.transform = 'translateX('+ translatex + 'px)';
        }

        // 3. 小圓點跟隨變化
        // 把ol里面li帶有current類名的選出來去掉類名 remove
        ol.querySelector('.current').classList.remove('current');
        // 讓當前索引號 的小li 加上 current   add
        ol.children[index].classList.add('current');
    });

    //2 手指滑動輪播圖
    //2.1 觸摸元素 獲得手指做標的值
    var startX = 0;
    var moveX = 0;
    var flag = false;
    ul.addEventListener('touchstart',function(e){
        startX = e.targetTouches[0].pageX;
        clearInterval(timer);
    });

    //2.2 移動手指 計算手指的滑動距離 並且移動盒子
    ul.addEventListener('touchmove',function (e) {
        //移動的距離 = 滑動的距離 - 初始的距離
        moveX = e.targetTouches[0].pageX - startX;
        console.log(moveX);

        //移動盒子  盒子原來的位置 + 手指移動的距離
        var translatex = -index * bannerW + moveX;
        //手指拖動的時候 不需要動畫效果 所以取消過渡效果
        ul.style.transition = 'none';
        ul.style.transform = 'translateX('+ translatex + 'px)';
        flag = true; // 如果用戶手指滑動過 就設置為true 如果沒有滑動 flag就一直是false
        e.preventDefault(); // 阻止滾動屏幕的行為
    });


    //4 手指離開屏幕  根據滑動距離分不同的情況
    //如果移動距離小於某個像素 就回彈回去
    //如果移動距離大於某個像素 就上一張 下一張 滑動
    ul.addEventListener('touchend',function(){

        if (flag) { //如果是true才做判斷計算尺寸 如果是法拉色就不執行
            //4.1 大於50的操作 播放圖片
            if (Math.abs(moveX) > 50) { //moveX 有可能是負值 所以取絕對值
                //如果是右滑 播放上一張 moveX是正值
                //如果是左滑 播放下一張 moveX是負值
                if (moveX > 0) {//大於0 就是正值
                    index--;
                } else {//小於0 就是負值
                    index++;
                }
                var translatex = -index * bannerW;
                ul.style.transition = 'all 0.3s';
                ul.style.transform = 'translateX('+ translatex + 'px)';
            } else {//4.2 小於50的操作 回彈
                var translatex = -index * bannerW;
                ul.style.transition = 'all 0.3s';
                ul.style.transform = 'translateX('+ translatex + 'px)';
            }
        }

        //5 手指離開屏幕 定時器重新開始
        clearInterval(timer); //開啟前先把前面的定時器清除 保證頁面只有一個定時器
        timer = setInterval(function(){
            index++;
            var translatex = -index * bannerW ;
            //給ul添加過渡效果 讓圖片優雅的移動
            ul.style.transition = 'all .3s';
            ul.style.transform = 'translateX('+ translatex + 'px)';
        },2000)
    });
</script>
</body>
</html>

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM