首页 > 其他分享 >vue pc放大镜效果

vue pc放大镜效果

时间:2022-12-19 14:23:34浏览次数:49  
标签:vue width 放大镜 top height pc var shadow left

html 

<div class="choose" ref="choose">
            <div
              class="content"
              ref="content"
              @mousemove="handleMove"
              @mouseout="handleOut"
            >
              <img
                :src="'http://shanneng.oss-cn-hangzhou.aliyuncs.com' + imagespic"
              />
              <div class="shadow" ref="shadow"></div>
            </div>
</div>
<div class="larger" ref="larger">
            <img
              :src="'http://shanneng.oss-cn-hangzhou.aliyuncs.com' + imagespic"
              ref="big"
            />
</div>

js

 // 获取元素到文档区域的坐标
    getPosition: function (element) {
      var dc = document,
        rec = element.getBoundingClientRect(),
        x = rec.left, // 获取元素相对浏览器视窗window的左、上坐标
        y = rec.top;
      // 与html或body元素的滚动距离相加就是元素相对于文档区域document的坐标位置
      x += dc.documentElement.scrollLeft || dc.body.scrollLeft;
      y += dc.documentElement.scrollTop || dc.body.scrollTop;
      return {
        left: x,
        top: y,
      };
    },
    handleMove(evt) {
      var larger = this.$refs.larger;
      var shadow = this.$refs.shadow;
      var big = this.$refs.big;
      var pos = this.getPosition(this.$refs.choose);
      var shadowRect = shadow.getBoundingClientRect();
      var bigRect = big.getBoundingClientRect();
      var contentRect = this.$refs.content.getBoundingClientRect();
      var maxX = contentRect.width - shadowRect.width;
      var maxY = contentRect.height - shadowRect.height;

      var X = evt.pageX - pos.left - shadowRect.width / 2;
      var Y = evt.pageY - pos.top - shadowRect.height / 2;

      if (X <= 0) {
        X = 0;
      }
      if (X >= maxX) {
        X = maxX;
      }
      if (Y <= 0) {
        Y = 0;
      }
      if (Y >= maxY) {
        Y = maxY;
      }
      // 防止遮罩层粘滞,跟随鼠标一起滑出大图位置
      var bigX = (X * bigRect.width) / contentRect.width;
      var bigY = (Y * bigRect.height) / contentRect.height;
      //  bigX / bigW = X / contentW,主图和遮罩层之间存在两倍关系,放大图和原图之间也有两倍关系
      shadow.style.left = X + "px";
      shadow.style.top = Y + "px";

      // console.log(X, Y, bigX, bigY);

      big.style.left = -bigX + "px";
      big.style.top = -bigY + "px";

      larger.style.display = "block";
      shadow.style.display = "block";
    },
    handleOut(evt) {
      var larger = this.$refs.larger;
      var shadow = this.$refs.shadow;
      larger.style.display = "none";
      shadow.style.top = "-1000px";
      console.log(evt);
    },

 

css

.choose {
  width: 441px;
  height: 441px;
  margin: 22px;
  /* background-color: #3fac49; */
  /* position: relative; */
}
.larger {
  width: 440px;
  height: 440px;
  position: absolute;
  top: 25px;
  left: 500px;
  float: left;
  overflow: hidden;
  display: none;
}

.larger img {
  width: 800px;
  height: 800px;
  position: absolute;
  left: 0;
  top: 0;
}

.shadow {
  width: 200px;
  height: 200px;
  background-color: rgba(145, 200, 200, 0.4);
  position: absolute;
  left: 0;
  top: 0;
  z-index: 10;
  display: none;
}

 

标签:vue,width,放大镜,top,height,pc,var,shadow,left
From: https://www.cnblogs.com/2865----yyyy/p/16992020.html

相关文章

  • Vue刷新vuex数据丢失
    安装依赖npminstallvuex-persistedstate使用importVuefrom'vue'importVuexfrom'vuex'importcreatePersistedStatefrom'vuex-persistedstate'Vue.use(Vuex)export......
  • 日常总结:Vue写一个炫酷的时钟插件
    效果图代码奉上:<template><divclass="clock"><divclass="flip"><divclass="digitalfront":data-number="nextTimes[0]"></div><d......
  • 日常总结:Vue实现一个炫酷的代码瀑布流背景
    先看一下效果:代码奉上:<template><canvasid="canvas"/></template><script>exportdefault{name:"BackCanvas",props:{height:{......
  • vue基础 B站课程
     反转字符串:<template><div><!--先照抄,之后再自己写。多写。把vue的课程全学出来。。。。。职业:1学好本专业学技术2跨专业考研考公3.公务员教师......
  • vuejs实现文件下载的三种方式
    第一种方式是前端创建超链接,通过a标签的链接向后端服务发get请求,接收后端的文件流,非常简单:<a:href='"/路径"'>下载模板</a>另一种情况是创建div标签,动态创建a标签:<div......
  • rpc
    暂时忽略rpc的安装问题构建rpc-serverpackagemainimport("fmt""net""net/http""net/rpc")typeUserstruct{}func(u*User)GetUser(......
  • Vue.$nextTick的原理是什么-vue面试进阶
    原理性的东西就会文字较多,请耐下心来,细细品味Vue中DOM更新机制当你气势汹汹地使用Vue大展宏图的时候,突然发现,咦,我明明对这个数据进行更改了,但是当我获取它的时候怎么是上......
  • 面试官:vue2和vue3的区别有哪些?
    一、Vue3与Vue2区别详述1.生命周期对于生命周期来说,整体上变化不大,只是大部分生命周期钩子名称上+“on”,功能上是类似的。不过有一点需要注意,Vue3在组合式API(Comp......
  • 必会vue面试题(附答案)
    vue初始化页面闪动问题使用vue开发时,在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然一般......
  • 前端一面必会vue面试题(边面边更)
    为什么要使用异步组件节省打包出的结果,异步组件分开打包,采用jsonp的方式进行加载,有效解决文件过大的问题。核心就是包组件定义变成一个函数,依赖import()语法,可以实现文......