一个手写的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 对象比较实现代码
Apr 27 Javascript
写给想学习Javascript的朋友一点学习经验小结
Nov 23 Javascript
原生JavaScript实现异步多文件上传
Dec 02 Javascript
莱鸟介绍javascript onclick事件
Jan 06 Javascript
7个去伪存真的JavaScript面试题
Jan 07 Javascript
详解Javascript继承的实现
Mar 25 Javascript
iscroll.js滚动加载实例详解
Jul 18 Javascript
vue项目打包部署到服务器的方法示例
Aug 27 Javascript
监听element-ui table滚动事件的方法
Mar 26 Javascript
React学习之受控组件与数据共享实例分析
Jan 06 Javascript
记一次用ts+vuecli4重构项目的实现
May 21 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
Jul 19 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
全国FM电台频率大全 - 7 吉林省
2020/03/11 无线电
php设计模式之单例模式使用示例
2014/01/20 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
smarty实现多级分类的方法
2014/12/05 PHP
php把数组值转换成键的方法
2015/07/13 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
CodeIgniter框架常见用法工作总结
2017/03/16 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
PHP标准库 (SPL)――Countable用法示例
2020/06/05 PHP
javascript一些不错的函数脚本代码
2008/09/10 Javascript
jQuery学习笔记 获取jQuery对象
2012/09/19 Javascript
减少访问DOM的次数提升javascript性能
2014/02/24 Javascript
js鼠标点击图片实现随机变换图片的方法
2015/02/16 Javascript
老生常谈Javascript中的原型和this指针
2016/10/09 Javascript
Ajax和Comet技术总结
2017/02/19 Javascript
详解Vue改变数组中对象的属性不重新渲染View的解决方案
2018/09/21 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
vue实现鼠标经过动画
2019/10/16 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
html-webpack-plugin修改页面的title的方法
2020/06/18 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
详解python的几种标准输出重定向方式
2016/08/15 Python
详谈python中冒号与逗号的区别
2018/04/18 Python
利用python实现汉字转拼音的2种方法
2019/08/12 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
英国音乐设备和乐器商店:Gear4music
2017/10/16 全球购物
环境工程大学生自荐信
2013/10/21 职场文书
学习决心书范文
2014/03/11 职场文书
2014学习全国两会精神心得体会2000字
2014/03/11 职场文书
医学生毕业自我鉴定
2014/03/26 职场文书
土建专业大学生自荐信范文
2014/04/09 职场文书
警示教育片观后感
2015/06/17 职场文书
MySQL中LAG()函数和LEAD()函数的使用
2022/08/14 MySQL