JS小案例:無縫輪播圖-面向過程

不廢話,直接上代碼

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>輪播</title>
		<style>
			* {margin: 0;padding: 0}
			#box{width: 850px;height: 600px;margin: 100px auto;position: relative;overflow: hidden;}
			#box img{width: 850px;height: 600px;vertical-align: top}
			ul {width: 1000%;position: absolute;list-style: none;left:0;top: 0;}
			#box li{float: left;}
			ol {position: absolute;height: 20px;right: 20px;bottom: 20px;text-align: center;padding: 5px;}
			ol li{display: inline-block;width: 20px;height: 20px;line-height: 20px;background-color: #fff;margin: 5px;cursor: pointer;border-radius: 10px;}
			ol .ac{background-color: red;}
			#arr span{width: 40px;height: 40px;background: #fff;position: absolute;left: 0;top: 50%;margin-top: -20px;cursor: pointer;line-height: 40px;text-align: center;font-weight: bold;font-family: '黑體';font-size: 30px;color: #000;opacity: 0.5;border: 1px solid #fff;}
			#arr #right {right: 0;left: auto;}
		</style>
	</head>
	<body>
		<div id="box">
			<ul>
				<li><a href="#"><img src="img/1.jpg" alt=""></a></li>
				<li><a href="#"><img src="img/2.jpg" alt=""></a></li>
				<li><a href="#"><img src="img/3.jpg" alt=""></a></li>
				<li><a href="#"><img src="img/4.jpg" alt=""></a></li>
				<li><a href="#"><img src="img/5.jpg" alt=""></a></li>
				// 注意!多加一張圖1
				<li><a href="#"><img src="img/1.jpg" alt=""></a></li>
			</ul>
			<ol class="bar">
				<li class="ac">1</li>
				<li>2</li>
				<li>3</li>
				<li>4</li>
				<li>5</li>
			</ol>
			<div id="arr">
				<span id="left"> <</span>
				<span id="right">></span>
			</div>
		</div>

		 <script>
			//獲取各元素
			var box=document.getElementById("box");
			var ul=box.children[0];
			var li=ul.children;
			// console.log(li.length); //6
			var liBtn=box.children[1].children;
			var moveWidth=box.offsetWidth;
			var left=document.getElementById("left");
			var right=document.getElementById("right");
			var pic=0; // 記錄圖片索引
			// 給所有按鈕綁定事件
			for(let i=0;i<liBtn.length;i++){
				// 爲按鈕註冊mouseover事件
				liBtn[i].onclick=function () {
					for(let j=0;j<liBtn.length;j++){liBtn[j].className="";}// 先清除所有按鈕的樣式
					this.className="ac"; // 爲點擊按鈕改樣式
					pic=i;
					picMove(ul,-pic*moveWidth);
				}
			}

			// 自動播放
			var timer=setInterval(picChange,3000);
			
			// 鼠標進入暫停退出繼續
			box.onmouseenter=()=>{clearInterval(timer);};
			box.onmouseleave=()=>{timer=setInterval(picChange,3000);};
			
			// 左右按鈕實現點擊切換圖片功能
			right.onclick=picChange;
			left.onclick=()=>{
				// 如果點擊第一張圖,沒有平移效果,所以改成第6張圖
				if (pic==0){
					pic=li.length-1;
					ul.style.left=-pic*moveWidth+"px";
				}
				pic--;
				picMove(ul,-pic*moveWidth);
				for (let i = 0; i < liBtn.length; i++) {liBtn[i].className = "";}
				// 當前的pic索引對應的按鈕設置顏色
				liBtn[pic].className = "ac";
			}
			// 判斷切換到哪一張
			function picChange(){
				// console.log(ul); // 6
				// console.log(li.length); // 6
				console.log(pic);
				//如果pic的值是5,頁面顯示的是第六個圖片,但和第一張一樣
				//再次點擊按鈕,應該跳第二個圖片
				if (pic == li.length-1) {
					ul.style.left = 0+"px";//把ul的位置還原成開始的默認位置,從第6個圖,跳轉到第1個圖
					pic = 0;// pic變成第一張圖索引
				}
				pic++;// 立刻設置pic加1,那麼此時用戶就會看到第二個圖片了
				picMove(ul, -pic*moveWidth);//pic從0的值加1之後,pic的值是1,然後ul移動出去一個圖片
				//如果pic==5說明,此時顯示第6個圖(內容是第一張圖片),第一個小按鈕有顏色,
				console.log(pic);
				if (pic == li.length-1) {
					liBtn[liBtn.length-1].className = ""; // 清除第五個按鈕顏色
					liBtn[0].className="ac"; // 第一個按鈕顏色設置上
				} else {
					for (var i = 0; i < liBtn.length; i++) {liBtn[i].className="";}
					liBtn[pic].className="ac"; // 清除所有的小按鈕的背景顏色
				}
			}
			
			//移動過程:任意一個元素移動到指定的目標位置
			function picMove(item, target) {
				clearInterval(item.timer);
				//定時器的id值存儲到對象的一個屬性中
				item.timer = setInterval(()=>{
					var _left = item.offsetLeft; // 獲取元素的當前的位置,數字類型
					var step = 50; // 每次移動的距離
					step = _left < target ? step : -step;
					_left += step; // 當前移動到位置
					if (Math.abs(_left - target) > Math.abs(step)) {
						item.style.left = _left + "px";
					} else {
						clearInterval(item.timer); // 清理定時器
						item.style.left = target + "px"; // 直接到達目標
					}
				}, 10);
			}
		</script>
	</body>
</html>

效果圖:
無縫輪播

發佈了51 篇原創文章 · 獲贊 69 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章