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 相关文章推荐
jQuery使用手册之 事件处理
Mar 24 Javascript
腾讯UED 漂亮的提示信息效果代码
Sep 12 Javascript
js 代码优化点滴记录
Feb 19 Javascript
JS完成代码前最好对其做5件事
Apr 07 Javascript
ExtJS4如何给同一个formpanel不同的url
May 02 Javascript
分享12个非常实用的JavaScript小技巧
May 11 Javascript
学习Bootstrap滚动监听 附调用方法
Jul 02 Javascript
js中的面向对象入门
Mar 06 Javascript
微信小程序getPhoneNumber获取用户手机号
Sep 29 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
Mar 15 Javascript
5分钟快速看懂ES6中的反射与代理
Dec 19 Javascript
JavaScript实现HSL拾色器
May 21 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
深入php self与$this的详解
2013/06/08 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
2014/10/23 PHP
php批量删除cookie的简单实现方法
2015/01/26 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
2015/03/27 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
2015/07/31 PHP
JavaScript中的new的使用方法与注意事项
2007/05/16 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
jQuery 追加元素的方法如append、prepend、before
2014/01/16 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
在Ubuntu上安装最新版本的Node.js
2014/07/14 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
JavaScript编写Chrome扩展实现与浏览器的交互及时间通知
2016/05/16 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
十大 Node.js 的 Web 框架(快速提升工作效率)
2017/06/30 Javascript
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
Express的HTTP重定向到HTTPS的方法
2018/06/06 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
关于JavaScript中异步/等待的用法与理解
2020/11/18 Javascript
如何利用nodejs实现命令行游戏
2020/11/24 NodeJs
Vue-router中hash模式与history模式的区别详解
2020/12/15 Vue.js
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
基于plt.title无法显示中文的快速解决
2020/05/16 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
python装饰器三种装饰模式的简单分析
2020/09/04 Python
美国钻石商店:Zales
2016/11/20 全球购物
业务主管岗位职责范本
2013/12/25 职场文书
老公保证书范文
2014/04/29 职场文书
港澳通行证委托书怎么写
2014/08/02 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
关于考试抄袭的检讨书
2019/11/02 职场文书