我对之前请教的轮播图还有一部分不太理解,希望老师答疑解惑,有的是讲过,可是还是有点混乱

我对之前请教的轮播图还有一部分不太理解,希望老师答疑解惑,有的是讲过,可是还是有点混乱

if(index==0){//确定图片的索引

index=length-1;

hezi.style.left=-index * imgWidth + "px";

}

index--;

if (index == len - 1) {//确定图片的索引

                index = 0;

                wrap.style.left = 0 + "px";

            }

            index++;

这两个按钮确定索引的时候,为什么要left,有什么效果?

能不能从索引的角度分析一下,因添加一张图片导致我非常混乱,希望老师帮我捋一捋

for(var d=0;d<navneirong.length;d++){

if(d==index){

   navneirong[d].className="bg";

   }else{

   navneirong[d].className="";

   }

if(index==img.length-1){navneirong[0].className="bg";}

//添加一个判断,

}

这段话是老师添加的,为什么删除就没有效果?

for(var j=0;j<navneirong.length;j++){//切换按钮

navneirong[j].className="";

img[j].className="hide";

};

img[index].className="";

navneirong[index].className="bg";

是不是二者功能是重复的?

if(panduan){

   juli-=40;

   }else{

   juli+=40;

   }

if (panduan ? juli > target : juli < target) {

                    hezi.style.left = juli + "px";  //如果当前位置不是在目标位置则进行位置处理

                } else {

                    clearInterval(timer);

                    hezi.style.left = target + "px";

                }

老师这段代码,还是有点蒙,我觉得不需要hezi.style.left = target + "px";,为什么不能直接移动距离hezi.style.left = juli + "px";?

另,我的代码有一个问题,右按钮移动到第一张图片的时候,导航条不显示

全部代码:

<!doctype html>
<html><head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/style.css">
<title>轮播图</title>
</head>

<body> 
	<div id="menu">
		<div id="nav">
			<div class="bg">首页</div>
			<div>点击查看</div>
			<div>会自动的</div>
			<div>我的网站</div>
		</div>
		<div id="banner">
			<div id="hezi">
				<div></div>
				<div></div>
				<div></div>
				<div></div>
				<div></div>
			</div>
		</div>
		<div id="button">
			<div></div>
			<div></div>
		</div>
	</div>
</body>
<script>
		window.onload=function(){
		//封装查找节点的函数
		function id(id){
			return typeof(id)==="string"?document.getElementById(id):id;
		}
		var menu=id("menu"),//最外面的盒子
			nav=id("nav"),//导航条
			navneirong=nav.getElementsByTagName("div"),
			banner=id("banner"),//图片
			hezi=id("hezi"),//移动的盒子
			img=hezi.getElementsByTagName("div"),
			imgWidth=img[0].offsetWidth,//图片的宽度
			length=img.length,//图片的个数
			button=id("button").getElementsByTagName("div"),//按钮
			timer=null,
			timer2=null,
			index=0;
		//封装创建事件的函数
		function addHandler(element, type, handler) {
    		if (element.addEventListener) {
        		element.addEventListener(type, handler, true);
    		}
    		else if (element.attachEvent) {
        		element.attachEvent('on' + type, handler);
    		}
    		else {
        		element['on' + type] = handler;
    		}
			}
		//利用定时器封装滑动效果的函数
		function donghua(){
			clearInterval(timer);//先清除定时器
			timer=setInterval(function(){
				var juli=hezi.offsetLeft;
				var target=-index * imgWidth;
				var panduan=juli > target ? true : false;
				//主要是这段代码不理解,为什么juli-=10;?逻辑分析一下?而且肯定有问题
				if(panduan){
				   juli-=40;
				   }else{
				   juli+=40;
				   }
				if (panduan ? juli > target : juli < target) {
                    hezi.style.left = juli + "px";  //如果当前位置不是在目标位置则进行位置处理
                } else {
                    clearInterval(timer);
                    hezi.style.left = target + "px";
                }/**/
			},10);
		}
		//封装自动轮播的效果的函数
		function dingshiqi(){
			timer2=setInterval(function(){
				index++;
				if(index>3){index=0;}
				donghua();
			},3000);
		}
		//封装解除自动轮播的函数
		function qingchu(){
			if(timer2){clearInterval(timer2);}
		}
		//给向左移动的按钮添加事件
		addHandler(button[1],"click",function(){
			if(index==0){//确定图片的索引
				index=length-1;
				hezi.style.left=-index * imgWidth + "px";
			}
			index--;
			donghua();
			for(var j=0;j<navneirong.length;j++){//改变导航条
					navneirong[j].className="";
				};
				navneirong[index].className="bg";
		});
		//给向右移动的按钮添加事件
		addHandler(button[0],"click",function(){
			if (index == len - 1) {//确定图片的索引
                index = 0;
                hezi.style.left = 0 + "px";
				navneirong[0].className="bg";
            }
            index++;
			donghua();
			for(var j=0;j<navneirong.length;j++){//改变导航条
					navneirong[j].className="";
				};
				navneirong[index].className="bg";
		});
		//给导航条添加事件
		for(var i=0,len=img.length;i<len-1;i++){
			navneirong[i].id=i;
			addHandler(navneirong[i],"click",function(){
				index=this.id;
				for(var j=0;j<navneirong.length;j++){//切换按钮
					navneirong[j].className="";
					img[j].className="hide";
				};
				img[index].className="";
				navneirong[index].className="bg";
				for(var d=0;d<navneirong.length;d++){
					if(d==index){
					   navneirong[d].className="bg";
					   }else{
					   navneirong[d].className="";
					   }
					if(index==img.length-1){navneirong[0].className="bg";}
					//添加一个判断,
				}
			});
		}
		//添加自动轮播事件
		dingshiqi();
		addHandler(menu,"mouseover",qingchu);
		addHandler(menu,"mouseout",dingshiqi);
		}
</script>
</html>
@charset "utf-8";
/* CSS Document */
	*{margin: 0;padding: 0;}
	#menu{width: 1200px;height: 500px;margin: 0 auto;position: relative;}
	#nav{width: 100%;height: 38px;line-height: 38px;font-size: 18px;overflow: hidden;color: #666;font-weight: 700;}
	#nav div{float: left;width: 25%;text-align: center;cursor: pointer;}
	#banner{overflow: hidden;width: 1200px;height: 460px;position: relative;}
	#hezi{overflow: hidden;width: 6000px;position: relative;}
	#hezi div{width: 1200px;height: 460px;float: left;}
	#banner #hezi div:first-of-type,#banner #hezi div:last-of-type{
		background-image: url("../img/1.jpg");background-repeat: no-repeat;}
	#banner #hezi div:nth-of-type(2){background-image: url("../img/3.jpg");background-repeat: no-repeat;}
	#banner #hezi div:nth-of-type(3){background-image: url("../img/4.jpg");background-repeat: no-repeat;}
	#banner #hezi div:nth-of-type(4){background-image: url("../img/5.jpg");background-repeat: no-repeat;}
	#button div:first-of-type{position: absolute;width: 16px;height: 30px;right: 20px;top: calc(50% - 15px);
		background-image: url("../img/arrow.png");z-index: 400;cursor: pointer;}
	#button div:last-of-type{position: absolute;width: 16px;height: 30px;left: 20px;top: calc(50% - 15px);
		background-image: url("../img/arrow.png");transform: rotate(180deg);z-index: 401;cursor: pointer;}
	.bg{background-color: #ffcc00;}
	.hide{display: none;}


正在回答 回答被采纳积分+1

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

1回答
好帮手慕慕子 2019-12-20 14:54:29

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

  1. 因为设置left才可以让hezi移动,显示不同的图片。

    如下所示,默认显示第一张图片,其他图片挨着第一张图片的后面显示.

    http://img1.sycdn.imooc.com//climg/5dfc623409de9d1919200900.jpg

    给盒子设置left值,改变盒子的位置,显示不同的图片,如下:

    http://img1.sycdn.imooc.com//climg/5dfc62fd0971b30b19200862.jpg

  2. 如下所示这段代码, index等于0时,当前显示第一张图片,再点击左侧按钮时,需要显示第四张图片。 

    http://img1.sycdn.imooc.com//climg/5dfc634909428c3c08140134.jpg

    也就是如下这种情况:

    http://img1.sycdn.imooc.com//climg/5dfc664b09052fd316770885.jpg

    我们这里添加判断,让盒子瞬间移动,显示最后一张图片(我们提前添加的与第一张图片一样的图片),此时在视觉上显示的还是第一张图片,实现从第一张图片慢慢切换到第四张图片的效果。如下:

    http://img1.sycdn.imooc.com//climg/5dfc6708094d308e19130888.jpg

  3. 如下这部分代码,与前面的原理一样,当index等于len-1时,显示的是最后一张图片

    http://img1.sycdn.imooc.com//climg/5dfc674709e8809304300153.jpg

    http://img1.sycdn.imooc.com//climg/5dfc682909e7afed17830621.jpg

    我们这里添加判断,让盒子瞬间移动,显示第一张图片,此时在视觉上显示的还是第一张图片,实现从第一张图片慢慢切换到第二张图片的效果。如下:

    http://img1.sycdn.imooc.com//climg/5dfc6897096f50fb17360831.jpg

  4. 老师给你添加的这段代码是针对图片向左移动过程, 对导航的样式进行设置,因为图片最后一张是与第一张图片一行,所以当移动到最后一张的时候,需要给第一个选项卡设置特殊样式

    http://img1.sycdn.imooc.com//climg/5dfc6a0709f9559406820315.jpg

  5. 两者不是重复的。老师给你提供的代码对index进行了判断,下图这种写法没有,选项卡只有四个,最大索引是3,那么移动到最后一张图片时,index的值是4,nacneirogn[4]获取不到元素,导致报错。

    http://img1.sycdn.imooc.com//climg/5dfc6a3c0941bb3307680398.jpg

  6. 因为juli是盒子每一次轮播移动的距离,可能会由于计算的误差,并不能刚刚好移动到下一张图片显示的区域。所以添加一层判断,确保hezi一定能够移动到要显示的区域。

  7. 右按钮移动到第一张图片的时候,导航条不显示问题,  需要在右按钮点击事件下,添加判断

    http://img1.sycdn.imooc.com//climg/5dfc6f6109d38b2b09250607.jpg

如果帮助到了你,欢迎采纳,祝学习愉快~

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

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

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

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

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

帮助反馈 APP下载

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

公众号

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

在线咨询

领取优惠

免费试听

领取大纲

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