10.demo 放大镜

需求

1.鼠标移至图片上方,鼠标周围出现黄色的的正方形框,黄色矩形框会随着鼠标的移动而移动;

2.将黄色正方形框里的内容的长和宽均放大2.4倍,并在图片右边进行显示。

演示图

思路解析

  1. HTML 结构:

    • 有一个容器 normal 包含了一张图片和一个小黄色块 small
    • 另外,还有一个放大镜效果的容器 large 包含了放大后的图片 largeImg
  2. CSS 样式:

    • 设置基本样式,包括清除默认边距和列表样式,以及定义容器和各元素的样式。
  3. JavaScript 脚本:

    • 获取相关元素,包括 smallnormallargelargeImg
    • 记录 normal 元素的初始位置、宽度和高度。
    • 设置鼠标移入和移出事件,显示或隐藏 smalllarge
    • 设置鼠标移动事件,根据鼠标位置计算 small 的位置,并相应地移动 largeImg 实现放大效果。
  4. 鼠标移动事件处理:

    • 当鼠标移动到 normal 上时,计算鼠标相对于 normal 左上角的偏移量。
    • 根据计算得到的偏移量,更新 small 的位置,使其跟随鼠标移动。
    • 同时,计算 largeImg 的偏移量,以实现右侧放大区域的内容对应移动,产生放大效果。
    • 限制 small 的移动范围,防止其移出 normal 区域。
    • 在计算 largeImg 的偏移时,考虑到图片放大,偏移值需要按比例计算,从而达到正确的放大效果。

代码部分

ini 复制代码
<!doctype html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title></title>
	<style>
		*{
			margin:0px;  
			padding:0px;
		}
		li{
			list-style:none;
		}
		#normal{
			width:400px;
			height:400px;
			position:relative;
			border:1px solid #ccc;
		}

		#small{
			width:100px;
			height:100px;
			background:yellow;
			opacity:0.4;
			position:absolute;
			top:0px;
			left:0px;
			display:none;
		}
		#large{
			width:240px;
			height:240px;
			position:absolute;
			top:70px;
			left:521px;
			overflow:hidden;
			display:none;
			border:1px solid #ccc;
		}

		#large img{
			position:absolute;
			left:-500px;
		}

	</style>
</head>
<body>
	<div id="normal">
		<img src="./高木同学.jpg" width="100%" alt="">
		<div id="small"></div>
	</div>
	<div id="large">
		<img id="largeImg" src="./高木同学.jpg" alt="">
	</div>

	<script>
		// 获取元素
		var small = document.getElementById('small');	
        // 小黄块
		var normal = document.getElementById('normal');		
		var large = document.getElementById('large');		
		var largeImg = document.getElementById('largeImg');	
		// 获取normal元素的left和top值
		var normLeft = normal.offsetLeft;
		var normTop = normal.offsetTop;
		// 获取normal元素的宽度和高度
		var normWidth = normal.offsetWidth;
		var normHeight = normal.offsetHeight;
		// 右侧图片的宽度与高度
		var largeWidth 
		var largeHeight 
		// 小球的宽度与高度
		var smallWidth 
		var smallHeight 

		// 设置鼠标移入事件
		normal.onmouseover = function(){
			small.style.display = 'block';
			large.style.display = 'block';
			// 获取small元素的宽度/高度
			smallWidth = small.offsetWidth;
			smallHeight = small.offsetHeight;

			// 获取右侧图片的大小
			largeWidth = largeImg.offsetWidth;
			largeHeight = largeImg.offsetHeight;
		}
		// 设置鼠标移出事件
		normal.onmouseout = function(){
			small.style.display = 'none';
			large.style.display = 'none';
		}

		// 设置small的移动
		normal.onmousemove = function(e){
			// 获取的是鼠标距离当前可视区域顶部的距离
			var y = e.clientY;
			// document.write(y);

			// 获取鼠标距离文档顶部和文档左侧的距离
			var x = e.pageX;
			var y = e.pageY;
			// document.write(y);

			// 计算small元素最终的left和top的值
			// left = 鼠标点的x位置 - normal的left值 - small的宽度/2
			var l = x - normLeft - smallWidth/2;
			// top = 鼠标点的y坐标 - normal的top的值 - small元素的高度/2
			var t = y - normTop - smallHeight/2;

			// 判断small元素的位置
			// 水平方向的临界
            //normal的宽度 - small的宽度
			var horizon = normWidth - smallWidth;	
			if(l>=horizon){
				l = horizon;
			}
			// 左侧的临界点
			if(l<=0){
				l = 0;
			}
			// 顶部的临界点
			if(t<=0){
				t = 0;
			}
			// 底部的临界点
			var bottom = normHeight - smallHeight - 2;	// 2 两个元素的边框
			if(t>=bottom){
				t = bottom;
			}

			// 设置left和top的值
			small.style.left = l+'px';
			small.style.top = t+'px';

			// 右侧的大图的设置 -- 计算大图的偏移值
			// normalL / 1000 = l/400
			 normalLeft = -largeWidth/normWidth*l;
			 normalTop = -largeHeight/normHeight*t;
			// 设置图片的left和top的值
			largeImg.style.left = normalLeft+'px';
			largeImg.style.top = normalTop+'px';
		}

	</script>
</body>
</html>
相关推荐
小码编匠22 分钟前
物联网数据大屏开发效率翻倍:Vue + DataV + ECharts 的标准化模板库
前端·vue.js·echarts
欧阳天风41 分钟前
分段渲染加载页面
前端·fcp
艾小码43 分钟前
TypeScript在前端的实践:类型系统助力大型应用开发
前端·typescript
今禾44 分钟前
前端工程化的范式革命:从 Webpack 的“全量打包”到 Vite 的“按需编译”
前端·webpack·vite
Cache技术分享1 小时前
168. Java Lambda 表达式 - 专用比较器
前端·后端
颜漠笑年1 小时前
前端必看:img标签不可忽视的width与height属性
前端·html
GHOME1 小时前
Vue2知识点详细回顾(以及自己的一些思考和解答)-2
前端·vue.js·面试
摸着石头过河的石头1 小时前
大模型时代的前端开发新趋势
前端·javascript·ai编程
Bottle4141 小时前
ServiceWorker 报 MIME 类型错误
前端
吴楷鹏1 小时前
如何同时打开多个 Chrome 呢?
前端·chrome