1. 程式人生 > >原生JS做圖片輪播(自動或手動)

原生JS做圖片輪播(自動或手動)

前言

    前端基本上靠用現成的封裝好的控制元件的我,今天也算是自己改了一回程式碼,也自己寫了寫原生JS,改了一下響應程式碼。需求是這樣的,頁面的記錄中有多個附件,如果附件是圖片的話,檢視圖片時要多張圖片進行輪播,實際需求是不能自動,要手動控制圖片切換。說起來也不難,用外掛就好了,但是查了好多外掛都用到了jquery.min.js,但是這個js檔案和專案中用的EasyUI引用的js檔案衝突了,解決衝突沒成功,所以改方案了,換成原生JS寫了,發現還是原生JS好理解。

輪播原理

先看一下我們需要的效果:

           

    下面就是圖片輪播的原理,原理並不難,實現起來有點麻煩,不過細心點還是很好玩的。

        1、設定li放需要輪播的圖片

        2、設定li放輪播圖片的縮圖

        3、設定圖片自動輪播

        4、設定縮圖的onmouseover事件切換圖片

程式碼展示

<head>
	<meta charset="UTF-8">
	<title>圖片左右輪播</title>
	<style>
		body, div, ul, li {
			margin: 0;
			padding: 0;
		}

		ul {
			list-style-type: none;
		}

		body {
			background: #000;
			text-align: center;
			font: 12px/20px Arial;
		}

		#box {
			position: relative;
			width: 600px;
			height: 300px;
			background: #fff;
			border-radius: 5px;
			border: 8px solid #fff;
			margin: 10px auto;
		}

		#box .list {
			position: relative;
			width: 600px;
			height: 300px;
			overflow: hidden;
			border: 1px solid #ccc;
		}

		#box .list li {
			position: absolute;
			top: 0;
			left: 0;
			width: 490px;
			height: 170px;
			opacity: 0;
			transition: opacity 0.5s linear
		}

		#box .list li.current {
			opacity: 1;
		}

		#box1 .count {
			position: relative;
			right: 0;
			left:500;
			bottom: 5px;
		}

		#box1 .count li {
			color: #fff;
			float: left;
			width: 50px;
			height: 50px;
			cursor: pointer;
			margin-right: 5px;
			overflow: hidden;
			background: #F90;
			opacity: 0.5;
		}

		#box1 .count li.current {
			color: #fff;
			opacity: 1;
			font-weight: 700;
			background: #f60
		}
	</style>
</head>
<body>
	<div id="box">
		<ul class="list">
			<li class="current" style="opacity: 1;"><img src="img/1.jpg" width="600" height="300"></li>
			<li style="opacity: 0;"><img src="img/2.jpg" width="600" height="300"></li>
			<li style="opacity: 0;"><img src="img/3.jpg" width="600" height="300"></li>
			<li style="opacity: 0;"><img src="img/4.jpg" width="600" height="300"></li>
			<li style="opacity: 0;"><img src="img/5.jpg" width="600" height="300"></li>
			<li style="opacity: 0;"><img src="img/6.jpg" width="600" height="300"></li>
		</ul>
	</div>
	<div id="box1">
		<ul class="count">
			<li class="current"><img src="img/1.jpg" width="50" height="50"></li>
			<li class=""><img src="img/2.jpg" width="50" height="50"></li>
			<li class=""><img src="img/3.jpg" width="50" height="50"></li>
			<li class=""><img src="img/4.jpg" width="50" height="50"></li>
			<li class=""><img src="img/5.jpg" width="50" height="50"></li>
			<li class=""><img src="img/6.jpg" width="50" height="50"></li>
		</ul>
	</div>
 
	<script>
		var box=document.getElementById('box');
		var uls=document.getElementsByTagName('ul');
		var imgs=uls[0].getElementsByTagName('li');
		var btn=uls[1].getElementsByTagName('li');
		var i=index=0; //中間量,統一宣告;
		var play=null;
		console.log(box,uls,imgs,btn);//獲取正確

		//圖片切換, 淡入淡出效果(transition: opacity 0.8s linear)做的
		function show(a){        //方法定義的是當傳入一個下標時,按鈕和圖片做出對的反應
			for(i=0;i<btn.length;i++ ){
				btn[i].className='';    //每個縮圖都先設定成看不見,然後把當前縮圖設定成可見。
				btn[a].className='current';
			}
			for(i=0;i<imgs.length;i++){ //把圖片的效果設定和縮圖片相同
				imgs[i].style.opacity=0;
				imgs[a].style.opacity=1;
			}
		}
		//切換按鈕功能,響應對應圖片
		for(i=0;i<btn.length;i++){
			btn[i].index=i;  
			btn[i].onmouseover=function(){
				show(this.index);
				clearInterval(play); 
			}
		}

		//自動輪播方法
		function autoPlay(){
			play=setInterval(function(){ //這個paly是為了儲存定時器的,變數必須在全域性宣告
				index++;
				index>=imgs.length&&(index=0);//可能有優先順序問題,所以用了括號
				show(index);
			},1000)
		}
		autoPlay();//呼叫自動輪播的方法

		//div的滑鼠移入移出事件
		box.onmouseover=function(){
			clearInterval(play);
		};
		box.onmouseout=function(){
			autoPlay();
		};
	</script>
</body>
</html>
          這是在網上找了一個實現的程式碼,然後改成了想要的樣式。其實在html中,我們的需求是動態讀取附件圖片,然後載入到頁面上,所以html中的li都是js拼接完成後放到頁面上的。

    另外,需要注意一個點,就是切換縮圖時,需要切換圖片。

//切換按鈕功能,響應對應圖片
for(i=0;i<btn.length;i++){
	btn[i].index=i;  
	btn[i].onmouseover=function(){
		show(this.index);
		clearInterval(play); 
	}
}
    這個方法是註冊給縮圖的,要注意它載入的時間,是需要在li載入完成之後的。上面說到,專案中的li是用js動態拼接的,是根據資料庫的資料來的,所以開始的時候把這個方法寫在了頁面中,是沒有任何效果的,它應該在js載入完li之後載入,才能把方法註冊上去。

總結

    其實這個輪播還是特別簡單的,上網查資料的時候,有好多外掛做的效果都特別炫,因為需求簡單,所以選擇了一個簡單的。在實現過程中,因為前臺的薄弱,那些封裝好的外掛自己除錯不了,js衝突了之後,用的noConflict方法解決,沒有成功,只好選用原生的JS,感覺原生的JS還是比較熟悉的。在專案中還有一個需求是,點選某個圖片時,圖片輪播預設它為第一個圖片,只需要知道點選的li的index,然後設定顯示圖片的相同index的li透明度為1就好了。