VUE放大镜组件

<!--放大镜组件-->
<template>
  <div class="zoom l">
    <div class="zoom_top">
      <img
        :src="require(`@/assets/img/productDetail/${currentActive}.jpg`)"
        alt=""
        style="width: 100%"
      />
      <div class="mask" v-show="maskShow" :style="topStyle"></div>
      <div
        class="maskTop"
        @mouseover="bigShow()"
        @mouseout="bigLeave()"
        @mousemove="move($event)"
      ></div>
      <div class="big" v-show="isShow">
        <img
          :src="require(`@/assets/img/productDetail/${currentActive}.jpg`)"
          alt=""
          style="width: 165%"
          :style="r_img"
        />
      </div>
    </div>
    <div class="zoom_bottom">
      <div v-for="(item, index) in imgSS" :key="index">
        <img
          :class="{ Active: index == currentActive }"
          :src="require(`@/assets/img/productDetail/${index}.jpg`)"
          alt=""
          style="width: 100%"
          @mouseenter="pdEnter(index)"
        />
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: "zoom",
  data() {
    return {
      text0: [0, 1, 1, 11, ,], //用于测试
      text: [1, 1, 1, 1, 1, 1], //用于测试
      imgSS: [
        0,
        1,
        2,
        3,
        4, //用于测试
      ],
      currentActive: 0,
      r_img: {},
      isShow: 0,
      maskShow: 0,
      topStyle: {},
      // currentX: 0,
      // currentY: 0,
    };
  },
  methods: {
    //鼠标经过图片,显示详细图片以及小图片出现边框
    pdEnter(index) {
      this.currentActive = index;
    },
    bigShow() {
      this.isShow = !this.isShow;
      this.maskShow = !this.maskShow;
    },
    bigLeave() {
      this.isShow = !this.isShow;
      this.maskShow = !this.maskShow;
    },
    move($event) {
      let x = event.offsetX;
      let y = event.offsetY;
      let topX = x - 100 < 0 ? 0 : x - 100;
      let topY = y - 100 < 0 ? 0 : y - 100;
      if (topX > 200) {
        topX = 200;
      }
      if (topY > 200) {
        topY = 200;
      }
      // this.currentX = X;
      // this.currentY = Y;
      // console.log(this.currentX);
      this.topStyle.transform = `translate(${topX}px,${topY}px)`;
      this.r_img.transform = `translate(-${(518 / 380) * topX}px,-${
        (500 / 380) * topY
      }px)`;
    },
  },
};
</script>

<style>
/* 放大镜效果 */

/* 一个全部的遮罩层,此处用于(冒泡作用)??待懂 */
.maskTop {
  width: 100%;
  height: 100%;
  position: absolute;
  z-index: 1;
  top: 0;
  left: 0;
  cursor: move;
}
/* 黄色遮罩 */
.mask {
  position: absolute;
  top: 0;
  left: 0;
  width: 50%;
  height: 50%;
  background-color: yellow;
  border: 1px solid #ccc;
  /* 半透明 */
  opacity: 0.5;
}
/* 放大的图片 */
.big {
  position: absolute;
  left: 100%;
  top: 0;
  z-index: 2;
  width: 132%;
  height: 132%;
  background-color: #fff;
  overflow: hidden;
}
.zoom {
  width: 100%;
  height: 100%;
}
.zoom_top {
  position: relative;
  width: 100%;
  height: 74%;
}
.zoom_bottom {
  display: flex;
  justify-content: space-between;
  margin-top: 15px;
  height: 12%;
}
.zoom_bottom div {
  width: 16.5%;
  height: 12%;
}
.zoom_bottom img {
  width: 16.5%;
}
/* 动态选择图片 */
.Active {
  border: 1px solid rgb(239, 31, 31);
}
</style>
posted @ 2021-05-26 21:09  YoungPzz  阅读(506)  评论(0)    收藏  举报