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 相关文章推荐
基础的prototype.js常用函数及其用法
Mar 10 Javascript
基于jQuery的消息提示插件之旅 DivAlert(三)
Apr 01 Javascript
jquery 多行滚动代码(附详细解释)
Jun 17 Javascript
JavaScript的漂亮的代码片段
Jun 05 Javascript
php的文件上传入门教程(实例讲解)
Apr 10 Javascript
如何调试异步加载页面里包含的js文件
Oct 30 Javascript
javascript中函数作为参数调用的方法
Feb 09 Javascript
跟我学习javascript的浮点数精度
Nov 16 Javascript
Django中使用jquery的ajax进行数据交互的实例代码
Oct 15 jQuery
react+redux的升级版todoList的实现
Dec 18 Javascript
Node.js搭建WEB服务器的示例代码
Aug 15 Javascript
微信小程序后端无法保持session的原因及解决办法问题
Mar 20 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实现视频文件上传完整实例
2014/08/28 PHP
phpnow php探针环境检测代码
2014/11/04 PHP
php实现mysql备份恢复分卷处理的方法
2014/12/26 PHP
yii2项目实战之restful api授权验证详解
2017/05/20 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
PHP 7.4 新语法之箭头函数实例详解
2019/05/09 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
2010/09/17 Javascript
JS验证邮箱格式是否正确的代码
2013/12/05 Javascript
14款NodeJS Web框架推荐
2014/07/11 NodeJs
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
jQuery中Nicescroll滚动条插件的用法
2016/11/10 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
js监听input输入框值的实时变化实例
2017/01/26 Javascript
jQuery Mobile漏洞会有跨站脚本攻击风险
2017/02/12 Javascript
基于代数方程库Algebra.js解二元一次方程功能示例
2017/06/09 Javascript
bootstrap table服务端实现分页效果
2017/08/10 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
[03:03]2014DOTA2国际邀请赛 EG战队专访
2014/07/12 DOTA
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
深入解析Python中函数的参数与作用域
2016/03/20 Python
浅谈Python2之汉字编码为unicode的问题(即类似\xc3\xa4)
2019/08/12 Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
2020/09/29 Python
Django model class Meta原理解析
2020/11/14 Python
Python监听键盘和鼠标事件的示例代码
2020/11/18 Python
函授自我鉴定
2013/11/06 职场文书
蔬菜基地的创业计划书
2014/01/06 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
先进党员事迹材料
2014/12/24 职场文书
Mysql 用户权限管理实现
2021/05/25 MySQL
python非标准时间的转换
2021/07/25 Python
《模拟人生4》推出新补丁 “婚礼奇缘”DLC终于得到修复
2022/04/03 其他游戏