無限滑動輪播圖

話不多說,直接上代碼:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
        box-sizing: border-box;
        list-style: none;
    }

    .outer {
        position: relative;
        width: 360px;
        height: 200px;
        margin: 20px auto;
    }

    .dots {
        position: absolute;
        width: 100%;
        bottom: 10px;
        margin: 0 auto;
    }

    .dots ol {
        display: flex;
        justify-content: center;
    }

    .dots .active {
        background: #666666;
    }

    .dots li {
        display: inline-block;
        width: 10px;
        height: 10px;
        border-radius: 50%;
        margin-left: 5px;
        background: #aaaaaa;
        cursor: pointer;
    }

    .control-btns {
        position: absolute;
        width: 100%;
        height: 100%;
        display: flex;
        justify-content: space-around;
    }

    .control-btns>div {
        width: 50%;
    }

    .btn-left,
    .btn-right {
        user-select: none;
        color: gray;
        width: 30px;
        line-height: 20px;
        border: 1px solid #999999;
        text-align: center;
        vertical-align: middle;
        text-decoration: none;
        display: none;
        position: absolute;
        top: 50%;
        margin-top: -10px;
        left: 10px;
    }

    .btn-right {
        left: auto;
        right: 10px;
    }

    .inner {
        position: absolute;
        width: 100%;
        height: 100%;
        overflow: hidden;
        display: flex;
    }

    .item {
        display: none;
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: auto;
    }

    img {
        width: 100%;
    }

    .active {
        display: block;
    }

    .left {
        display: block;
        animation: left 0.3s linear;
    }

    .rightnext {
        display: block;
        animation: right 0.3s linear;
    }

    .right {
        display: block;
        animation: right 0.3s linear reverse;
    }

    .leftnext {
        display: block;
        animation: left 0.3s linear reverse;
    }

    @keyframes left {
        0% {
            left: 0;
        }

        100% {
            left: -100%;
        }
    }

    @keyframes right {
        0% {
            left: 100%;
        }

        100% {
            left: 0;
        }
    }
</style>

<body>
    <div class="outer">
        <ul class="inner">
            <li class="item active"><img src="./imgs/1.png" alt=""></li>
            <li class="item"><img src="./imgs/2.png" alt=""></li>
            <li class="item"><img src="./imgs/3.png" alt=""></li>
        </ul>
        <div class="control-btns">
            <div>
                <a href="#" class="btn-left">左</a>
            </div>
            <div>
                <a href="#" class="btn-right">右</a>
            </div>
        </div>
        <div class="dots"></div>
    </div>

    <script src="./libs/jquery-3.3.1.js"></script>
    <script>
        var index = 0;
        var len = $('.item').length;
        var last = 0;
        var dots = "<ol>";
        for (var i = 0; i < len; i++) {
            dots += "<li></li>";
        }
        dots += "</ol>";
        $(".dots").html(dots);
        $(".dots").find("li").eq(last).addClass("active");
        $(".dots").on("click", "li", function() {
            last = $(this).index();
            $(".dots li,.inner li").removeClass("active");
            $(".inner").find("li").eq(last).addClass("active");
            $(".dots").find("li").eq(last).addClass("active");
        });
        function playLeft() {
            index = $('.inner .active').index();
            $('.inner .active').addClass('left');
            $(".dots").find("li").eq(last).removeClass("active");
            if (index == len - 1) {
                $('.inner .item').eq(0).addClass('rightnext');
                $(".dots").find("li").eq(0).addClass("active");
                last = 0;
            } else {
                $('.inner .item').eq(index + 1).addClass('rightnext');
                $(".dots").find("li").eq(index + 1).addClass("active");
                last = index + 1;
            }
        }

        function playRight() {
            index = $('.inner .active').index();
            $('.inner .active').addClass('right');
            $(".dots").find("li").eq(last).removeClass("active");
            if (index == 0) {
                $('.inner .item').eq(len - 1).addClass('leftnext');
                $(".dots").find("li").eq(len - 1).addClass("active");
                last = len - 1;
            } else {
                $('.inner .item').eq(index - 1).addClass('leftnext');
                $(".dots").find("li").eq(index - 1).addClass("active");
                last = index - 1;
            }
        }
        $('.btn-left').on('click', function () {
            playLeft();
        });
        $('.btn-right').on('click', function () {
            playRight();
        });
        $('.outer').on('animationend', ".rightnext", function () {
            $('.inner li').removeClass('left rightnext active');
            $(this).addClass('active');
        });
        $('.outer').on('animationend', ".leftnext", function () {
            $('.inner li').removeClass('right leftnext active');
            $(this).addClass('active');
        });
        $(".control-btns>div").on("mouseout", function () {
            $(this).find("a").hide();
        });
        $(".control-btns>div").on("mouseover", function () {
            $(this).find("a").show();
        });
        $(".outer").on("mouseover", function () {
            clearInterval(timer);
        })
        $(".outer").on("mouseout", function () {
            timer = setInterval(function () {
                playLeft();
            }, 1000);
        })

        var timer = setInterval(function () {
            playLeft();
        }, 1000);
    </script>
</body>

</html>

佈局順序依次是輪播圖圖片,左右兩個按鈕,下面的點,順序不能變,否則點擊事件可能無法觸發,因爲我的外層是相對佈局,內層都是絕對佈局的,所以元素標籤雖然都是絕對佈局但是靠後的層級(z-index)更高。樣式如上所示,可以按需更改。

首先是輪播的圖片,這裏的三張圖都是設置成絕對佈局然後全部隱藏,只有類名是active的li才能顯示,當然默認顯示的就是第一張。下面的小點也是顯示第一個選中。左右兩側的隱藏,當鼠標放在輪播圖上時纔會顯示。當然這裏的輪播圖和下面的點都可以動態生成,生成完畢的默認樣子就是這樣的。

先寫下面的小點的點擊事件,last代表上次選中的點,然後如下所示,將圖片和小點切換到點擊的位置

var last = 0;
$(".dots").on("click", "li", function() {
     last = $(this).index();
     $(".dots li,.inner li").removeClass("active");
     $(".inner").find("li").eq(last).addClass("active");
     $(".dots").find("li").eq(last).addClass("active");
});

然後監聽.control-btns下的div,當鼠標放到左側的時候顯示左,右側的時候顯示右

$(".control-btns>div").on("mouseout", function () {
    $(this).find("a").hide();
});
$(".control-btns>div").on("mouseover", function () {
    $(this).find("a").show();
});

現在給左按鈕添加點擊事件,這時候整體應該是向左移(包括圖片和下面的小點)。下面的小點直接刪除上一次記錄的active類名,將下一個小點添加active類名,上面的圖片處理就是分別給當前圖片及右側圖片添加特定的類名,例如我這裏是給當前圖片外層的li添加類名left(.left的動畫就是當前頁面向左移除消失),右側圖片外層的li添加類名rightnext(.rightnext的動畫就是將右側圖片向左移入顯示)。最後監聽.rightnext動畫結束事件,將類名active,left,rightnext刪除,並將右側的圖片外層li添加active進行顯示。這時候可以點擊左無限循環了。

$('.btn-left').on('click', function () {
    playLeft();
});
$('.outer').on('animationend', ".rightnext", function () {
    $('.inner li').removeClass('left rightnext active');
    $(this).addClass('active');
});
function playLeft() {
    index = $('.inner .active').index();
    $('.inner .active').addClass('left');
    $(".dots").find("li").eq(last).removeClass("active");
    if (index == len - 1) {
         $('.inner .item').eq(0).addClass('rightnext');
         $(".dots").find("li").eq(0).addClass("active");
         last = 0;
    } else {
         $('.inner .item').eq(index + 1).addClass('rightnext');
         $(".dots").find("li").eq(index + 1).addClass("active");
         last = index + 1;
    }
}

右的處理和左類似,點擊右會讓整體向右移,這時候左側圖片就是下一張圖片。如下所示之後點擊右側就可以無限輪播了。

function playRight() {
     index = $('.inner .active').index();
     $('.inner .active').addClass('right');
     $(".dots").find("li").eq(last).removeClass("active");
     if (index == 0) {
          $('.inner .item').eq(len - 1).addClass('leftnext');
          $(".dots").find("li").eq(len - 1).addClass("active");
          last = len - 1;
     } else {
          $('.inner .item').eq(index - 1).addClass('leftnext');
          $(".dots").find("li").eq(index - 1).addClass("active");
          last = index - 1;
     }
}
$('.btn-right').on('click', function () {
     playRight();
});
$('.outer').on('animationend', ".leftnext", function () {
     $('.inner li').removeClass('right leftnext active');
     $(this).addClass('active');
});

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章