JS - 轮播图

window.addEventListener('load', function () {
    var focus = document.querySelector('.focus');
    var ul = document.querySelector('ul');
    var arrowL = document.querySelector('.arrow-left');
    var arrowR = document.querySelector('.arrow-right');
    var ol = document.querySelector('ol');
    // 父盒子大小,ul每次移动的单位,放到全局变量,下面要调用;
    var foWidth = focus.offsetWidth;

    // 鼠标过图,按钮出现
    focus.addEventListener('mouseenter', function () {
        arrowL.style.display = 'block';
        arrowR.style.display = 'block';
        // 鼠标过图时,自动轮播结束
        clearInterval(timer);
        timer = null;
    });
    // 鼠标离图,按钮消失
    focus.addEventListener('mouseleave', function () {
        arrowL.style.display = 'none';
        arrowR.style.display = 'none';
        // 鼠标离开,自动轮播开始,2秒
        timer = setInterval(function () {
            // 手动调用右键点击事件
            arrowR.click();
        }, 2000);
    });
    // 小圆点,根据图片的数量创建小圆点
    for (var i = 0; i < ul.children.length; i++) {
        var li = document.createElement('li');
        //顺便给li加上自定义属性,一会轮播的时候要用
        li.setAttribute('index', i);
        // 加给ol,要在for循环里添加给ol
        ol.appendChild(li);
        // 点谁谁亮
        li.addEventListener('click', function () {
            // 排他思想,干掉其他li, for循环了,干掉其他li肯定需要[i]
            for (var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = '';
            }
            // 剩下我自己
            this.className = 'current';

            // 计算target(移动的距离),第2张往左移动一个offsetWidth, 第三张移动2个focus.offsetWidth,第四张移动3个,和index的值一样,所以还要获取ol.li的属性值 xx.getAttribute('')
            var index = this.getAttribute('index');
            // 点击小圆圈,再按按钮,顺着index继续播放,按钮,小圆圈,图片保持一致
            num = circle = index;
            // 联系动画函数,是ul移动
            animate(ul, -index * foWidth);
        })
    }
    // 再给第一个li背景色 好饿啊
    ol.children[0].className = 'current';


    // 如果到达最后一张,跳回第一张,如果从正常的最后一张跳,会直接跳过第一张所以要在最后再克隆一张图片,克隆第一张
    var first = ul.children[0].cloneNode(true);
    ul.appendChild(first); // 问题: 已添加,但是图片不显示。原因:父盒子太小,图片掉到下一层去了。
    // 右边按钮
    var num = 0;
    var circle = 0;
    var flag = true;
    arrowR.addEventListener('click', function () {
        if (flag) {// 节流阀,一张图片播放完,才能执行下一个动画函数
            flag = false;
            if (num == ul.children.length - 1) {
                ul.style.left = 0;
                num = 0;
            }
            // 添加动画,ul移动,距离还是按几个盒子移动,没有索引号,给个num,让自加
            num++;
            // 点右键,向左移动,反方向
            animate(ul, -num * foWidth, function () {
                flag = true;
            });

        }
        // 点右键,让小圆点跟着动,没有索引号,给个circle,让自加
        circle++;
        // 如果小圆圈到了最后一个,自动跳回0
        if (circle == ol.children.length) {
            circle = 0;
        }
        // 小圆点排他思想,左右两键都要用,封装函数,调用
        circleChange();

    });
    // 左边按钮
    arrowL.addEventListener('click', function () {
        // 调用动画
        //如果轮播图停在第一张,跳到最后一张图,也就是要挪4个盒子的长度,所以下面的num要减1,从后往前播
        if (flag) { // 节流阀
            flag = false;
            if (num == 0) {
                num = ul.children.length - 1;
                ul.style.left = -num * foWidth + 'px';
            }
            num--;
            animate(ul, -num * foWidth, function () {
                flag = true;
            });
        }

        // 小圆圈跟着变
        circle--;
        if (circle < 0) {
            circle = ol.children.length - 1;
        }
        // 排他思想,调用函数
        circleChange();
    });

    //   排他思想函数
    function circleChange() {
        for (var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = '';
        }
        ol.children[circle].className = 'current';
    }
    // 声明一次定时器,否则需要鼠标过一次图,才能启动定时器
    var timer = setInterval(function () {
        // 手动调用右键点击事件
        arrowR.click();
    }, 2000);

})

思路:

1. 图片用ul>li>a包裹,li浮动,移动的是ul;

2. 鼠标经过图片时,左右按钮出现,鼠标离开时,左右按钮消失

3. 根据图片的数量,安排下方小圆点,创建元素+添加元素

4. 点击小圆点,图片跟随移动,(1)动画函数 (2)小圆点自定义属性  (3)小圆点排他思想

5. 点击右按钮,图片向前播放,无缝 -- > 克隆 -- >不能出现小圆点

6. 右按钮,小圆点,图片匹配 

7. 左按钮同上

8. 鼠标离开图片,自动轮播,鼠标经过,停止轮播

9. 节流阀,一个动画执行完毕,再执行下一个动画

错误:快速点击左右按钮,小圆圈和图片不对应

改正:小圆圈放进节流阀里,保证一张图一动

         if (flag) { // 节流阀
            flag = false;
            if (num == 0) {
                num = ul.children.length - 1;
                ul.style.left = -num * foWidth + 'px';
            }
            num--;
            animate(ul, -num * foWidth, function () {
                flag = true;
            });
            // 小圆圈跟着变
            circle--;
            if (circle < 0) {
                circle = ol.children.length - 1;
            }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

铖Ch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值