JavaScript||放大镜效果

前几天逛淘宝网页版,在详情页,鼠标经过商品图片时,会在右侧出现对应的局部放大图,感觉好好玩(主要是想试试会不会做~),就自己尝试实现了,嘿嘿,一起来康康叭!

1,HTML页面布局

其实这个效果,揉碎了就是一个大盒子里面放左右两个小盒子:左边小盒子里面放小图片和半透明遮挡图;右边小盒子放大图片。
下面放代码和布局完毕后的图片~

//注:以下内容写在body里面噢
<div id="box">
	<div id="yt">
		<div id="yel"></div>
		<img src="img/14-photo.png" />
	</div>
	<div id="bt">
		<img src="img/14-photo.png" />
	</div>
</div>

在这里插入图片描述

2,css样式美化

你可能会说,哦买噶~纯布局的图片是在逗我吗?哈哈,纯HTML代码是不能满足我们的要求的,这就是为什么要进行样式设计的原因啦,下面先放添加css样式后的效果图片吧:
在这里插入图片描述
布局没啥好说的,看大家的审美吧哈哈哈,还是挑几个记录一下吧:
1)以为后面要实时获取鼠标在图片中的实时位置,所以必须要对元素定位,这里我都选择了绝对定位(position: absolute;)。
2)设置透明度的属性是opacity,值的范围是0-1,值越小,透明度越高,0就相当于消失了(opacity: 0.25;)。
3)观察,发现半透明框是存在于原图上面的,可以用属性z-index来实现设置元素的叠加顺序(z-index: 999;)。
4)一开始应该让半透明层和大图片盒子隐藏,方便后面操作(display: none;)

<style type="text/css">
	#box{
		position: absolute;
		top: 100px;
		left: 100px;
	}
	#yt{
		width: 200px;
		height: 200px;
		border: 1px solid black;
		cursor: move;
	}
	#yt img{
		position: absolute;
		top: 40px;
		left: 40px;
		width: 120px;
		height: 120px;
	}
	#yel{
		z-index: 999;
		position: absolute;
		width: 88px;
		height: 88px;
		background-color: orange;
		opacity: 0.25;
		display: none;
	}
	#bt{
		display: none;
		position: absolute;
		top: 0;
		left: 220px;
		width: 300px;
		height: 300px;
		/*border: 1px solid black;*/
		box-shadow: 2px 2px 2px #808080;
		overflow: hidden;
	}
	#bt img{
		position: absolute;
		top: 0;
		left: 0;
		width: 500px;
		height: 500px;
	}
</style>

3,js实现功能

分析发现,整个效果就是,鼠标进入图片时生效,鼠标离开图片时隐藏半透明图层和大图。
鼠标进入图片(左边盒子)时,根据鼠标的实时位置,对应移动半透明图层的位置,同时保证半透明图层始终位于图片的框内。
很明显,半透明图层在左边盒子的实时位置,就是等于当前鼠标的位置减去左边盒子的位置(pageX、pageY、offsetLeft、offsetTop)。
接着根据半透明图层的位置,移动大图在右边盒子的位置,从而实现局部放大效果。
下面是代码:

<script type="text/javascript">
	window.onload = function(){
		var yt = document.getElementById("yt");
		var yel = document.getElementById("yel");
		var bt = document.getElementById("bt");
		var img = bt.querySelector("img");
		//鼠标进入小盒子
		yt.addEventListener("mouseenter", function(){
			yel.style.display = "block";
			bt.style.display = "block";
		});
		//鼠标离开小盒子
		yt.addEventListener("mouseleave", function(){
			yel.style.display = "none";
			bt.style.display = "none";
		});
		//鼠标在小盒子内移动
		yt.addEventListener("mousemove", function(e){
			var X = e.pageX - this.offsetParent.offsetLeft 
			        - yel.offsetWidth / 2;
			var Y = e.pageY - this.offsetParent.offsetTop 
			        - yel.offsetHeight / 2;
			//让小黄块始终在小盒子内部
			var newX;
			var newY;
			if(X < 0){
				newX = 0;
			}else if(X > yt.offsetWidth - yel.offsetWidth){
				newX = yt.offsetWidth - yel.offsetWidth;
			}else{
				newX = X ;
			}
			if(Y < 0){
				newY = 0;
			}else if(Y > yt.offsetHeight - yel.offsetHeight){
				newY = yt.offsetHeight - yel.offsetHeight;
			}else{
				newY = Y ;
			}
			yel.style.left = newX + "px";
			yel.style.top = newY + "px";
			
			//让大图片随之移动
			var imgMoveMax = img.offsetWidth - bt.offsetWidth;
			var boxMoveMax = yt.offsetWidth - yel.offsetWidth;
			var bigX = imgMoveMax * newX / boxMoveMax;
			var bigY = imgMoveMax * newY / boxMoveMax;
			img.style.left = -bigX + "px";
			img.style.top = -bigY + "px";
		});
	}
</script>

4,最终动态效果图

js仿京东放大镜效果#JAVASCRIP

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值