本文实例为大家分享了Vue3实现图片放大镜效果的具体代码,供大家参考,具体内容如下
实现效果
代码
<template>
<div class="goods-image">
<!-- 大图容器 -->
<div
class="large"
:style="[
{
backgroundImage: `url(${imageList[curId]})`,
backgroundPositionX: position.backgroundPositionX,
backgroundPositionY: position.backgroundPositionY,
},
]"
v-if="isShow"
></div>
<div class="middle" ref="target">
<img :src="imageList[curId]" alt="" />
<!-- 蒙层容器 -->
<div class="layer" :style="{ left: left + 'px', top: top + 'px' }" v-if="isShow"></div>
</div>
<ul class="small">
<li
v-for="(img, i) in imageList"
:key="i"
@mouseenter="curId = i"
:class="{ active: curId === i }"
>
<img :src="img" alt="" />
</li>
</ul>
</div>
</template>
<script>
import { reactive, ref, watch } from 'vue'
import { useMouseInElement } from '@vueuse/core'
export default {
name: 'GoodsImage',
props: {
imageList: {
type: Array,
default: () => {
return []
}
}
},
setup () {
const curId = ref(0)
const target = ref(null)
// elementX: 鼠标距离左侧的偏移值
// elementY:表表距离顶部的偏移值
// isOutside: 是否在容器外部 外部true 内部 false
const { elementX, elementY, isOutside } = useMouseInElement(target)
const left = ref(0) // 滑块距离左侧的距离
const top = ref(0) // 滑块距离顶部的距离
const isShow = ref(false) // 显示大图和蒙层图的显示和隐藏
const position = reactive({ // 大图显示的位置,默认是0
backgroundPositionX: 0,
backgroundPositionY: 0
})
watch(
// 监听的对象
[elementX, elementY, isOutside],
() => {
if (elementX.value < 100) {
// 左侧最小距离
left.value = 0
}
if (elementX.value > 300) {
left.value = 200
}
if (elementX.value > 100 && elementX.value < 300) {
left.value = elementX.value - 100
}
if (elementY.value < 100) {
// 左侧最小距离
top.value = 0
}
if (elementY.value > 300) {
top.value = 200
}
if (elementY.value > 100 && elementY.value < 300) {
top.value = elementY.value - 100
}
// 控制背景图移动
// 1. 蒙层移动的方向和大图背景移动的方向是相反的
// 2. 蒙层和大图由于面积大小是1:2的 蒙层每移动一个像素 大图移动俩个像素
// backgrondPosition:x,y;
position.backgroundPositionX = -left.value * 2 + 'px'
position.backgroundPositionY = -top.value * 2 + 'px'
// 当isOutside的值发生变化的时候,立刻取反赋值给isShow
// isOutside: 是否在容器外部 外部true 内部 false
isShow.value = !isOutside.value
},
{}
)
return {
curId,
target,
left,
top,
position,
isShow
}
}
}
</script>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。