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动态给table添加、删除行 改进版
Jan 19 Javascript
JavaScript高级程序设计 客户端存储学习笔记
Sep 10 Javascript
循环 vs 递归浅谈
Feb 28 Javascript
js数组与字符串常用方法总结
Jan 13 Javascript
JS实现的四级密码强度检测功能示例
May 11 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
Aug 14 jQuery
js 数组详细操作方法及解析合集
Jun 01 Javascript
自己动手封装一个React Native多级联动
Sep 19 Javascript
微信小程序 组件的外部样式externalClasses使用详解
Sep 06 Javascript
jQuery擦除插件eraser使用方法详解
Jan 11 jQuery
antd-日历组件,前后禁止选择,只能选中间一部分的实例
Oct 29 Javascript
梳理一下vue中的生命周期
Dec 30 Vue.js
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生成图形(Libchart)实例
2013/11/06 PHP
php实现读取超大文件的方法
2014/07/28 PHP
php实现的树形结构数据存取类实例
2014/11/29 PHP
PHP Hash算法:Times33算法代码实例
2015/05/13 PHP
php中错误处理操作实例分析
2019/08/23 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
ext读取两种结构的xml的代码
2008/11/05 Javascript
php与js的区别是什么
2013/08/05 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
详解JavaScript中|单竖杠运算符的使用方法
2016/05/23 Javascript
聊一聊jQuery插件uploadify使用方法
2016/08/24 Javascript
求js数组的最大值和最小值的四种方法
2017/03/03 Javascript
详解vue-router 2.0 常用基础知识点之router.push()
2017/05/10 Javascript
Vue路由跳转问题记录详解
2017/06/15 Javascript
Vue filter介绍及其使用详解
2017/10/21 Javascript
AngularJS中controller控制器继承的使用方法
2017/11/03 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
iconfont的三种使用方式详解
2018/08/05 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
jQuery 函数实例分析【函数声明、函数表达式、匿名函数等】
2020/05/19 jQuery
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
Python使用正则匹配实现抓图代码分享
2015/04/02 Python
Python进阶学习之特殊方法实例详析
2017/12/01 Python
利用python画出折线图
2018/07/26 Python
Python3+Appium实现多台移动设备操作的方法
2019/07/05 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
Python+Appium实现自动化测试的使用步骤
2020/03/24 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
商业项目策划方案
2014/06/05 职场文书
2014应届本科生自我评价
2014/09/13 职场文书
关于成绩下滑的自我检讨书
2014/09/20 职场文书
2014年班组建设工作总结
2014/12/01 职场文书
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL