纯手写JS轮播图

之前用JS写的轮播图,有详细注释,放在这里和大家一起学习!
实现的功能:
1.不点击按钮时自动播放轮播图,按钮隐藏
2.点击左右按钮图片切换,同时自动播放停止
3.下面一排小圆点与当前图片的序号相对应
部分代码:

window.addEventListener('load', function () {
    // 1.鼠标经过轮播图模块,左右按钮显示,离开隐藏左右按钮   
    var btnLeft = document.querySelector('.left');
    var btnRight = document.querySelector('.right');
    var wrap = document.querySelector('.wrap');
    // 2.鼠标不经过轮播图也会自动播放图片,鼠标经过就停止自动播放
    // 自动播放的功能类似于右侧按钮
    // 设置一个定时器
    var timer = null;
    //鼠标经过显示
    wrap.addEventListener('mouseenter', function () {
        btnLeft.style.display = 'block';
        btnRight.style.display = 'block';
        clearInterval(timer);
        // 清除定时器变量
        timer = null;
    });
    //鼠标离开隐藏
    wrap.addEventListener('mouseleave', function () {
        btnLeft.style.display = 'none';
        btnRight.style.display = 'none';
        timer = setInterval(function () {
            // 手动调用点击事件
            btnRight.click();
        }, 2000);
    });

    // 2.动态生成小圆圈,跟图片的张数一样
    var ul = document.querySelector('.circle');
    var imgList = document.querySelector('.img-list');
    // console.log(imgs.length);
    var num = 0;//当前图片的下标
    for (var i = 0; i < imgList.children.length; i++) {
        var li = document.createElement('li');
        // 记录当前小圆圈的属性
        li.setAttribute('index', i);
        ul.appendChild(li);
        //点击了当前的小圆圈就显示颜色,否则不显示
        li.addEventListener('click', function () {
            //干掉所有人
            for (var i = 0; i < ul.children.length; i++) {
                ul.children[i].className = '';
            }
            //留下自己
            this.className = 'active';

            // 3.点击小圆圈图片滚动,实际上滚动的是装图片的盒子
            // 核心算法:小圆圈的索引号*图片的宽度就是盒子移动的距离
            var index = this.getAttribute('index');
            num = index;
            // console.log(index);

            var target = index * imgList.offsetWidth;
            animate(imgList, -target);
        })
    }
    ul.children[0].className = 'active';
    // 克隆第一张图片
    var firstImg = imgList.children[0].cloneNode(true);
    // 这里有一个问题,如果使用Imgs数组,那最后一个Img就获取不到,因为获取元素的代码在上面
    // 因此修改上面的代码,直接使用imgList
    imgList.appendChild(firstImg);
    // 4.点击右侧按钮一次,图片往左播放一张

    var flag = true;
    // 这里使用节流阀,防止按钮过快,图片滑动过快
    // 只有当上一个函数动画内容执行完毕,才会去执行下一个动画函数,让事件无法连续触发
    // 核心思路:利用回调函数,添加一个变量来控制,锁住函数和解锁函数
    btnRight.addEventListener('click', function () {
        if (flag) {
            flag = false;
            if (num == imgList.children.length - 1) {
                imgList.style.left = 0;
                num = 0;
            }
            num++;
            // console.log(num);
            // console.log(lastLeft);
            // console.log(num);
            //num = num % imgs.length;
            var step = num * imgList.offsetWidth;
            animate(imgList, -step,function(){
                flag = true;
            });
            //同时小圆圈也要变
            //干掉所有人
            for (var i = 0; i < ul.children.length; i++) {
                ul.children[i].className = '';
            }
            // 留下自己
            // 如果是最后一张新加的图片,那么视觉上第一个小圆圈要变亮
            if (num == imgList.children.length - 1) {
                ul.children[0].className = 'active';
            } else {
                ul.children[num].className = 'active';
            }
            // 这里有Bug,点击小圆圈之后再去点击按钮没有按照预想的来,因为num值没有和Index值联系起来
            // 所以在获取了index值之后,num值也是一样的
        }

    })
    // 5.同理设置左边按钮
    btnLeft.addEventListener('click', function () {
        if(flag){
            flag = false;
            if (num == 0) {
                num = imgList.children.length - 1;
                // 先来到(重复的第一张)
                // 下面num--之后就是最后一张(index=4),调用之后移动的步长就是index=4的盒子移动的距离
                imgList.style.left = -num * imgList.offsetWidth + 'px';
            }
            num--;
            // console.log(num);
            //num = num % imgs.length;
            var step = num * imgList.offsetWidth;
            animate(imgList, -step,function(){
                flag = true;
            });
            //同时小圆圈也要变
            //干掉所有人
            for (var i = 0; i < ul.children.length; i++) {
                ul.children[i].className = '';
            }
            // 留下自己
            // 如果是最后一张新加的图片,那么视觉上第一个小圆圈要变亮
            if (num == imgList.children.length - 1) {
                ul.children[0].className = 'active';
            } else {
                ul.children[num].className = 'active';
            }
        }

    })

    // 6.鼠标经过,轮播图模块自动播放停止,也就是清除定时器,在上面有过鼠标经过事件的设置,在上面代码中
})

如果对你有帮助的话可不可以在gitee给一个star呀!谢谢!!!
完整源码地址:https://gitee.com/Mingjie_Chen/swiper.git

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值