排他思想在轮播图中的应用

之前是在选项卡菜单中用到了排他思想,当前选项卡样式与其他选项卡不同,怎么办呢?先用for循环遍历一遍,把所有的选项卡样式清掉,然后再设置当前的选项卡样式。
这两天学习轮播图的制作,发现在轮播图中,多处用到了排他思想。
1.点击小圆点时,当前小圆点对应的样式红色(.current),对应的图片显示,其他图片隐藏.

	for (let i = 0; i < num; i++) {
    
    
		ol.children[i].addEventListener('click', function() {
    
    
			for (let k = 0; k < num; k++) {
    
      	/*排他思想*/
				ol.children[k].className = '';
				ul.children[k].className = '';
			}
			this.className = 'current';
			ul.children[i].className = 'opa';
			disc = i; /*点击的小圆点设置为当前的*/
		})
	}

2.点击右侧箭头,小圆点下标+1,也要把其他 的样式去掉,再设置(.current),图片所在列表项显示‘.opa’

	arrowRight.addEventListener('click', function() {
    
    
		disc++; //圆点样式
		if (disc == num) {
    
    
			disc = 0;
		}
		for (let k = 0; k < num; k++) {
    
         	/*排他思想*/
			ol.children[k].className = '';
			ul.children[k].className = '';
		}
		ol.children[disc].className = 'current';
		ul.children[disc].className = 'opa';
	})

3.点击左侧箭头,小圆点下标-1,然后也要用排他思想。

arrowLeft.addEventListener('click', function() {
    
    
		disc--;
		if (disc < 0) {
    
    
			disc = num - 1;
		}
		for (let k = 0; k < num; k++) {
    
      	/*排他思想*/
			ol.children[k].className = '';
			ul.children[k].className = '';
		}
		ol.children[disc].className = 'current';
		ul.children[disc].className = 'opa';
	})

下面附上完整的轮播图代码。和上一篇文章的代码比,有以下几个变化:
1.鼠标移动到轮播图上,左右箭头的显示,是通过css的:hover实现的,感觉代码要比js代码简单。

.focus:hover div {
    
    
	display: block;
}
focus.addEventListener('mouseover', function() {
    
    
	arrowLeft.style.display = 'block';
	arrowRight.style.display = 'block';
})
focus.addEventListener('mouseout', function() {
    
    
    arrowLeft.style.display = 'none';
	arrowRight.style.display = 'none';
})

2.小圆点所在的列表,列表项没有动态生成,ul有几项,ol就有几项,直接写在html文件中。

<ol class="disc"> 
	<li class='current'></li>
	<li></li>
	<li></li>
</ol>

完整代码如下:
一、HTML文件rotation2.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>轮播图-透明度实现</title>
		<link rel="stylesheet" href="css/rotation2.css">
		<script src="js/rotate2.js" charset="utf-8"></script>
	</head>
	<body>
		<div class="focus">
			<ul class="carousel">				      <!-- 轮播图列表 -->
				<li class="opa"><a href="#"><img src="images/1.jpg" alt=""></a></li>
				<li><a href="#"><img src="images/2.jpg" alt=""></a></li>
				<li><a href="#"><img src="images/3.jpg" alt=""></a></li>
			</ul>
			<div class="arrowLeft">&lt;</div>  <!-- 左侧按钮 -->
			<div class="arrowRight">&gt;</div> <!-- 右侧按钮 -->
			<ol class="disc"> 
				<li class='current'></li>
				<li></li>
				<li></li>
			</ol>
		</div>
	</body>
</html>


二、CSS文件rotation2.css

* {
    
    
	margin: 0;
	padding: 0;
}

ul,ol,li {
    
    
	list-style: none;
}

.focus {
    
    
	position: relative;
	width: 1000px;
	height: 375px;
	margin: 10px auto;
	overflow: hidden;
}

.carousel {
    
    
	position: absolute;
	width: 100%;
	left: 0px;
	top: 0px;
}

.carousel li {
    
    
	position: absolute;	/*绝对定位*/
	top: 0px;
	left: 0px;
	opacity: 0;
	transition: opacity 1s; 	/*设置切换时过渡效果*/
}

.carousel li.opa {
    
      /*li和.opa之间,无空格*/
	opacity: 1;   	
}

.carousel li img {
    
    
	width: 1000px;
	height: 375px;
}

.focus div {
    
    
	display: none;
	position: absolute;
	top: 50%;
	transform: translate(0, -50%);	/*上移,使垂直居中*/
	width: 36px;
	height: 40px;
	line-height: 40px;
	text-align: center;
	color: #fff;
	font-size: 36px;
	z-index: 99;
	cursor: pointer;
}

.focus:hover div {
    
    
	display: block;
}

.arrowLeft {
    
    
	left: 10px;
}

.arrowRight {
    
    
	right: 10px;
}

.arrowLeft:hover,
.arrowRight:hover {
    
    
	background-color: rgba(128, 128, 128, .5);
}

.disc {
    
    
	position: absolute;
	bottom: 10px;
	right: 50px;
	z-index: 99;
}

.disc li {
    
    
	display: inline-block;
	width: 8px;
	height: 8px;
	background-color: #ccc;
	margin: 0 3px;
	border-radius: 50%;
	cursor: pointer;
}

.disc li.current {
    
    	/*li和.current之间,无空格*/
	background-color: #f00;
}

三、JavaScript文件

window.addEventListener('load', function() {
    
    
	var focus = document.querySelector('.focus');
	var arrowLeft = document.querySelector('.arrowLeft');
	var arrowRight = document.querySelector('.arrowRight');
	var ul = focus.querySelector('ul');
	var ol = focus.querySelector('ol');
	var num = ul.children.length;
	var disc = 0;
	//点击小圆点时,当前小圆点对应的样式,对应的图片显示
	for (let i = 0; i < num; i++) {
    
    
		ol.children[i].addEventListener('click', function() {
    
    
			for (let k = 0; k < num; k++) {
    
      				/*排他思想*/
				ol.children[k].className = '';
				ul.children[k].className = '';
			}
			this.className = 'current';
			ul.children[i].className = 'opa';
			disc = i; /*点击的小圆点设置为当前的*/
		})
	}
	//点击右侧箭头,小圆点下标+1
	arrowRight.addEventListener('click', function() {
    
    
		disc++; //圆点样式
		if (disc == num) {
    
    
			disc = 0;
		}
		for (let k = 0; k < num; k++) {
    
       	/*排他思想*/
			ol.children[k].className = '';
			ul.children[k].className = '';
		}
		ol.children[disc].className = 'current';
		ul.children[disc].className = 'opa';
	})
	// 点击左侧箭头,小圆点下标-1
	arrowLeft.addEventListener('click', function() {
    
    
		disc--;
		if (disc < 0) {
    
    
			disc = num - 1;
		}
		for (let k = 0; k < num; k++) {
    
      	/*排他思想*/
			ol.children[k].className = '';
			ul.children[k].className = '';
		}
		ol.children[disc].className = 'current';
		ul.children[disc].className = 'opa';
	})
	//自动播放,像点击右侧按钮
	var timer = setInterval(function() {
    
    
		arrowRight.click();
	}, 3000);
	
	//鼠标移动到轮播图,停止轮播
	focus.addEventListener('mouseover', function() {
    
    
		clearInterval(timer);
		timer = null;
	})
	//鼠标离开,开始轮播
	focus.addEventListener('mouseout', function() {
    
    
		timer = setInterval(function() {
    
    
			arrowRight.click();
		}, 3000);
	})
})


可以看出,js文件中,应用了排他思想的三处代码是重复的,可以把这部分代码提取出来,单独写成一个函数disp(now).

	function disp(now){
    
    
		for (let k = 0; k < num; k++) {
    
       	/*排他思想*/
			ol.children[k].className = '';
			ul.children[k].className = '';
		}
		ol.children[now].className = 'current';
		ul.children[now].className = 'opa';
	}

修改后的完整的js文件如下。

window.addEventListener('load', function() {
    
    
	var focus = document.querySelector('.focus');
	var arrowLeft = document.querySelector('.arrowLeft');
	var arrowRight = document.querySelector('.arrowRight');
	var ul = focus.querySelector('ul');
	var ol = focus.querySelector('ol');
	var num = ul.children.length;
	var disc = 0;
	
	function disp(now){
    
    
		for (let k = 0; k < num; k++) {
    
       	/*排他思想*/
			ol.children[k].className = '';
			ul.children[k].className = '';
		}
		ol.children[now].className = 'current';
		ul.children[now].className = 'opa';
	}
	//点击小圆点时,当前小圆点对应的样式,对应的图片显示
	for (let i = 0; i < num; i++) {
    
    
		ol.children[i].addEventListener('click', function() {
    
    
      disp(i); /*调用函数*/
			disc = i; /*点击的小圆点设置为当前的*/
		})
	}
	//点击右侧箭头,小圆点下标+1
	arrowRight.addEventListener('click', function() {
    
    
		disc++; //圆点样式
		if (disc == num) {
    
    
			disc = 0;
		}
		disp(disc);  /*调用函数*/
	})
	// 点击左侧箭头,小圆点下标-1
	arrowLeft.addEventListener('click', function() {
    
    
		disc--;
		if (disc < 0) {
    
    
			disc = num - 1;
		}
		disp(disc); /*调用函数*/
	})
	//自动播放,像点击右侧按钮
	var timer = setInterval(function() {
    
    
		arrowRight.click();
	}, 3000);
	
	//鼠标移动到轮播图,停止轮播
	focus.addEventListener('mouseover', function() {
    
    
		clearInterval(timer);
		timer = null;
	})
	//鼠标离开,开始轮播
	focus.addEventListener('mouseout', function() {
    
    
		timer = setInterval(function() {
    
    
			arrowRight.click();
		}, 3000);
	})
})


猜你喜欢

转载自blog.csdn.net/wangyining070205/article/details/124768997