补充上面两个问题的js文件(有两个问题 分别是html和css的内容太长说需要审核)

补充上面两个问题的js文件(有两个问题 分别是html和css的内容太长说需要审核)

相关代码:js

/*
* 轮播图特效
* 日期:2021年9月17日
* 姓名:lu
*/

// 这里用IIFE是因为防止产生的变量影响全局变量
(function () {
//得到DOM元素
var carousel_list = document.getElementById('carousel_list');
var left_btn = document.getElementById('left_btn');
var right_btn = document.getElementById('right_btn');
var circle_ol = document.getElementById('circle_ol');
var circle_lis = document.getElementsByTagName('li');

//克隆第一张li
var clone_li = carousel_list.firstElementChild.cloneNode(true);
//上树
carousel_list.appendChild(clone_li);

//当前正在显示的图片号
var idx = 0;
//节流锁
var lock = true;
//接收定时器
var timer;
//右按钮添加监听
right_btn.addEventListener('click', function () {
//如果为false则不执行一下语句
if (!lock) return;
//如果是true,则上锁为了不多次点击触发
lock = false;
//添加过渡动画
carousel_list.style.transition = 'transform .5s ease 0s';
//图号自增
idx++;
//拖动
carousel_list.style.transform = 'translateX(' + -16.66 * idx + '%)';
//判断图号是否为最后一张克隆图
if (idx == 5) {
//设置延时器,当图号为5时,触发一次
setTimeout(function () {
//回到第一张图
idx = 0;
//瞬间回到
carousel_list.style.transition = 'none';
//拉动
carousel_list.style.transform = 'translateX(' + -16.66 * idx + '%)';
}, 500);
}
//设置小圆点
setCircles();

//当执行完以上语句,延时器让节流锁打开
setTimeout(function () {
lock = true;
}, 500);
}, false);

//左按钮添加监听
left_btn.addEventListener('click', function () {
if (!lock) return;
lock = false;
//判断图号是否为第一张图,然后瞬间替换为克隆图
if (idx == 0) {
//过渡取消,瞬间回到
carousel_list.style.transition = 'none';
//拉动到最后一张图
carousel_list.style.transform = 'translateX(' + -16.66 * 5 + '%)';
//改变idx值
idx = 4;
//小技巧,延时0毫秒,额可以让刚才取消的过渡加上
setTimeout(function () {
//加过渡
carousel_list.style.transition = 'transform .5s ease 0s';
//过渡动画
carousel_list.style.transform = 'translateX(' + -16.66 * 4 + '%)';
}, 0);
} else {
idx--;
carousel_list.style.transform = 'translateX(' + -16.66 * idx + '%)';

}
//设置小圆点
setCircles();

//当执行完以上语句,延时器让节流锁打开
setTimeout(function () {
lock = true;
}, 500);
}, false);

//这只小圆点的current在谁身上,序号为idx的小圆点才有current类名,其他的li没有
function setCircles() {
//遍历,遍历0-4,每遍历一个数字与当前idx对比,相同则添加类名current,不同则去掉类名
for (var i = 0; i <= 4; i++) {
if (i == idx) {
circle_lis[i].className = 'current';
} else {
circle_lis[i].className = '';
}
}
};
//自动轮播
// function autoPlay() {
// timer = setInterval(function () {
// idx++;
// carousel_list.style.transition = 'transform 1s ease 0s';
// if (idx == 5) {
// idx = 0;
// carousel_list.style.transition = 'none';
// carousel_list.style.transform = 'translateX(' + -16.666 * idx + '%)';
// };
// carousel_list.style.transform = 'translateX(' + -16.666 * idx + '%)';
// }, 2000);
// }
// autoPlay();

//当鼠标移入,停止自动轮播
// carousel_list.onmouseenter = function () {
// clearInterval(timer);
// }

//当鼠标移入,停止自动轮播
// carousel_list.onmouseleave = function () {
// autoPlay();
// }
})();


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,问题解答如下:

1、代码中获取的是所有li元素,从顶部开始获取的。所以点击左右按钮的时候也会操作顶部li的class值

https://img1.sycdn.imooc.com//climg/614576d309e542af02930142.jpg

https://img1.sycdn.imooc.com//climg/614576e80906325703160178.jpg

导致样式出现问题

https://img1.sycdn.imooc.com//climg/614576fb091f3a2c14960411.jpg

所以代码中修改为只获取轮播中的li即可

https://img1.sycdn.imooc.com//climg/6145771b097c61f007560150.jpg

2、点击右侧按钮直到切换到最后一张图片,再次点击右侧按钮,切换到第一张图片,可以看到第一个小圆点样式没有改变,li中也没有添加class值current

https://img1.sycdn.imooc.com//climg/6145779b0966d44c14410559.jpg

这是因为idx值改变在定时器中,是异步的,导致在setCircles方法中无法获取idx等于0的时候。建议将idx=0调整到定时器外面

https://img1.sycdn.imooc.com//climg/6145785b099ba93406970348.jpg

祝学习愉快!

  • 陆小小 提问者 #1

    谢谢老师给我解惑,我像尝试自己解决问题,但是不知道怎么去发现问题,请问老师是怎么发现我这个问题的呀?我发给你看的码还这么多,求老师受教!谢谢你

    2021-09-18 13:51:13
好帮手慕星星 2021-09-18 14:09:41

同学你好,主要是顶部li样式发生了变化,所以想到了js中获取的li元素问题,是不是获取的li位置不对导致的,修改为指定的li就好了。然后在点击按钮过程中发现了第一个小圆点的问题,看idx=0在哪里设置的,然后修改。

最主要的是多练习,自己测试过程中总结经验,提升自己找bug并解决的能力,不要着急哦。

祝学习愉快!

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师