【前端】实现放大镜效果·教程

效果图:

在这里插入图片描述

在这里插入图片描述

需求分析:

  1. 鼠标移入小盒子里面,大盒子显示,mask显示
  2. 鼠标移出小盒子,大盒子隐藏,mask隐藏
  3. 鼠标在小盒子里面移动,mask跟随鼠标移动,鼠标在mask中间
  4. mask不能超出小盒子范围
  5. 鼠标在小盒子里面移动,大盒子显示大图的相应部分

源代码:

  • HTML部分
<div id="box" >
	<div id="small"><!-- 小图片所在的盒子 -->
		<img src="001.jpg" alt="" /><!-- 小图片:350*350 -->
		<div id="mask"></div><!-- 遮罩层:175*175 -->
	</div>
	<div id="big"><!-- 大图片所在的盒子:400*400 -->
		<img src="0001.jpg" alt="" id="bigImg"/><!-- 大图片:800*800 -->
	</div>
</div>
  • css部分
<style>
*{
	margin: 0;
	padding: 0;
}
#box{
	width: 350px;
	height: 350px;
	border: 1px solid #000;
	margin: 200px;
	position: relative;
}
#big{
	width: 400px;
	height: 400px;
	border: 1px solid #000;
	overflow: hidden;
	position: absolute;
	top:0;
	left : 360px;
	display: none;
}
#mask{
	width: 175px;
	height: 175px;
	background: paleturquoise;
	position: absolute;
	left:0;
	top: 0;
	opacity: 0.3;
	display: none;
	cursor: move;
}
#small{
	position: relative;
}
#bigImg{
	position: absolute;
	left: 0;
	top: 0;
}  
</style>
  • JavaScript部分
  1. 为了简化代码,先封装一些常用的自定义构造函数
<script>
// 根据id获取元素
function $id(id){
    return document.getElementById(id);
}
// 返回页面被卷曲的距离:垂直,水平
function scroll(){
    return {
        top:document.body.scrollTop||document.documentElement.scrollTop||window.pageYOffset,
        left:document.body.scrollLeft||document.documentElement.scrollLeft||window.pageXOffset
    }
}    
</script>
  1. js主体部分,需要用到封装的函数,调用即可
<script>
// 获取相关元素
var box = $id('box');//总容器
var smallDiv = $id('small');//小盒子
var maskDiv = $id('mask');//遮罩层
var bigDiv = $id('big');//大盒子
var bigImg = $id('bigImg');//大图片 

// 1 鼠标移入小盒子里面
smallDiv.onmouseenter = function(){
	// 大盒子显示,mask显示
	bigDiv.style.display = 'block';
	maskDiv.style.display = 'block';
}
// 2 鼠标移出小盒子
smallDiv.onmouseleave = function(){
	// 大盒子隐藏,mask隐藏
	bigDiv.style.display = "none";
	maskDiv.style.display = "none";
}
// 3 鼠标在小盒子里面移动
smallDiv.onmousemove = function(e){
	e = window.event || e;
	// mask跟随鼠标移动,鼠标在mask中间
	// 如果不出滚动条:e.clientY = e.pageY
	// 如果出了滚动条:e.clientY != e.pageY
	// 建议使用:e.pageY = e.clientY + scrollTop;
	var left = (e.clientX+scroll().left) - box.offsetLeft;
	var top = (e.clientY+scroll().top) - box.offsetTop;
	// 要鼠标在mask中间
	left = left - maskDiv.offsetWidth/2;
	top = top - maskDiv.offsetWidth/2;
	// 4 边界监测:mask不能超出小盒子范围
	if(left<0){
		left = 0;
	}
	if(left>smallDiv.offsetWidth-maskDiv.offsetWidth){
		left = smallDiv.offsetWidth-maskDiv.offsetWidth
	}
	if(top<0){
		top = 0;
	}
	if(top>smallDiv.offsetHeight-maskDiv.offsetHeight){
		top=smallDiv.offsetHeight-maskDiv.offsetHeight
	}
	// 定位mask
	maskDiv.style.left = left + 'px';
	maskDiv.style.top = top + 'px';
	// 5 鼠标在小盒子里面移动,大盒子显示大图的相应部分
	// left/smallDiv.offsetWidth = bigImg左移的距离/bigImg.offsetWidth
	bigImg.style.left = -left/smallDiv.offsetWidth*bigImg.offsetWidth+"px";
	// top/smallDiv.offsetHeight = bigImg上移的距离/bigImg.offsetHeight
	bigImg.style.top = -top/smallDiv.offsetHeight*bigImg.offsetHeight+"px";
}

</script>
  • 总代码
<!DOCTYPE html>
<html>

<head>
	<meta charset="UTF-8">
	<title>09放大镜</title>
</head>
<style type="text/css">
	* {
		margin: 0;
		padding: 0;
	}

	#box {
		width: 350px;
		height: 350px;
		border: 1px solid #000;
		margin: 200px;
		position: relative;
	}

	#big {
		width: 400px;
		height: 400px;
		border: 1px solid #000;
		overflow: hidden;
		position: absolute;
		top: 0;
		left: 360px;
		display: none;
	}

	#mask {
		width: 175px;
		height: 175px;
		background: paleturquoise;
		position: absolute;
		left: 0;
		top: 0;
		opacity: 0.3;
		display: none;
		cursor: move;
	}

	#small {
		position: relative;
	}

	#bigImg {
		position: absolute;
		left: 0;
		top: 0;
	}
</style>

<body>
	<div id="box">
		<div id="small">
			<!-- 小图片所在的盒子 -->
			<img src="001.jpg" alt="" /><!-- 小图片:350*350 -->
			<div id="mask"></div><!-- 遮罩层:175*175 -->
		</div>
		<div id="big">
			<!-- 大图片所在的盒子:400*400 -->
			<img src="0001.jpg" alt="" id="bigImg" /><!-- 大图片:800*800 -->
		</div>
	</div>
	<script>
		// 根据id获取元素
		function $id(id) {
			return document.getElementById(id);
		}
		// 返回页面被卷曲的距离:垂直,水平
		function scroll() {
			return {
				top: document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset,
				left: document.body.scrollLeft || document.documentElement.scrollLeft || window.pageXOffset
			}
		}
		// 获取相关元素
		var box = $id('box');//总容器
		var smallDiv = $id('small');//小盒子
		var maskDiv = $id('mask');//遮罩层
		var bigDiv = $id('big');//大盒子
		var bigImg = $id('bigImg');//大图片 

		// 1 鼠标移入小盒子里面
		smallDiv.onmouseenter = function () {
			// 大盒子显示,mask显示
			bigDiv.style.display = 'block';
			maskDiv.style.display = 'block';
		}
		// 2 鼠标移出小盒子
		smallDiv.onmouseleave = function () {
			// 大盒子隐藏,mask隐藏
			bigDiv.style.display = "none";
			maskDiv.style.display = "none";
		}
		// 3 鼠标在小盒子里面移动
		smallDiv.onmousemove = function (e) {
			e = window.event || e;
			// mask跟随鼠标移动,鼠标在mask中间
			// 如果不出滚动条:e.clientY = e.pageY
			// 如果出了滚动条:e.clientY != e.pageY
			// 建议使用:e.pageY = e.clientY + scrollTop;
			var left = (e.clientX + scroll().left) - box.offsetLeft;
			var top = (e.clientY + scroll().top) - box.offsetTop;
			// 要鼠标在mask中间
			left = left - maskDiv.offsetWidth / 2;
			top = top - maskDiv.offsetWidth / 2;
			// 4 边界监测:mask不能超出小盒子范围
			if (left < 0) {
				left = 0;
			}
			if (left > smallDiv.offsetWidth - maskDiv.offsetWidth) {
				left = smallDiv.offsetWidth - maskDiv.offsetWidth
			}
			if (top < 0) {
				top = 0;
			}
			if (top > smallDiv.offsetHeight - maskDiv.offsetHeight) {
				top = smallDiv.offsetHeight - maskDiv.offsetHeight
			}
			// 定位mask
			maskDiv.style.left = left + 'px';
			maskDiv.style.top = top + 'px';
			// 5 鼠标在小盒子里面移动,大盒子显示大图的相应部分
			// left/smallDiv.offsetWidth = bigImg左移的距离/bigImg.offsetWidth
			bigImg.style.left = -left / smallDiv.offsetWidth * bigImg.offsetWidth + "px";
			// top/smallDiv.offsetHeight = bigImg上移的距离/bigImg.offsetHeight
			bigImg.style.top = -top / smallDiv.offsetHeight * bigImg.offsetHeight + "px";
		}
	</script>
</body>

</html>

所用图片:

在这里插入图片描述

由于你们没有图片,直接复制代码,展示不出效果,大家可以自己找几张图片来代替,稍微修改下即可,只要能看得懂代码,修改起来莫得问题啦

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,对于前端文字放大镜功能,我可以为您提供以下方法: 1. 使用CSS的transform:scale属性可以实现文字放大效果,样式如下: ``` .text { font-size: 16px; /* 正常字体大小 */ transition: transform 0.3s ease-in-out; /* 动画效果 */ } .text:hover { transform: scale(1.2); /* 悬浮时字体放大1.2倍 */ } ``` 2. 也可以使用Javascript和CSS控制鼠标位置和字体放大倍数来实现放大镜效果,代码如下: HTML: ``` <div class="container"> <div class="text" id="text">Some text</div> <div class="magnifier" id="magnifier"></div> </div> ``` CSS: ``` .container { position: relative; width: 100%; height: 300px; } .text { position: absolute; top: 0; left: 0; font-size: 16px; overflow: hidden; height: 100%; } .magnifier { position: absolute; top: 0; left: 0; width: 100px; height: 100px; border: 1px solid #ccc; border-radius: 50%; background: rgba(0,0,0,.2); pointer-events: none; display: none; } ``` Javascript: ``` var container = document.querySelector('.container'), text = document.querySelector('#text'), magnifier = document.querySelector('#magnifier'); container.addEventListener('mousemove', function(e) { var rect = container.getBoundingClientRect(), x = e.clientX - rect.left, y = e.clientY - rect.top, offsetX = x / container.offsetWidth, offsetY = y / container.offsetHeight, textWidth = text.offsetWidth, textHeight = text.offsetHeight, magWidth = magnifier.offsetWidth, magHeight = magnifier.offsetHeight; magnifier.style.left = (x - magWidth / 2) + 'px'; magnifier.style.top = (y - magHeight / 2) + 'px'; magnifier.style.display = 'block'; text.style.transform = 'translate(-' + offsetX * (textWidth - container.offsetWidth) + 'px, -' + offsetY * (textHeight - container.offsetHeight) + 'px)'; magnifier.style.backgroundPosition = '-' + (x - magWidth / 2) * 2 + 'px -' + (y - magHeight / 2) * 2 + 'px'; }); container.addEventListener('mouseleave', function() { magnifier.style.display = 'none'; }); ``` 希望以上方法能够帮助到您!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一颗不甘坠落的流星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值