vue版本的仿京东放大镜代码还有原生js版本的。(组件封装)

vue版本的仿京东放大镜

<template>
  <div class="maxBox">
    <div
      ref="left"
      class="left"
      @mousemove="showImg"
      @mouseleave="flag = false"
    >
      <img
        src="https://imgres.crsky.com/crsky/60/297162-20210421095209607f8549bd770.jpg"
        alt=""
      />
      <div v-show="flag" ref="mask" class="mask"></div>
    </div>
    <div v-show="flag" ref="right" class="right">
      <img
        ref="maxImg"
        src="https://imgres.crsky.com/crsky/60/297162-20210421095209607f8549bd770.jpg"
        alt=""
      />
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      flag: false,
    };
  },
  methods: {
    showImg(e) {
      this.flag = true;
      let left = this.$refs.left;
      //  获取鼠标在 left 的当前坐标
      let x = e.pageX - left.offsetLeft; //x轴的
      let y = e.pageY - left.offsetTop;
      //   拿到小方块的坐标
      let mask = this.$refs.mask;
      // 小方块移动的坐标 例:小方块移动的横向坐标就是 x-小方块的一半
      var maskX = x - mask.offsetWidth / 2;
      var maskY = y - mask.offsetHeight / 2;
      // 小方块可以移动的最大横向坐标   最大盒子 - 小盒子算出可移动范围
      let maxX = left.offsetWidth - mask.offsetWidth;
      let maxY = left.offsetHeight - mask.offsetHeight;
      // 判断横向超出,让他不超出  移动的坐标 大于 可移动的范围  赋值为最大的值
      if (maskX > maxX) {
        maskX = maxX;
      } else if (maskX < 0) {
        maskX = 0;
      }
      //   判断纵向
      if (maskY > maxY) {
        maskY = maxY;
      } else if (maskY < 0) {
        maskY = 0;
      }
      mask.style.left = maskX + "px";
      mask.style.top = maskY + "px";
      // 右边盒子
      let rightBox = this.$refs.right;
      // 右边大图的位置
      let maxImg = this.$refs.maxImg;
      //   大图片的移动的最大距离
      let imgMaxX = maxImg.offsetWidth - rightBox.offsetWidth;
      let imgMaxY = maxImg.offsetHeight - rightBox.offsetHeight;
      //   放大镜图片移动的距离
      let imgX = maskX * (imgMaxX / maxX);
      let imgY = maskY * (imgMaxY / maxY);
      maxImg.style.left = -imgX + "px";
      maxImg.style.top = -imgY + "px";
    },
  },
};
</script>

<style lang="scss" scoped>
* {
  padding: 0;
  margin: 0;
}
.mask {
  width: 220px;
  height: 220px;
  background-color: rgba(29, 192, 201, 0.4);
  position: absolute;
}
.maxBox {
  width: 1000px;
  height: 800px;
  margin: 10px auto;
  display: flex;
}
.left {
  width: 350px;
  height: 350px;
  border: 1px solid rgb(209, 208, 208);
  position: relative;
  &:hover {
    cursor: move;
  }
  img {
    width: 100%;
    height: 100%;
  }
}
.right {
  width: 500px;
  height: 500px;
  border: 1px solid rgb(202, 202, 202);
  position: relative;
  overflow: hidden;
  img {
    width: 1000px;
    height: 1000px;
    position: absolute;
    flex-shrink: 0;
    left: 0;
    top: 0;
  }
}
</style>

原生js版本放大镜

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  <title>Document</title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }

    .goods {
      width: 300px;
      height: 400px;
      position: relative;
      margin-left: 100px;
      float: left;
    }

    .goods img {
      width: 100%;
      height: 100%;
    }

    .mask {
      width: 200px;
      height: 200px;
      background-color: rgba(247, 150, 4, 0.8);
      position: absolute;
      top: 0;
      left: 30px;
      cursor: move;
      display: none;
    }

    .big {
      width: 400px;
      height: 500px;
      position: relative;
      float: left;
      margin-left: 20px;
      overflow: hidden;
    }

    .big img {
      width: 800px;
      height: 1000px;
      position: absolute;
      left: 0;
      top: 0;
    }
  </style>
</head>

<body>
  <div class="hh">
    <div class="goods">
      <img src="https://imgres.crsky.com/crsky/60/297162-20210421095209607f8549bd770.jpg" alt="" />
      <div class="mask"></div>
    </div>
    <div class="big" style="display: none">
      <img src="https://imgres.crsky.com/crsky/60/297162-20210421095209607f8549bd770.jpg" alt="" />
    </div>
  </div>
  <script>
    // 1、先获取元素
    var goods = document.querySelector(".goods");
    var mask = document.querySelector(".mask");
    var hh = document.querySelector(".hh");
    var big = document.querySelector(".big");
    hh.onmouseover = function () {
      big.style.display = "block";
    };
    hh.onmouseout = function () {
      big.style.display = "none";
    };
    goods.onmouseover = function () {
      mask.style.display = "block";
    };
    goods.onmouseout = function () {
      mask.style.display = "none";
    };
    goods.onmousemove = function (event) {
      // 2、获取鼠标在goods里面的坐标
      var x = event.pageX - goods.offsetLeft;
      var y = event.pageY - goods.offsetTop;
      // 3、小方块移动的坐标 例:小方块移动的横向坐标就是 x-小方块的一半
      var maskX = x - mask.offsetWidth / 2;
      var maskY = y - mask.offsetHeight / 2;

      // 4、小方块可以移动的最大横坐标
      var maxX = goods.offsetWidth - mask.offsetWidth;
      var maxY = goods.offsetHeight - mask.offsetHeight;
      // 判断横向超出,让他不超出
      if (maskX > maxX) {
        maskX = maxX;
      } else if (maskX < 0) {
        maskX = 0;
      }
      // 判断纵向超出,让他不超出
      if (maskY > maxY) {
        maskY = maxY;
      } else if (maskY < 0) {
        maskY = 0;
      }

      // 小方块移动的距离
      mask.style.left = maskX + "px";
      mask.style.top = maskY + "px";

      var big = document.querySelector(".big");
      var img = big.children[0];
      // 5、大图片移动的最大距离
      var imgMaxX = img.offsetWidth - big.offsetWidth;
      var imgMaxY = img.offsetHeight - big.offsetHeight;
      // 放大镜图片移动的距离
      var imgx = maskX * (imgMaxX / maxX);
      var imgy = maskY * (imgMaxY / maxY);

      img.style.left = -imgx + "px";
      img.style.top = -imgy + "px";
    };
  </script>
</body>

</html>

猜你喜欢

转载自blog.csdn.net/qq_54753561/article/details/122522761