一个手写的vue放大镜效果


Posted in Javascript onAugust 09, 2019

组件使用less,请确保已安装loader

本组件为放大镜组件,传参列表为:

•width: 必传,设置放大镜的宽高(正方形),放大区域等同,放大倍数为2倍

•picList:必传,传入图片列表

使用示例:

script:

import mirror from 'xx/mirror'
 export default {
  components:{
   mirror
  },
  data(){
   return {
    width:300,
    picList:[
      xxxxxx,
      xxxxxx
    ],
   }
  }
 }

html:

<mirror :width="width" :picList="picList" />

详细代码:

HTML:

<template>
 <div class="mirror">
   <div class="wrap" :style="{width:width+'px',height:width+'px'}" >
    <div ref="truth" :style="{width:'100%',height:'100%'}" @mousemove="move" @mouseenter="showMagnify" @mouseleave="hideMagnify">
    <div class="mask" ref="mask" v-show = "showMask" :style="{width:width/2+'px',height:width/2+'px',left:maskPosition.x+'px',top:maskPosition.y+'px'}"></div>
    <img :src="picList[picIndex]" draggable="false"/>
    </div>
    <div class="virtual" ref="virtual" v-if = "isShowVirtual" :style="{width:width+'px',height:width+'px'}" >
      <div class="big" ref = "bigPic" :style="{position:'absolute',width:2*width+'px',height:2*width+'px',backgroundSize:'100% 100%',backgroundImage:`url(${picList[picIndex]})`,left:percent.x, top:percent.y}" >
      </div>
    </div>
   </div>
   <ul class="picList" :style="{width:width+'px'}">
     <li v-for = "(item,index) in picList" :class="{now:index==picIndex}" :data-index="index" :key ="item" @mouseenter="changeIndex">
      <img :src ="item" />
     </li>
   </ul>
 </div>
</template>

JS:

export default {
   props:['width','picList'],//宽度是用来给放大镜的
   data(){
    return {
     picIndex:0,
     isShowVirtual:false,
     showMask:false,
     maskPosition:{},
     percent:{},
    }
   },
   methods:{
    computedOffset(obj,prop){ //计算元素到body的绝对位置
    if(obj==document.body || obj.offsetParent == document.body){
     return parseInt(obj[prop])
    }
    return parseInt(obj[prop])+this.computedOffset(obj.offsetParent,prop)
  },
    changeIndex(e){
     this.picIndex = e.target.dataset.index
    },
    showMagnify(e){
     this.showMask=true;
     this.isShowVirtual = true;
    },
    hideMagnify(){
     this.isShowVirtual=false;
     this.showMask=false
    },
    computePosition(e){
      let x = e.pageX,y = e.pageY;
      let mask = this.$refs.mask;
      let truth = this.$refs.truth;
      let virtual = this.$refs.virtual;
      let bigPic = this.$refs.bigPic;
      x = x-this.computedOffset(truth,'offsetLeft') -mask.offsetWidth/2;
      y = y-this.computedOffset(truth,'offsetTop')- mask.offsetHeight/2;
     if(x<=0) {
       x=0
      }else if(x>truth.offsetWidth - mask.offsetWidth){
       x = truth.offsetWidth/2
      }
      if(y<=0){
       y=0;
      }
      else if(y>truth.offsetHeight - mask.offsetHeight){
       y = truth.offsetHeight/2
      }

      this.maskPosition = {
       x,y
      }
      //计算比例
      this.percent={
       x:-x/(truth.offsetWidth-mask.offsetWidth)*(bigPic.offsetWidth - virtual.offsetWidth)+'px',
       y:-y/(truth.offsetHeight-mask.offsetHeight)*(bigPic.offsetHeight - virtual.offsetHeight)+'px'
      }
    },
    move(e){
     this.computePosition(e)
    }
  }
  }

CSS:

<style lang="less" scoped>
.now{
 border-color: cyan !important;
}
 .mirror{
  width:100%;
  .wrap{
   user-select: none;
   margin-bottom: 20px;
   position: relative;
   background-color: #fff;
   border:1px solid gray;
   box-sizing:border-box;
     cursor: pointer;
    img{
     width:100%;
     height:100%;
    }
    .virtual{
     overflow:hidden;
     width:100%;
     height:100%;
     position:absolute;
     left:calc(100% + 10px);
     top:0;
     background-repeat:no-repeat
    }
    .mask{
     position: absolute;
     background-image: url('https://img-tmdetail.alicdn.com/tps/i4/T12pdtXaldXXXXXXXX-2-2.png');
     background-repeat:repeat;
     cursor: move;
    }
  }
  .picList{
   width:100%;
   display: flex;
   justify-content: space-between;
   flex-wrap:wrap;
   li{
    width:50px;
    height:50px;
    margin:5px;
    border:1px solid transparent;
    box-sizing: border-box;
    img{
     width:100%;
     height:100%
    }
   }
  }
  .picList:after{
   content:"";
   flex:auto;
  }
 }
</style>

可直接复制文件内容至项目使用,文件地址:https://blog-static.cnblogs.com/files/hhyf/mirror.vue.js

效果

一个手写的vue放大镜效果

总结

以上所述是小编给大家介绍的一个手写的vue放大镜效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
fixedBox固定div漂浮代码支持ie6以上大部分主流浏览器
Jun 26 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
Mar 01 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
May 03 Javascript
vue.js树形组件之删除双击增加分支实例代码
Feb 28 Javascript
Angular实现的简单定时器功能示例
Dec 28 Javascript
vue自定义filters过滤器
Apr 26 Javascript
js input输入百分号保存数据库失败的解决方法
May 26 Javascript
详解vue 项目白屏解决方案
Oct 31 Javascript
vue实现户籍管理系统
May 29 Javascript
ssm+vue前后端分离框架整合实现(附源码)
Jul 08 Javascript
VUE项目axios请求头更改Content-Type操作
Jul 24 Javascript
vue element-ui中table合计指定列求和实例
Nov 02 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
Aug 09 #Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
Aug 09 #Javascript
小程序Request的另类用法详解
Aug 09 #Javascript
一篇文章弄懂javascript中的执行栈与执行上下文
Aug 09 #Javascript
vue中组件通信的八种方式(值得收藏!)
Aug 09 #Javascript
Vue全局loading及错误提示的思路与实现
Aug 09 #Javascript
使用Vue CLI创建typescript项目的方法
Aug 09 #Javascript
You might like
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
分享8个最佳的代码片段在线测试网站
2013/06/29 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
javawscript 三级菜单的实现原理
2009/07/01 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
createElement与createDocumentFragment的点点区别小结
2011/12/19 Javascript
10个基于浏览器的JavaScript调试工具分享
2013/02/07 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
js前端实现多图图片上传预览的两个方法(推荐)
2016/11/18 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
解决vue 引入子组件报错的问题
2018/09/06 Javascript
Vue.js上传图片到阿里云OSS存储的方法示例
2018/12/13 Javascript
vue计算属性computed、事件、监听器watch的使用讲解
2019/01/21 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛 DT VS HGT
2014/05/22 DOTA
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
python实现socket客户端和服务端简单示例
2014/02/24 Python
详解Django中的权限和组以及消息
2015/07/23 Python
利用Python中SocketServer 实现客户端与服务器间非阻塞通信
2016/12/15 Python
Windows下PyCharm安装图文教程
2018/08/27 Python
Python 多维List创建的问题小结
2019/01/18 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
Python实现AI换脸功能
2020/04/10 Python
python实现npy格式文件转换为txt文件操作
2020/07/01 Python
.net面试题
2016/09/17 面试题
就业协议书范本
2014/04/11 职场文书
村官个人总结范文
2015/03/03 职场文书
爱国主义教育基地观后感
2015/06/18 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书
详解jQuery的核心函数和事件处理
2022/02/18 jQuery
python实现会员管理系统
2022/03/18 Python
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL
Linux中一对多配置日志服务器的详细步骤
2022/07/23 Servers