一个手写的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子窗口ModalDialog中操作父窗口对像
Dec 11 Javascript
jQuery cdn使用介绍
May 08 Javascript
深入理解JavaScript高级之词法作用域和作用域链
Dec 10 Javascript
javascript异步编程代码书写规范Promise学习笔记
Feb 11 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
Jun 05 Javascript
图文详解Heap Sort堆排序算法及JavaScript的代码实现
May 04 Javascript
简单理解js的冒泡排序
Dec 19 Javascript
vue+axios新手实践实现登陆的示例代码
Jun 06 Javascript
vue项目引入字体.ttf的方法
Sep 28 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
Apr 24 Javascript
微信小程序实现同一页面取值的方法分析
Apr 30 Javascript
JS实现鼠标按下拖拽效果
Jul 23 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制作图形验证码代码分享
2014/10/23 PHP
PHP计算加权平均数的方法
2015/07/16 PHP
yii2.0整合阿里云oss的示例代码
2017/09/19 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
javascript基础第一章 JavaScript与用户端
2010/07/22 Javascript
jsTree 基于JQuery的排序节点 Bug
2011/07/26 Javascript
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
json数据处理技巧(字段带空格、增加字段、排序等等)
2013/06/14 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
js实现汉字排序的方法
2015/07/23 Javascript
浅谈JavaScript超时调用和间歇调用
2015/08/30 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
理解JS绑定事件
2016/01/19 Javascript
深入解析Javascript闭包的功能及实现方法
2016/07/10 Javascript
微信小程序 教程之wxapp视图容器 scroll-view
2016/10/19 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
详解MVC如何使用开源分页插件(shenniu.pager.js)
2016/12/16 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
JavaScript贪吃蛇小组件实例代码
2017/08/20 Javascript
Vue-cli中为单独页面设置背景色的实现方法
2018/02/11 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
Python中的推导式使用详解
2015/06/03 Python
C#面试问题
2016/07/29 面试题
班组长工作职责
2013/12/25 职场文书
产品生产计划书
2014/05/07 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
党的群众路线教育实践活动批评与自我批评发言稿
2014/10/16 职场文书
机关作风建设自查报告
2014/10/22 职场文书
2014年大学教师工作总结
2014/12/02 职场文书
开工典礼致辞
2015/07/29 职场文书
CSS3 制作的图片滚动效果
2021/04/14 HTML / CSS
JavaScript前端面试组合函数
2022/06/21 Javascript