侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

Vue实现网页放大镜效果

前端  /  管理员 发布于 6年前   268

组件使用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="http://www.fly63.com/article/detial/4590/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


效果


来自:https://www.cnblogs.com/hhyf/archive/2019/08/09/11326389.html




  • 上一条:
    前端开发Code Review内容【vue记录】
    下一条:
    VUE中CSS样式穿透
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 使用 Alpine.js 排序插件对元素进行排序(0个评论)
    • 在js中使用jszip + file-saver实现批量下载OSS文件功能示例(0个评论)
    • 在vue中实现父页面按钮显示子组件中的el-dialog效果(0个评论)
    • 使用mock-server实现模拟接口对接流程步骤(0个评论)
    • vue项目打包程序实现把项目打包成一个exe可执行程序(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-06
    • 2017-07
    • 2017-08
    • 2017-09
    • 2017-10
    • 2017-11
    • 2018-03
    • 2018-04
    • 2018-05
    • 2018-06
    • 2018-09
    • 2018-11
    • 2018-12
    • 2019-02
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2021-04
    • 2021-05
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-11
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-09
    • 2023-10
    • 2023-11
    • 2023-12
    • 2024-01
    • 2024-02
    • 2024-03
    • 2024-04
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客