实现一个vue放大镜功能
- 首先,在Vue组件中定义一个data属性用来存放放大镜区域的样式和位置信息,以及鼠标在图片中的位置信息:
data() {
return {
magnifier: {
width: 0,
height: 0,
top: 0,
left: 0,
show: false,
mouseX: 0,
mouseY: 0
}
}
}
- 在模板中,使用
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>
- 在
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
}
}
- 在计算属性中,根据放大镜区域内的图片位置来计算放大镜区域内的图片位置,并返回放大镜区域的样式信息:
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`
}
}
}
- 最后,在样式中定义放大镜区域的样式信息:
.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>
原文地址: http://www.cveoy.top/t/topic/btBf 著作权归作者所有。请勿转载和采集!