无缝轮播图

322 阅读1分钟

原理

本例 固定为4张图的轮播图,主要为便于阐述原理.

首先页面布局,重点实现如上图所示的滚动内容(board)结构

4fake的图片4的复制,1fake的图片1的复制,

通过设置上述滚动结构(board)的css left和transition 实现滚动效果实现无限滚动

  • 当页面滚动到1fake 时,在滚动完成后,将left值设置到1的位置(此处没有动画,用户无法察觉);

  • 同理,当页面滚动到4fake 时,在滚动完成后,将left值设置到4的位置(此处也没有动画);

代码

<!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>carousel</title>
    <style>
        body {
            box-sizing: border-box;
        }

        .carousel {
            position: relative;
            width: 400px;
            height: 300px;
            /* overflow-x: scroll; */
            overflow: hidden;
        }

        .carousel-board {
            /* position: absolute; */
            position: relative;
            list-style: none;
            width: 5000px;
            height: 300px;
            padding: 0;
            left: 0;
            /* transition: left 0.5s linear; */

        }

        .carousel-board-item {
            float: left;
            width: 400px;
            height: 300px;
            line-height: 300px;
            text-align: center;
            font-size: 30px;
        }

        .carousel-btn {
            position: absolute;
            z-index: 100;
            cursor: pointer;
        }

        .carousel-prev {
            top: 50%;
            left: 10px;
        }

        .carousel-next {
            top: 50%;
            right: 10px;
        }

        .carousel-dots {
            padding: 0;
            /* width: 100px; */
            list-style: none;
            position: absolute;
            bottom: 10px;
            left: 50%;
            margin-left: -24px;
            z-index: 100;
        }

        .carousel-dots li {
            float: left;
            width: 8px;
            height: 8px;
            background-color: #aaa;
            margin-right: 4px;
            border-radius: 4px;
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div class="carousel">
        <ul class="carousel-board">
            <li class="carousel-board-item" style="background-color:green">4</li>
            <li class="carousel-board-item" style="background-color:red">1</li>
            <li class="carousel-board-item" style="background-color:yellow">2</li>
            <li class="carousel-board-item" style="background-color:blue">3</li>
            <li class="carousel-board-item" style="background-color:green">4</li>
            <li class="carousel-board-item" style="background-color:red">1</li>
        </ul>
        <span class="carousel-btn carousel-prev">
            <</span> <span class="carousel-btn carousel-next">>
        </span>
        <ul class="carousel-dots">
            <li date-index="1"></li>
            <li date-index="2"></li>
            <li date-index="3"></li>
            <li date-index="4"></li>
        </ul>
    </div>
    <script>
        (function () {
            let prev = document.getElementsByClassName("carousel-prev")[0];
            let next = document.getElementsByClassName("carousel-next")[0];
            let board = document.getElementsByClassName("carousel-board")[0];
            let panels = Array.from(document.getElementsByClassName('carousel-board-item'))
            board.style.left = "-400px";
            let index = 1; //设置默认的index值
            prev.addEventListener("click",throttle(function () {
                index++
                console.log(index);
                animate(-400);
                //如果当前在 1fake 的位置
                if (index === panels.length - 1) {

                    setTimeout(() => {
                        console.log("settimeout")
                        board.style.transition = "0s";
                        let width = 4 * 400
                        board.style.left = parseInt(board.style.left) + width + "px"
                    }, 600)
                    index = 1;
                }

            }, 500) )
            next.addEventListener("click",throttle( () => {
                index--
                console.log(index);
                animate(400);
                if (index === 0) {
                    console.log("settimeout")
                    setTimeout(() => {
                        board.style.transition = "0s";
                        let width = -4 * 400
                        board.style.left = parseInt(board.style.left) + width + "px"
                    }, 600)
                    index = 4;
                }
            }, 500))

            function animate(width = 400) {
                board.style.transition = "0.5s";
                board.style.left || (board.style.left = 0)
                board.style.left = parseInt(board.style.left) + width + "px";
            }

           // 节流函数 防止点击过快出现空白
            function throttle(func, wait) {
                var context, args;
                var previous = 0;

                return function() {
                    var now = new Date();
                    context = this;
                    args = arguments;
                    if (now - previous > wait) {
                        func.apply(context, args);
                        previous = now;
                    }
                }
            }
        })()
    </script>
</body>

</html>