使用JavaScript实现放大镜效果(有详细注释)

目录

效果图

如何使用JavaScript实现放大镜效果大概思路

一、存放图片代码

二、css代码

三、js代码

        小知识点

四、完整代码


效果图

如何使用JavaScript实现放大镜效果大概思路:

  1. 先用两个div来存放图片,一个存放原始图片,一个存放放大后的图片
  2. 再来一个遮罩层,设置成半透明,并实现遮罩层随着鼠标移动而移动
  3. 在计算遮罩层不可超出容器范围
  4. 计算放大图片的位置,并显示放大后的位置

一、存放图片代码:

<div class="smDiv">
	<img src="img/smallpic.jpg" alt="" />
    <div class="zoom"></div>
</div>
<div class="bigDiv">
	<img src="img/bigpic.jpg" alt="" />
</div>

二、css代码:

.smDiv {
	width: 300px;
	height: 225px;
	border: 1px solid #000;
	position: relative;
}
.bigDiv {
	position: absolute;
	top: 8px;
	left: 330px;
	width: 330px;
	height: 330px;
	overflow: hidden;
	border: 1px solid #000;
	display: none;
}
.zoom {
	width: 110px;
	height: 111px;
	z-index: 99;
	background-color: #8484847b;
	position: absolute;
	top: 0;
	left: 0;
	cursor: move;
	pointer-events: none;
	display: none;
}
.bigDiv > img {
	position: absolute;
	top: 0;
	left: 0;
}

三、js代码:

<script>
	var smDiv = document.querySelector(".smDiv"); //获取小图容器
	var bigDiv = document.querySelector(".bigDiv"); //获取放大图容器
	var zoom = document.querySelector(".zoom"); //获取放大器
	var bigImg = document.querySelector(".bigDiv>img"); //获取放大后大图

	//光标移入悬浮在小图容器
	smDiv.addEventListener("mouseover", function (e) {
		zoom.style.display = "block";
		bigDiv.style.display = "block";
	});
	//光标移出小图容器
	smDiv.addEventListener("mouseout", function (e) {
		zoom.style.display = "none";
		bigDiv.style.display = "none";
	});

	smDiv.addEventListener("mousemove", function (e) {
		//计算放大镜的top
		var top = e.offsetY - zoom.offsetHeight / 2;
        //计算放大镜的left
		var left = e.offsetX - zoom.offsetWidth / 2;

		//计算放大镜最大的top与left
		var maxTop = smDiv.clientHeight - zoom.offsetHeight;
		var maxLeft = smDiv.clientWidth - zoom.offsetWidth;

		//限制放大镜移动范围不可超过小图容器的边界
		top = top < 0 ? 0 : top;
		top = top > maxTop ? maxTop : top;
		left = left < 0 ? 0 : left;
		left = left > maxLeft ? maxLeft : left;

		// 放大镜的位置
		zoom.style.top = top + "px";
		zoom.style.left = left + "px";

		//放大图在容器中的位置,大图是小图的三倍,所以乘以3
		bigImg.style.top = -3 * top + "px";
		bigImg.style.left = -3 * left + "px";
	});
</script>

  小知识点:

     offsetX:鼠标坐标到元素的左侧的距离
     offsetWidth:除了外边距(margin)以外,所有的宽度(高度)之和

     offsetY:鼠标坐标到元素顶部的距离
     offsetHeight:元素的像素高度,包含元素的垂直内边距和边框,水平滚动条的高度,且是一个整数

 四、超完整代码如下:

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8" />
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0" />
		<title>JavaScript实现放大镜效果</title>
		<style>
			.smDiv {
				width: 300px;
				height: 225px;
				border: 1px solid #000;
				position: relative;
			}
			.bigDiv {
				position: absolute;
				top: 8px;
				left: 330px;
				width: 330px;
				height: 330px;
				overflow: hidden;
				border: 1px solid #000;
				display: none;
			}
			.zoom {
				width: 110px;
				height: 111px;
				z-index: 99;
				background-color: #8484847b;
				position: absolute;
				top: 0;
				left: 0;
				cursor: move;
				pointer-events: none;
				display: none;
			}
			.bigDiv > img {
				position: absolute;
				top: 0;
				left: 0;
			}
		</style>
    </head>
    <body>
		<div class="smDiv">
			<img src="img/smallpic.jpg" alt="" />
			<div class="zoom"></div>
		</div>
		<div class="bigDiv">
			<img src="img/bigpic.jpg" alt="" />
		</div>

		<script>
			var smDiv = document.querySelector(".smDiv"); //获取小图容器
			var bigDiv = document.querySelector(".bigDiv"); //获取放大图容器
			var zoom = document.querySelector(".zoom"); //获取放大器
			var bigImg = document.querySelector(".bigDiv>img"); //获取放大后大图

			//光标移入悬浮小图容器
			smDiv.addEventListener("mouseover", function (e) {
				zoom.style.display = "block";
				bigDiv.style.display = "block";
			});
			//光标移出小图容器
			smDiv.addEventListener("mouseout", function (e) {
				zoom.style.display = "none";
				bigDiv.style.display = "none";
			});

			smDiv.addEventListener("mousemove", function (e) {
				//计算放大镜的top
				// offsetY:鼠标坐标到元素顶部的距离
				// offsetHeight:元素的像素高度,包含元素的垂直内边距和边框,水平滚动条的高度,且是一个整数
				var top = e.offsetY - zoom.offsetHeight / 2;

				//计算放大镜的left
				// offsetX:鼠标坐标到元素的左侧的距离
				// offsetWidth:除了外边距(margin)以外,所有的宽度(高度)之和
				var left = e.offsetX - zoom.offsetWidth / 2;

				//计算放大镜最大的top与left
				var maxTop = smDiv.clientHeight - zoom.offsetHeight;
				var maxLeft = smDiv.clientWidth - zoom.offsetWidth;

				//限制放大镜移动范围不可超过小图容器的边界
				top = top < 0 ? 0 : top;
				top = top > maxTop ? maxTop : top;
				left = left < 0 ? 0 : left;
				left = left > maxLeft ? maxLeft : left;

				// 放大镜的位置
				zoom.style.top = top + "px";
				zoom.style.left = left + "px";

				//放大图在容器中的位置,大图是小图的三倍,所以乘以3
				bigImg.style.top = -3 * top + "px";
				bigImg.style.left = -3 * left + "px";
			});
		</script>
	</body>
</html>

JavaScript实现放大镜效果的代码就分享到这里啦,如有错误,欢迎指出~

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值