| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | <template>  <div class="spec-preview">    <!-- 此处懒加载无法显示图片 -->    <el-image      :src="imgUrl"      alt=""      fit="cover"      style="width: 100%; height: 100%"    ></el-image>    <div      class="event"      @mousemove="handler"      @mouseleave="leave"      @click="$emit('handleViwer')"    ></div>    <!-- <div class="big">        <img :src="imgUrl" alt="" ref="big" />      </div> -->    <!-- 遮罩层 -->    <div class="mask" ref="mask"></div>      </div></template>    <script>export default {  name: "Zoom",  props: {    imgUrl: String,  },  data() {    return {    };  },  methods: {    handler(event) {      let mask = this.$refs.mask;      // let bigImg = this.$refs.big;      // 遮罩层可移动的范围:鼠标的当前坐标到该元素的距离(左侧、顶部)减去 遮罩层宽、高的一半(遮罩层始终是一个以鼠标为中心的正方形)      let left = event.offsetX - mask.offsetWidth / 2;      let top = event.offsetY - mask.offsetHeight / 2;      // 约束遮罩层可移动的范围      if (left <= 0) left = 0;      if (left >= mask.offsetWidth) left = mask.offsetWidth;      if (top <= 0) top = 0;      if (top >= mask.offsetHeight) top = mask.offsetHeight;      // 修改元素的left|top属性值      mask.style.left = left + "px";      mask.style.top = top + "px";      // bigImg.style.left = -2 * left + "px";      // bigImg.style.top = -2 * top + "px";      let obj = {};      obj.left = left;      obj.top = top;      obj.bigShow = true;      this.$emit("sendStyle", obj);    },    leave() {      let obj = {};      obj.left = 0;      obj.top = 0;      obj.bigShow = false;      this.$emit("sendStyle", obj);    },  },};</script>    <style lang="scss" scoped>.spec-preview {  position: relative;  width: 100%;  height: 100%;  img {    width: 100%;    height: 100%;  }  .event {    width: 100%;    height: 100%;    position: absolute;    top: 0;    left: 0;    z-index: 1;  }  .mask {    width: 50%;    height: 50%;    background-color: rgba(100, 149, 237, 0.3);    position: absolute;    left: 0;    top: 0;    display: none;  }  .big {    width: 100%;    height: 100%;    position: absolute;    top: -1px;    left: 100%;    border: 1px solid #aaa;    overflow: hidden;    z-index: 1;    display: none;    background: white;    img {      width: 200%;      max-width: 200%;      height: 200%;      position: absolute;      left: 0;      top: 0;    }  }  .event:hover ~ .mask,  .event:hover ~ .big {    display: block;  }  }</style>  
 |