1. 程式人生 > >原生js實現圖片詳情頁面放大鏡

原生js實現圖片詳情頁面放大鏡

最近的網站專案需要實現這個放大鏡,在網上也下載了一些實現了的程式碼,不過感覺比較笨重,就自己寫了一次,實現了,需要的朋友可以拿去用;

以下是html部分:

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title></title>
		<link rel="stylesheet" href="css/fdj.css" />
		<script src="js/fdj.js"></script>
	</head>
	<body>
		<div id='bigDiv' class='clearfix'>
			<div class='left_div'>
				<div id='mid_div'>
					<img src="images/detail_img/image1.jpg" alt="" />
					<div id='gai'></div>
				</div>
				<div id='min_div' class='clearfix'>
					<img src="images/detail_img/image1.jpg" alt="" data-num='1'/>
					<img src="images/detail_img/image2.jpg" alt="" data-num='2'/>
					<img src="images/detail_img/image3.jpg" alt="" data-num='3'/>
					<img src="images/detail_img/image4.jpg" alt="" data-num='4'/>
					<img src="images/detail_img/image5.jpg" alt="" data-num='5'/>
				</div>
				
			</div>
			
			<div id='max_div'>
				<img src="images/detail_img/image1.jpg" alt="" />
			</div>
		</div>
	</body>
</html>

以下是css部分:

*{
	margin:0;
	padding:0;
	
}
/*去掉浮動*/	
.clearfix:after{
		height:0;
		content:" ";
		display:block;
		overflow:hidden;
		clear:both;
	}
.clearfix{
	zoom:1;/*IE低版本瀏覽器不支援after偽類所以要加這一句*/
}


#bigDiv img{
	display:block;
}
#bigDiv{
	overflow:hidden;
	background:pink;
}
/*左盒子*/
.left_div{
	float:left;
}
/*中盒子*/
#mid_div{
	width:350px;
	height:350px;
	border:8px solid #ccc;
	position:relative;/*相對定位*/
}
#mid_div img{
	width:100%;
}
#gai{
	width:100px;
	height:100px;
	background:rgba(67,98,230,0.4);
	position:absolute;/*子絕父相*/
	display:none;
}
/*大盒子*/
#max_div{
	float:left;
	position:relative;/*相對定位*/
	border:4px solid #ccc;
	overflow:hidden;
	display: none;
}
#max_div img{
	/*子絕父相*/
	position:absolute;
}
/*小盒子*/
#min_div{
	/*float:left;*/
	width:350px;
}
#min_div img{
	float:left;
	width:20%;
}

以下是js部分:

window.onload = function(){
	// 預載入
	new Image().src='images/detail_img/image1.jpg';
	new Image().src='images/detail_img/image2.jpg';
	new Image().src='images/detail_img/image3.jpg';
	new Image().src='images/detail_img/image4.jpg';
	new Image().src='images/detail_img/image5.jpg';
	
	var bigDiv = document.getElementById('bigDiv'),
		mid_div = document.getElementById('mid_div'),
		mid_img = mid_div.children[0],
		gai = mid_div.children[1],
		min_div = document.getElementById('min_div'),
		min_imgs = min_div.children,
		max_div = document.getElementById('max_div'),
		max_img = max_div.children[0];
	
	// 滑鼠放上小的img上 中盒子和大盒子都需要更換圖片的src
	console.log(min_imgs.length,min_imgs)
	for(var i=0,len=min_imgs.length;i<len;i++){
		(function(j){
			min_imgs[j].onmouseenter = function(){
				var img_src = this.src;
				mid_img.src = img_src;
				max_img.src = img_src;
			}
		})(i)
	}
	
	// 滑鼠放上顯示gai 移開隱藏
	mid_div.onmouseenter = function(){
		gai.style.display = 'block';
		max_div.style.display = 'block';
	};
	mid_div.onmouseleave = function(){
		gai.style.display = 'none';
		max_div.style.display = 'none';
	};
	
	//相容的滑動位置 madeby:張飛龍
	// 滾動條的畫素相容寫法
	window.scroll = function(){
		return {
			"top":document.pageYOffset || document.body.scrollTop || document.documentElement.scrollTop,
			"left":document.pageXOffset || document.body.scrollLeft || document.documentElement.scrollLeft
		}
	}
	// 在中盒子上滑動的時候 需要獲取滑鼠在mid_div中的座標位置
	mid_div.onmousemove = function(event){
		event = event || window.event;
		//獲取滑鼠在文件中的座標位置 = 滾動條的px+距離瀏覽器邊的px
		var pageX = event.pageXOffset || window.scroll().left + event.clientX;
		var pageY = event.pageYOffset || window.scroll().top + event.clientY;
 		//console.log(pageX,pageY)
 		//mid_div盒子相對於有定位的父盒子的位置;沒有定位的盒子則為body
 		var mid_divX = mid_div.offsetLeft,
 			mid_divY = this.offsetTop;
		//console.log(mid_divX,mid_divY)
		//讓gai盒子的位置和滑鼠一起動起來,最好滑鼠的在gai中心位置,
		//X為gai盒子的位置,等於滑鼠相對body的位置-mid_div的盒子相對body的位置-gai盒子自身寬度的一半
		var X = pageX - mid_divX - gai.offsetWidth/2;
		var Y = pageY - mid_divY - gai.offsetHeight/2;
		//console.log(X,Y)
		// 設定邊界
		if(X<=0){X=0};
		if(Y<=0){Y=0};
		var max_left = mid_div.scrollWidth-gai.offsetWidth;
		var max_top = mid_div.scrollHeight - gai.offsetWidth;
		if(X>=max_left){
			X = max_left;
		}
		if(Y>=max_top){
			Y = max_top;
		}
		// 設定位置
		gai.style.left = X + 'px';
		gai.style.top = Y + 'px';
		// 大盒子的大小應該計算出來,和gai盒子等比例就很好了,這樣設計比較好
		var biliX = gai.offsetWidth/mid_div.scrollWidth;
		var biliY = gai.offsetHeight/mid_div.scrollHeight;
		max_div.style.width = biliX * max_img.offsetWidth + 'px';
		max_div.style.height = biliY * max_img.offsetHeight + 'px';
		
 		var bili = mid_div.scrollWidth/max_img.offsetWidth;
 		//console.log(bili)
 		
		max_img.style.left = -X/bili + 'px';
		max_img.style.top = -Y/bili + 'px';
	};
}

感覺現在的csdn粘程式碼越來越醜了。