1. 首先,在Vue组件中定义一个data属性用来存放放大镜区域的样式和位置信息,以及鼠标在图片中的位置信息:
data() {
  return {
    magnifier: {
      width: 0,
      height: 0,
      top: 0,
      left: 0,
      show: false,
      mouseX: 0,
      mouseY: 0
    }
  }
}
  1. 在模板中,使用v-show指令控制放大镜区域的显示和隐藏,并绑定mousemove事件来更新鼠标位置信息:
<template>
  <div class="container">
    <div class="image-container">
      <img src="image.jpg" alt="image" @mousemove="showMagnifier">
      <div class="magnifier" :style="magnifierStyle" v-show="magnifier.show"></div>
    </div>
  </div>
</template>
  1. showMagnifier方法中更新放大镜区域的位置和样式信息,以及计算放大镜区域内的图片位置:
methods: {
  showMagnifier(e) {
    const image = e.target
    const imageRect = image.getBoundingClientRect()
    const magnifier = this.magnifier

    magnifier.show = true
    magnifier.width = image.offsetWidth / 3
    magnifier.height = image.offsetHeight / 3
    magnifier.top = e.clientY - imageRect.top - magnifier.height / 2
    magnifier.left = e.clientX - imageRect.left - magnifier.width / 2

    magnifier.mouseX = e.clientX - imageRect.left
    magnifier.mouseY = e.clientY - imageRect.top
  }
}
  1. 在计算属性中,根据放大镜区域内的图片位置来计算放大镜区域内的图片位置,并返回放大镜区域的样式信息:
computed: {
  magnifierStyle() {
    const magnifier = this.magnifier
    const bgPosX = -magnifier.mouseX * 3 + magnifier.width / 2
    const bgPosY = -magnifier.mouseY * 3 + magnifier.height / 2

    return {
      width: `${magnifier.width}px`,
      height: `${magnifier.height}px`,
      top: `${magnifier.top}px`,
      left: `${magnifier.left}px`,
      backgroundImage: `url(image.jpg)`,
      backgroundPosition: `${bgPosX}px ${bgPosY}px`
    }
  }
}
  1. 最后,在样式中定义放大镜区域的样式信息:
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

.image-container {
  position: relative;
}

.magnifier {
  position: absolute;
  border: 1px solid #ccc;
  background-color: #fff;
  background-repeat: no-repeat;
  background-size: 600% 600%;
  z-index: 10;
}

完整代码:

<template>
  <div class="container">
    <div class="image-container">
      <img src="image.jpg" alt="image" @mousemove="showMagnifier">
      <div class="magnifier" :style="magnifierStyle" v-show="magnifier.show"></div>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      magnifier: {
        width: 0,
        height: 0,
        top: 0,
        left: 0,
        show: false,
        mouseX: 0,
        mouseY: 0
      }
    }
  },
  methods: {
    showMagnifier(e) {
      const image = e.target
      const imageRect = image.getBoundingClientRect()
      const magnifier = this.magnifier

      magnifier.show = true
      magnifier.width = image.offsetWidth / 3
      magnifier.height = image.offsetHeight / 3
      magnifier.top = e.clientY - imageRect.top - magnifier.height / 2
      magnifier.left = e.clientX - imageRect.left - magnifier.width / 2

      magnifier.mouseX = e.clientX - imageRect.left
      magnifier.mouseY = e.clientY - imageRect.top
    }
  },
  computed: {
    magnifierStyle() {
      const magnifier = this.magnifier
      const bgPosX = -magnifier.mouseX * 3 + magnifier.width / 2
      const bgPosY = -magnifier.mouseY * 3 + magnifier.height / 2

      return {
        width: `${magnifier.width}px`,
        height: `${magnifier.height}px`,
        top: `${magnifier.top}px`,
        left: `${magnifier.left}px`,
        backgroundImage: `url(image.jpg)`,
        backgroundPosition: `${bgPosX}px ${bgPosY}px`
      }
    }
  }
}
</script>

<style>
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

.image-container {
  position: relative;
}

.magnifier {
  position: absolute;
  border: 1px solid #ccc;
  background-color: #fff;
  background-repeat: no-repeat;
  background-size: 600% 600%;
  z-index: 10;
}
</style>
实现一个vue放大镜功能

原文地址: http://www.cveoy.top/t/topic/btBf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录