<template>
<div class="vab-magnifier">
<div class="image-box">
<img class="image" :src="imgData" />
<div class="magnifier" id="magnifier"></div>
</div>
</div>
</template>
<script>
export default {
props: ['imgData'],
mounted() {
this.init()
},
methods: {
init() {
const image = document.querySelector('.image')
const magnifier = document.getElementById('magnifier')
const imageUrl = image.src
image.addEventListener('mouseover', function () {
magnifier.style.visibility = 'visible'
})
image.addEventListener('mouseout', function () {
magnifier.style.visibility = 'hidden'
})
image.addEventListener('mousemove', function (e) {
const magnifierWidth = magnifier.offsetWidth
const magnifierHeight = magnifier.offsetHeight
const imageWidth = image.offsetWidth
const imageHeight = image.offsetHeight
const magnifierBackgroundSize = `${imageWidth * 2}px ${imageHeight * 2}px`
const offsetX = e.offsetX
const offsetY = e.offsetY
const positionX = offsetX - magnifierWidth / 2
const positionY = offsetY - magnifierHeight / 2
const backgroundPositionX = -positionX * 2
const backgroundPositionY = -positionY * 2
magnifier.style.background = `url(${imageUrl})`
magnifier.style.backgroundSize = magnifierBackgroundSize
magnifier.style.left = `${positionX}px`
magnifier.style.top = `${positionY}px`
magnifier.style.backgroundPositionX = `${backgroundPositionX}px`
magnifier.style.backgroundPositionY = `${backgroundPositionY}px`
})
},
},
}
</script>
<style scoped lang="less">
.vab-magnifier {
display: flex;
justify-content: center;
align-items: center;
height: 100%;
}
.image-box {
position: relative;
}
.image {
display: block;
max-width: 100%;
height: 100%;
}
.magnifier {
position: absolute;
top: 0;
right: 0;
width: 200px;
height: 200px;
border: 1px solid #ccc;
border-radius: 50%;
pointer-events: none;
visibility: hidden;
z-index: 1;
}
</style>