一个手写的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 相关文章推荐
谷歌浏览器 insertCell与appendChild的区别
Feb 12 Javascript
锋利的jQuery 第三章章节总结的例子
Mar 23 Javascript
JavaScript中关于indexOf的使用方法与问题小结
Aug 05 Javascript
定时器(setTimeout/setInterval)调用带参函数失效解决方法
Mar 26 Javascript
JQuery筛选器全系列介绍
Aug 27 Javascript
javascript父、子页面交互技巧总结
Aug 08 Javascript
javascript实现表格排序 编辑 拖拽 缩放
Jan 02 Javascript
高性能JavaScript 重排与重绘(2)
Aug 11 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
May 15 jQuery
Vue路由守卫之路由独享守卫
Sep 25 Javascript
vue实现购物车功能(商品分类)
Apr 20 Javascript
vue路由结构可设一层方便动态添加路由操作
Aug 31 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禁止页面缓存的代码
2011/10/23 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
php页面缓存方法小结
2015/01/10 PHP
使用PHP访问RabbitMQ消息队列的方法示例
2018/06/06 PHP
thinkPHP框架实现的短信接口验证码功能示例
2018/06/20 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
PHP实现长轮询消息实时推送功能代码实例讲解
2021/02/26 PHP
javascript 面向对象编程基础:继承
2009/08/21 Javascript
jquery单选框radio绑定click事件实现方法
2015/01/14 Javascript
Javascript 调用 ActionScript 的简单方法
2016/09/22 Javascript
Node.js  事件循环详解及实例
2017/08/06 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
Mac中安装nvm的教程分享
2017/12/11 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
python 七种邮件内容发送方法实例
2014/04/22 Python
Python实现的最近最少使用算法
2015/07/10 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
2017/12/14 Python
python利用微信公众号实现报警功能
2018/06/10 Python
Python实现求两个数组交集的方法示例
2019/02/23 Python
Python3.5基础之函数的定义与使用实例详解【参数、作用域、递归、重载等】
2019/04/26 Python
win10系统Anaconda和Pycharm的Tensorflow2.0之CPU和GPU版本安装教程
2019/12/03 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
python3实现简单飞机大战
2020/11/29 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
html5调用摄像头功能的实现代码
2018/05/07 HTML / CSS
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
亚瑟士美国官网:ASICS美国
2017/02/01 全球购物
民事答辩状格式范文
2015/05/21 职场文书
小学班主任工作随笔
2015/08/15 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
导游词之沈阳清昭陵
2019/12/28 职场文书
基于Golang 高并发问题的解决方案
2021/05/08 Golang
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python