前言
一般电商类网页,如淘宝、京东,都会有商品主图实现放大镜效果的场景,今天来简单实现一个类似的放大镜功能
效果展示
当鼠标在主图上移动时,出现一个绿色的图片遮罩层,同时右侧出现一个大图预览区,用于展示绿色区域图片的放大效果,由此就实现了图片放大镜效果。具体效果:
具体实现
1.页面布局
设置一个图片展示框元素,该元素中包括需要展示的主图图片,用于鼠标移动事件的元素,大图预览区(使用定位,展示在图片展示框的右侧),图片遮罩层
<div class="spec-preview"><img :src="imgUrl" alt="" /><div class="event" @mousemove="handler"></div><div class="big"><img :src="imgUrl" alt="" ref="big" /></div><!-- 遮罩层 --><div class="mask" ref="mask"></div>
</div>
2.核心css代码a. 用于鼠标移动事件的元素,大图预览区,图片遮罩层这三个元素都需要相对于图片展示框元素使用绝对定位展示b. 用于鼠标移动事件的元素和父元素的宽高一样,并且层级最高c. 大图预览区,图片遮罩层一开始不显示,当鼠标移入用于鼠标移动事件的元素时,这两个元素就显示d. 大图预览区的图片设置为2倍大小,在该区域中超出隐藏,并且使用绝对定位展示```
.spec-preview {position: relative;width: 400px;height: 400px;border: 1px solid #ccc;img {width: 100%;height: 100%;}.event {width: 100%;height: 100%;position: absolute;top: 0;left: 0;z-index: 998;}.mask {width: 50%;height: 50%;background-color: rgba(0, 255, 0, 0.3);position: absolute;left: 0;top: 0;display: none;}.big {width: 100%;height: 100%;position: absolute;top: -1px;left: 100%;border: 1px solid #aaa;overflow: hidden;z-index: 998;display: none;background: white;img {width: 200%;max-width: 200%;height: 200%;position: absolute;left: 0;top: 0;}}.event:hover ~ .mask,.event:hover ~ .big {display: block;}
}
3.核心js代码a. 在鼠标移动事件中,使用`this.refs`获取大图预览区的图片元素,图片遮罩层元素b. 计算出遮罩层可移动的范围,并约束该范围,不让其超出图片展示框。 实际就是改变图片遮罩层元素的`left`、`top`值<img src="https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4fe44580dc5e4f20875caa4d1b4c015c~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image?) c. 因为图片放大了2倍,因此该元素的`left`、`top`值需要乘以2。``" style="margin: auto" />
handler(event) {let mask = this.$refs.mask;let bigImg = this.$refs.big;// 遮罩层可移动的范围:鼠标的当前坐标到该元素的距离(左侧、顶部)减去 遮罩层宽、高的一半(遮罩层是一个以鼠标为中心的正方形)let left = event.offsetX - mask.offsetWidth / 2;let top = event.offsetY - mask.offsetHeight / 2;// 约束遮罩层可移动的范围if (left <= 0) left = 0;if (left >= mask.offsetWidth) left = mask.offsetWidth;if (top <= 0) top = 0;if (top >= mask.offsetHeight) top = mask.offsetHeight;// 修改元素的left|top属性值mask.style.left = left + "px";mask.style.top = top + "px";bigImg.style.left = -2 * left + "px";bigImg.style.top = -2 * top + "px";
},
最后
整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。




有需要的小伙伴,可以点击下方卡片领取,无偿分享
本文介绍如何使用Vue.js实现电商网页中的商品主图放大镜效果。通过设置页面布局,应用核心CSS样式,当鼠标在主图上移动时,展示一个放大预览区和绿色遮罩层,从而实现图片的放大镜功能。


被折叠的 条评论
为什么被折叠?



