offset案例:仿京东放大镜

案例分析

JD放大镜

  1. 整个案例可以分为三个功能模块
  2. 鼠标经过小图片盒子,黄色的遮挡层和大图片层显示,离开隐藏2个盒子功能
  3. 黄色的遮挡层跟随鼠标功能
  4. 移动黄色遮挡层,大图片跟随移动功能。

第3,4点具体细节

  1. 首先是获得鼠标在盒子的坐标。
  2. 之后把数值给遮挡层做为left 和 top 值。
  3. 此时用到鼠标移动事件,但是还是在小图片盒子内移动。
  4. 发现,遮挡层位置不对,需要再减去盒子自身高度和宽度的一半。
  5. 遮挡层不能超出小图片盒子范围
  6. 如果小于 零,就把坐标设置为 0
  7. 如果大于遮挡层最大的移动距离,就把坐标设置为最大的移动距离
  8. 遮挡层的最大移动距离:小图片盒子宽度 减去 遮挡层盒子宽度

大图片的移动距离可以根据公式
遮 挡 层 移 动 距 离 遮 挡 层 最 大 移 动 距 离 \frac{遮挡层移动距离}{遮挡层最大移动距离} = 大 图 片 移 动 距 离 大 图 片 最 大 移 动 距 离 \frac{大图片移动距离}{大图片最大移动距离}


完整代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style type="text/css">
			*{margin: 0;padding: 0;}
			img {border: 0;vertical-align: middle;}
			.box {
				position: relative;
				width: 398px;;
				height: 398px;
				margin: 100px;
				border: 1px solid #ccc;
			}
			.mask {
				display: none;
				position: absolute;
				top: 0;
				left: 0;
				width: 300px;
				height: 300px;
				background-color: #fede4f;
				opacity: .5;
				border: 1px solid #ccc;
				cursor: move;
			}
			.big {
				display: none;
				position: absolute;
				left: 410px;
				top: 0;
				width: 500px;
				height: 500px;
				border: 1px solid #ccc;
				overflow: hidden;
				z-index: 999;
			}
			.bigImg {
				position: absolute;
				left: 0;
				top: 0;
			}
		</style>
	</head>
	<body>
		<div class="box">
			<img src="box_img.png">
			<div class="mask"></div>
			<div class="big">
				<img src="big.jpg" class="bigImg">
			</div>
		</div>
	</body>
	<script type="text/javascript">
		window.addEventListener('load',function(){
			var box = document.querySelector('.box');
			var mask = document.querySelector('.mask');
			var big = document.querySelector('.big');
			//1. 当我们鼠标经过 box 就显示 和 隐藏 mask 遮挡层 和 big 大盒子
			
			box.addEventListener('mouseover',function(){
				mask.style.display = 'block';
				big.style.display = 'block';
			})
			box.addEventListener('mouseout',function(){
				mask.style.display = 'none';
				big.style.display = 'none';
			})
			//2. 鼠标移动的时候,让黄色的盒子跟着鼠标走
			box.addEventListener('mousemove',function(e){
				// (1) 先计算鼠标在盒子内的坐标
				var x = e.pageX - box.offsetLeft;
				var y = e.pageY - box.offsetTop;
				// console.log(x,y)
				// (2) 减去盒子高度, 300 的一半,150 就是我们mask 的最终left top 的值了
				// (3) mask 移动的距离
				var maskX = x - mask.offsetWidth / 2;
				var maskY = y - mask.offsetHeight / 2;
				// (4) 如果x 坐标小于了0 就让他停在0 的位置
				// 遮挡层的最大移动距离
				var maskMax = box.offsetWidth - mask.offsetWidth;
				if (maskX <= 0) {
					maskX = 0;
				} else if (maskX >= maskMax) {
					maskX = maskMax;
				}
				if (maskY <= 0) {
					maskY = 0;
				} else if (maskY >= maskMax) {
					maskY = maskMax;
				}
				mask.style.left = maskX + 'px';
				mask.style.top = maskY + 'px';
				// 3. 大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离
				// 大图
				var bigIMg = document.querySelector('.bigImg');
				// 大图片最大移动距离
				var bigMax = bigIMg.offsetWidth - big.offsetWidth;
				// 大图片的移动距离 X Y
				var bigX = maskX * bigMax / maskMax;
				var bigY = maskY * bigMax / maskMax;
				bigIMg.style.left = -bigX + 'px';
				bigIMg.style.top = -bigY + 'px';
			})
		})
	</script>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值