JavaScript 轮播图(移动端)

  • Post author:
  • Post category:java

实现移动端轮播图主要用到了setInterval(),transitionend事件和touchstart事件,touchmove事件,touchend事件。

核心思想:

(1)ul进行绝对定位,利用CSS中的transform属性实现轮播

(2)为ul添加过渡效果

(3)在第一张图片前面添加最后一张图片,防止在第一张图片左滑时出现空白。

(4)在最后一张图片后面添加第一张图片,当图片滚动到最后添加的图片时,移除过渡类,快速切回第一张图片。

值得一提的是,设定了一个变量flag,用于避免手指只是点击屏幕时,初始状态为false,触摸屏幕并移动后flag被设为true。

主要功能如下:

1.自动循环播放

2.点击左右按钮,可切换至相对应的图片

3.点击小圆圈可切换至对应的图片,并且小圈随着图片的切换变色

完整代码:

HTML与CSS:

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            margin: 0;
        }

        ul,
        ol {
            margin: 0;
            padding: 0;
            list-style: none;
        }

        .banner {
            position: relative;
            height: 129px;
            overflow: hidden;
        }

        ul {
            width: 500%;
            height: 100%;
            margin-left: -100%;
        }

        ul li {
            width: 20%;
            height: 100%;
            float: left;
        }

        img {
            width: 100%;
            height: 100%;
        }
        ol {
            position: absolute;
            right: 15px;
            bottom: 0;
        }
        ol li {
            display: inline-block;
            width: 8px;
            height: 8px;
            background-color: #fff;
            border-radius: 50%;
        }
        ol li.current {
            background-color: rgba(22, 218, 80, 0.712);
        }
    </style>
    <script src="mloop.js"></script>
</head>

<body>
    <div class="banner">
        <ul>
            <li><img src="images/loop3.webp"></li>
            <li><img src="images/loop1.webp"></li>
            <li><img src="images/loop2.webp"></li>
            <li><img src="images/loop3.webp"></li>
            <li><img src="images/loop1.webp"></li>
        </ul>
        <ol>
            <li class="current"></li>
            <li></li>
            <li></li>
        </ol>
    </div>
</body>

</html>

JS代码:

window.addEventListener('load', function () {
    var banner = this.document.querySelector('.banner');
    var ul = banner.querySelector('ul');
    var index = 0;
    var bannerWidth = banner.offsetWidth;
    var ol = banner.querySelector('ol');
    var flag = false;
    var timer = setInterval(function () {
        index++;
        ul.style.transition = 'transform .3s';
        var translatex = -index * bannerWidth;
        ul.style.transform = 'translateX(' + translatex + 'px)';
    }, 2000);
    ul.addEventListener('transitionend', function () {
        if (index >= 3) {
            index = 0;
            ul.style.transition = 'none';
            var translatex = -index * bannerWidth;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        } else if (index < 0) {
            index = 2;
            ul.style.transition = 'none';
            var translatex = -index * bannerWidth;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        }
        ol.querySelector('li.current').classList.remove('current');
        ol.children[index].classList.add('current');
    });
    var startX;
    var moveX;
    ul.addEventListener('touchstart', function (e) {
        clearInterval(timer);
        x = ul.offsetLeft;
        startX = e.targetTouches[0].pageX;
    });
    ul.addEventListener('touchmove', function (e) {
        moveX = e.targetTouches[0].pageX - startX;
        var translatex = -index * bannerWidth + moveX;
        ul.style.transition = 'none';
        ul.style.transform = 'translateX(' + translatex + 'px)';
        flag = true;
    });
    ul.addEventListener('touchend', function (e) {
        if (flag) {
            if (Math.abs(moveX) > 50) {
                if (moveX > 0) {
                    index--;
                } else {
                    index++;
                }
                var translatex = -index * bannerWidth;
                ul.style.transition = 'transform .3s';
                ul.style.transform = 'translateX(' + translatex + 'px)';
            } else {
                var translatex = -index * bannerWidth;
                ul.style.transition = 'all .1s';
                ul.style.transform = 'translateX(' + translatex + 'px)';
            };
        }
        clearInterval(timer);
        timer = setInterval(function () {
            index++;
            ul.style.transition = 'transform .3s';
            var translatex = -index * bannerWidth;
            ul.style.transform = 'translateX(' + translatex + 'px)';
        }, 2000);
    });
});

效果图:


版权声明:本文为m0_57835615原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。