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 相关文章推荐
js event事件的传递与冒泡处理
Dec 06 Javascript
Javascript Objects详解
Sep 04 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
Apr 22 Javascript
基于jQuery实现鼠标点击导航菜单水波动画效果附源码下载
Jan 06 Javascript
原生js实现class的添加和删除简单代码
Jul 12 Javascript
JavaScript基础之AJAX简单的小demo
Jan 29 Javascript
Angular搜索 过滤 批量删除 添加 表单验证功能集锦(实例代码)
Oct 25 Javascript
vue 2.0 购物车小球抛物线的示例代码
Feb 01 Javascript
vue this.reload 方法 配置
Sep 12 Javascript
使用vue-cli webpack 快速搭建项目的代码
Nov 21 Javascript
Vue结合后台导入导出Excel问题详解
Feb 19 Javascript
如何对react hooks进行单元测试的方法
Aug 14 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中serialize序列化与json性能测试的示例分析
2013/04/27 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
PHP中的use关键字及文件的加载详解
2016/11/28 PHP
PHP实现可添加水印与生成缩略图的图片处理工具类
2018/01/16 PHP
php实现文章评论系统
2019/02/18 PHP
JavaScript事件列表解说
2006/12/22 Javascript
jQuery插件-jRating评分插件源码分析及使用方法
2012/12/28 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
利用JS实现数字增长
2016/07/28 Javascript
jQuery解析返回的xml和json方法详解
2017/01/05 Javascript
纯原生js实现table表格的增删
2017/01/05 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
Nodejs多站点切换Htpps协议详解及简单实例
2017/02/23 NodeJs
Bootstrap fileinput组件封装及使用详解
2017/03/10 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
python生成IP段的方法
2015/07/07 Python
Python随机生成均匀分布在单位圆内的点代码示例
2017/11/13 Python
Python处理菜单消息操作示例【基于win32ui模块】
2018/05/09 Python
利用python生成照片墙的示例代码
2020/04/09 Python
Python descriptor(描述符)的实现
2020/11/15 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
jQuery treeview树形结构应用
2021/03/24 jQuery
女大学生毕业找工作的自我评价
2013/10/03 职场文书
个人简历自我鉴定
2013/10/11 职场文书
开门红主持词
2014/04/02 职场文书
校园环保标语
2014/06/13 职场文书
中学生旷课检讨书模板
2014/10/08 职场文书
防溺水主题班会教案
2015/08/12 职场文书
Zabbix对Kafka topic积压数据监控的解决方案
2022/07/07 Servers