一个手写的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 相关文章推荐
JavaScript 计算图片加载数量的代码
Jan 01 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
如何让div span等元素能响应键盘事件操作指南
Nov 13 Javascript
引用 js在IE与FF之间的区别详细解析
Nov 20 Javascript
Backbone.js的一些使用技巧
Jul 01 Javascript
jQuery的ajax下载blob文件
Jul 21 Javascript
原生js实现淘宝购物车功能
Jun 23 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
详解vue-video-player使用心得(兼容m3u8)
Aug 23 Javascript
layui-select动态选中值的例子
Sep 23 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
May 06 Javascript
解决Vue-cli3没有vue.config.js文件夹及配置vue项目域名的问题
Dec 04 Vue.js
详解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
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
详谈phpAdmin修改密码后拒绝访问的问题
2017/04/03 PHP
javascript 一些用法小结
2009/09/11 Javascript
Raphael带文本标签可拖动的图形实现代码
2013/02/20 Javascript
js和jquery对dom节点的操作(创建/追加)
2013/04/21 Javascript
js动态添加删除,后台取数据(示例代码)
2013/11/25 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
Bootstrap在线电子商务网站实战项目5
2016/10/14 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
详解angularJs指令的3种绑定策略
2017/04/13 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
详解使用vscode+es6写nodejs服务端调试配置
2017/09/21 NodeJs
Vuex持久化插件(vuex-persistedstate)解决刷新数据消失的问题
2019/04/16 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
JavaScript This指向问题详解
2019/11/25 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
Element Alert警告的具体使用方法
2020/07/27 Javascript
编写v-for循环的技巧汇总
2020/12/01 Javascript
详解微信小程序「渲染层网络层错误」的解决方法
2021/01/06 Javascript
[07:37]DOTA2-DPC中国联赛2月2日Recap集锦
2021/03/11 DOTA
python代码制作configure文件示例
2014/07/28 Python
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
实例解析Python的Twisted框架中Deferred对象的用法
2016/05/25 Python
Python2.7下安装Scrapy框架步骤教程
2017/12/22 Python
Python基础之循环语句用法示例【for、while循环】
2019/03/23 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
python解包用法详解
2021/02/17 Python
css3 实现元素弧线运动的示例代码
2020/04/24 HTML / CSS
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
党员三严三实对照检查材料
2014/10/13 职场文书
流动人口婚育证明
2014/10/19 职场文书
部门经理助理岗位职责
2015/04/13 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
python办公自动化之excel的操作
2021/05/23 Python