感觉老师的逻辑有点乱
在图片轮播ui-slider这里,我感觉老师的逻辑有点乱,不够精简。下面提出自己的思路。
在前端就业班阶段1的步骤5:让页面动起来的JS基础部分,就有讲解过轮播图的实现。轮播的图片数量都是有限的,以本例子来说明,就是3张。
const NUM_LENGTH = 3; // 轮播图片的数量
那么,对应的下标值就是0、1、2。
在任意时刻,显示的图片和索引点都是唯一的。因此,对应的当前下标值currentIndex也是唯一的,只能是0、1、2中的一个。这个点是本例子的最核心思路。因为所有的功能,无非是修改currentIndex而已。
【1】自动轮播:currentIndex不断递增,显示下一张。
【2】向左按钮:currentIndex递减,显示上一张。
【3】向右按钮:currentIndex递增,显示下一张。
【4】点击索引点:获取被点击的索引点的index,并设置为currentIndex。
因此,只要把设置currentIndex的函数写好了,问题就解决了一大半。基于以上思路,我的程序如下。
写好setIndex函数,然后调用,达到各个功能实现。
HTML:
<!-- banner区的幻灯片 --> <div class="banner__slider ui-slider"> <!-- 幻灯片图片 --> <div class="ui-slider__wrap"> <a href="#"><img src="img/banner_1.jpg" alt="官方微信平台"></a> <a href="#"><img src="img/banner_2.jpg" alt="官方订阅号"></a> <a href="#"><img src="img/banner_3.jpg" alt="预约挂号免排队"></a> </div> <!-- 左右按钮 --> <div class="ui-slider__btn ui-slider__btn-left"><</div> <div class="ui-slider__btn ui-slider__btn-right">></div> <!-- 索引点列表 --> <ul class="ui-slider__dotList"> <li class="ui-slider__dotList__dot ui-slider__dotList__dot-current"></li> <li class="ui-slider__dotList__dot"></li> <li class="ui-slider__dotList__dot"></li> </ul> </div>
CSS:
.ui-slider
{
overflow: hidden;
position: relative;
}
.ui-slider__wrap
{
position: absolute;
left: 0;
width: 300%;
height: 100%;
transition: all .5s;
}
.ui-slider__wrap > a
{
float: left;
}
.ui-slider__wrap > a,
.ui-slider__wrap img
{
width: 544px;
height: 414px;
}
/*幻灯片按钮*/
.ui-slider__btn
{
position: absolute;
top: 50%;
transform: translateY(-50%);
left: 0;
width: 38px;
height: 40px;
line-height: 40px;
font-size: 34px;
font-weight: bold;
text-align: center;
color: #FFF;
background-color: rgba(126, 136, 146, .5);
cursor: pointer;
}
.ui-slider__btn-right
{
left: auto;
right: 0;
}
.ui-slider__btn:hover
{
font-size: 40px;
}
/*索引点列表*/
.ui-slider__dotList
{
position: absolute;
bottom: 30px;
left: 50%;
transform: translateX(-50%);
}
/*索引点*/
.ui-slider__dotList__dot
{
display: inline-block;
margin: 0 12px;
width: 10px;
height: 10px;
border-radius: 50%;
box-shadow: 0 0 2px 2px #05F;
background-color: rgba(126, 136, 146, .5);
cursor: pointer;
}
.ui-slider__dotList__dot:hover
{
transform: scale(1.2);
}
/*当前索引点的样式*/
.ui-slider__dotList__dot-current
{
background-color: #F35;
}JS:
// 幻灯片模块
$.fn.uiSlider = function()
{
let currentIndex = 0, // 当前下标值
intervalID = 0, // 间歇调用ID
intervalTime = 2500; // 间歇调用时间
const NUM_LENGTH = 3; // 轮播图片的数量
// 开启自动轮播
function startAutoplay()
{
intervalID = setInterval(function()
{
setIndex((currentIndex + 1) % NUM_LENGTH);
}, intervalTime);
}
// 结束自动轮播
function endAutoplay()
{
if (intervalID)
{
clearInterval(intervalID);
}
}
// 设置当前下标值
function setIndex(newIndex)
{
let dots = $(".ui-slider__dotList__dot"); // 索引点集合
// 清除旧的索引点
dots.eq(currentIndex).removeClass("ui-slider__dotList__dot-current");
// 设置新下标
currentIndex = newIndex;
// 设置新的索引点
dots.eq(currentIndex).addClass("ui-slider__dotList__dot-current");
// 通过改变定位显示对应的图片
$(".ui-slider__wrap").css({"left": (-544 * currentIndex) + "px"});
}
// 向左按钮的点击事件
$(".ui-slider__btn-left").on("click", function()
{
setIndex((currentIndex - 1 + NUM_LENGTH) % NUM_LENGTH);
});
// 向右按钮的点击事件
$(".ui-slider__btn-right").on("click", function()
{
setIndex((currentIndex + 1) % NUM_LENGTH);
});
// 索引点的点击事件
$(".ui-slider__dotList").on("click", "li", function()
{
setIndex($(this).index());
});
// 鼠标移动到上面,停止自动轮播
$(".ui-slider").on("mouseenter", endAutoplay);
// 鼠标离开,开启自动轮播
$(".ui-slider").on("mouseleave", startAutoplay);
// 开启自动轮播
startAutoplay();
};
$(document).ready(function()
{
$(".ui-search").uiSearch();
$(".ui-tab").uiTab();
$("body").uiBackToTop();
$(".ui-slider").uiSlider();
});在这里,我还不得不吐槽一下,或者说是提一下建议,讲解老师的数学水平不行。对于自增自减后下标的越界判断,一般是使用取余运算,计算机最擅长的就是计算,这样代码才精简。而使用if语句则不精简。这些是很基本的技巧,基本上大学里的程序设计课程、数据结构课程,老师在上课时往往都有讲到。
(currentIndex - 1 + NUM_LENGTH) % NUM_LENGTH
(currentIndex + 1) % NUM_LENGTH
而视频中讲解的老师,不是有几年开发经验的工作者吗?怎么会犯这种“兵家之大忌”?居然用if。希望慕课网能够持续改进质量,精益求精,才能收获更多慕粉。
正在回答 回答被采纳积分+1
取余运算在很多地方也用到,并不是什么难以理解的内容,也是入门级技巧。如果视频中的老师用这种方法会更好,让同学们可以多掌握一个小技巧。
同学你好,非常感谢你用心为慕课网提出建议。同学是一个基础好,聪明且思维缜密的人。你提出的这些方式都是很好的,但是老师不得不解释一下,教学课程不能只求精致的代码。因为就业班面向的都是零基础的学生,有些可能还是从其他专业转过来学习前端的。所以大部分小白都是没有计算机基础或者是基础很差的人。同学觉得代码写的不精致。但是对于其他人来说,这个案例很难,逻辑听不懂。当中还有一些人学习几遍都掌握不了。
学习是需要循序渐进的。初学时,我们不需要考虑代码是否啰嗦,逻辑是否复杂,性能是不是更好的问题。而是要考虑怎么把这个知识掌握,把效果做出来就行。那么随着基础的掌握,后续再去考虑代码优化,逻辑精简等问题。等这些做好了之后,可能后面就要去考虑性能啊,可维护性,复用性问题等等...所以你觉得这个代码不精致老师也同意,尤其是第一个阶段的代码,老师也会觉得不精致。等你工作多年之后,也许会觉得现在的代码也有很多问题。这都是建立在一定基础上,才会有这样的认知。但是不能一开始就确立一个高水准,学习就是从不精致走向精致的一个过程。
当然了,同学有一些好的想法,我们也非常欢迎你在问答区多分享一些。同学和老师互相学习,互相进步,是非常好的一件事情。另外,同学提出的建议老师也会转达给课程制作部门,会进行整体的评估。以后制作课程时,在大部分学生能够接受的程度上,尽量会更加精致一点。最后再次感谢同学能够给我们提出宝贵的建议。
祝学习愉快 ~
相似问题
登录后可查看更多问答,登录/注册
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星