vue实现放大镜效果


Posted in Javascript onSeptember 17, 2020

本文实例为大家分享了vue实现放大镜效果的具体代码,供大家参考,具体内容如下

实现类淘宝放大镜效果

前端小白一枚,最近在进行 vue 方面的学习,逛淘宝闲来无事想试试做个放大镜,结果虽然做出来了,但其中有一些问题让我无法解决,四处搜索也没有找到满意的答案,很是心烦,希望能有大佬帮忙解答,谢谢

步骤思路

  • 对原图的显示空间(left) 可以将显示原图的 img 换成 canvas,来对图片进行保护
  • 跟随鼠标移动时显示放大的指示区(鼠标层罩top)
  • 显示层罩区域选中放大的显示空间(right)

HTML部分

<template>
 <div>
  <div class="left">
   <img class="leftImg" src="../../public/image/test.jpg" alt="">
   <!-- 鼠标层罩 -->
   <div v-show="topShow" class="top" :style="topStyle"></div>
   <!-- 最顶层覆盖了整个原图空间的透明层罩 -->
   <div class="maskTop"
   @mouseenter="enterHandler"
   @mousemove="moveHandler"
   @mouseout="outHandler"></div>
  </div>
  <div v-show="rShow" class="right">
   <img :style="r_img" class="rightImg" src="../../public/image/test.jpg" alt="">
  </div>
 </div>
</template>

CSS部分

<style scoped>
/* 放大的图片,通过定位将左上角定位到(0,0) */
.rightImg {
 display: inline-block;
 width: 800px;
 height: 800px;
 position: absolute;
 top: 0;
 left: 0;
}
/* 右边的区域图片放大空间 */
.right {
 margin-left: 412px;
 width: 400px;
 height: 400px;
 border: 1px solid red;
 position: relative;
 overflow: hidden;
}
/* 一个最高层层罩 */
.maskTop {
 width: 400px;
 height: 400px;
 position: absolute;
 z-index: 1;
 top: 0;
 left: 0;
}
/* 层罩,通过定位将左上角定位到(0,0) */
.top {
 width: 200px;
 height: 200px;
 background-color: lightcoral;
 opacity: 0.4;
 position: absolute;
 top: 0;
 left: 0;
}
/* 原图的显示 */
.leftImg {
 width: 400px;
 height: 400px;
 display: inline-block;
}
/* 原图的容器 */
.left {
 width: 400px;
 height: 400px;
 border: 1px solid teal;
 float: left;
 position: relative;
}
</style>

JS实现部分

<script>
export default {
 data() {
  return {
   topStyle:{transform:''},
   r_img: {},
   topShow:false,
   rShow:false
  }
 },
 methods : {
  // 鼠标进入原图空间函数
  enterHandler() {
   // 层罩及放大空间的显示
   this.topShow = true
   this.rShow = true
  },
  // 鼠标移动函数
  moveHandler(event) {
   // 鼠标的坐标位置
   let x = event.offsetX
   let y = event.offsetY
   // 层罩的左上角坐标位置,并对其进行限制:无法超出原图区域左上角
   let topX = (x-100) < 0 ? 0:(x-100)
   let topY = (y-100) < 0 ? 0:(y-100)
   // 对层罩位置再一次限制,保证层罩只能在原图区域空间内
   if(topX>200) {
    topX = 200
   }
   if(topY>200) {
    topY = 200
   }
   // 通过 transform 进行移动控制
   this.topStyle.transform = `translate(${topX}px,${topY}px)`
   this.r_img.transform = `translate(-${2*topX}px,-${2*topY}px)`
  },
  // 鼠标移出函数
  outHandler() {
   // 控制层罩与放大空间的隐藏
   this.topShow = false
   this.rShow = false
  }
 }
}
</script>

问题

原本我是将三个鼠标事件添加在原图容器 left 上的,结果不断出现问题
1、在我加了一个覆盖了鼠标区域的透明层罩 maskTop 才让这个放大镜能完整的实现,若是不加这个 maskTop 层罩,在我鼠标进入原图区域空间时鼠标层罩不会跟着鼠标的移动而移动,更是会在鼠标移动时进行高频率的“颤动”,右边的放大区域空间也没有顺畅的跟着移动变化
2、若是没有添加 maskTop 层罩,在我鼠标移入原图区域空间时, mousemove 鼠标移动事件只执行了一次,似乎是因为鼠标层罩阻挡了
3、在之前有试过动态地确定鼠标层罩的初始位置,将其放在了mouseenter事件当中,结果 mouseenter 事件执行了异常多次,就像是变成了 mousemove 事件

有看过其他的放大镜案例,但是他们都不需要加 masktop 这个最顶层的覆盖层罩,期望能有路过的大佬帮忙解惑

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
在线编辑器的实现原理(兼容IE和FireFox)
Mar 09 Javascript
Aptana调试javascript图解教程
Nov 30 Javascript
鼠标滚轮改变图片大小的示例代码
Nov 20 Javascript
JavaScript控制图片加载完成后调用回调函数的方法
Mar 20 Javascript
JavaScript获得页面base标签中url的方法
Apr 03 Javascript
JavaScript实现多个重叠层点击切换效果的方法
Apr 24 Javascript
JS三级可折叠菜单实现方法
Feb 29 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
Aug 17 Javascript
Bootstrap的基本应用要点浅析
Dec 19 Javascript
微信小程序Server端环境配置详解(SSL, Nginx HTTPS,TLS 1.2 升级)
Jan 12 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
Oct 19 Javascript
Node.js中读取TXT文件内容fs.readFile()用法
Oct 10 Javascript
JavaScript封装单向链表的示例代码
Sep 17 #Javascript
vue修改Element的el-table样式的4种方法
Sep 17 #Javascript
vue+canvas实现拼图小游戏
Sep 18 #Javascript
JavaScript 常见的继承方式汇总
Sep 17 #Javascript
JavaScript 闭包的使用场景
Sep 17 #Javascript
javascript贪吃蛇游戏设计与实现
Sep 17 #Javascript
js实现简单的随机点名器
Sep 17 #Javascript
You might like
table标签的结构与合并单元格的实现方法
2013/07/24 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
PHP数组内存利用率低和弱类型详细解读
2017/08/10 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
用js实现多域名不同文件的调用方法
2007/01/12 Javascript
再谈javascript 动态添加样式规则 W3C校检
2009/12/25 Javascript
jQuery效果 slideToggle() 方法(在隐藏和显示之间切换)
2011/06/28 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
JavaScript 2048 游戏实例代码(简单易懂)
2016/03/25 Javascript
webpack 开发和生产并行设置的方法
2018/11/08 Javascript
jQuery实现简单日历效果
2020/07/05 jQuery
JavaScript动态生成表格的示例
2020/11/02 Javascript
JavaScript手写数组的常用函数总结
2020/11/22 Javascript
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
Python去掉字符串中空格的方法
2014/03/11 Python
python实现在pickling的时候压缩的方法
2014/09/25 Python
pandas中Timestamp类用法详解
2017/12/11 Python
Python从ZabbixAPI获取信息及实现Zabbix-API 监控的方法
2018/09/17 Python
Python常见数字运算操作实例小结
2019/03/22 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Python 自动登录淘宝并保存登录信息的方法
2019/09/04 Python
Python函数中的可变长参数详解
2019/09/12 Python
详解PyQt5中textBrowser显示print语句输出的简单方法
2020/08/07 Python
css3发光搜索表单分享
2014/04/11 HTML / CSS
视图的作用
2014/12/19 面试题
生物技术专业毕业生求职信范文
2013/12/14 职场文书
公路绿化方案
2014/05/12 职场文书
企业人事任命书
2014/06/05 职场文书
领导班子整改方案和个人整改措施
2014/10/25 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
SQLServer 日期函数大全(小结)
2021/04/08 SQL Server
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
Linux系统下安装PHP7.3版本
2021/06/26 PHP
SQL Server表分区删除详情
2021/10/16 SQL Server