vue3写法,放大镜的实现

<template>
        <div class="w-[100%] h-[100%] max-w-[500px] max-h-[500px] relative" @mouseenter="show" @mouseleave="hide" @mousemove="move" ref="left">
            <img 
                class="transition-transform duration-100  w-full h-full"
                src="/text/12.jpg"
                ref="minImage"
            />
            <span v-show="isshow" class="w-[250px] h-[250px] absolute left-0 top-0 cursor-zoom-in border-2 border-white shadow-lg" ref="mask"></span>
        </div>

        <!-- 放大图片容器 -->
        <div 
            v-show="isshow"
            class="absolute w-full h-full  max-w-[500px] max-h-[500px] border border-gray-200 overflow-hidden"
            ref="right"
        >
            <img
                class="absolute   max-w-[200%] h-[200%] left-0 top-0"
                src="/text/12.jpg"
                ref="bigImage"
            />
        </div>
</template>

<script setup>
import { ref } from 'vue'

const isshow = ref(false)
// 左边的容器
const left=ref(null)
const right=ref(null)
const mask=ref(null)
const bigImage=ref(null)

const show = () => { isshow.value = true }
const hide = () => { isshow.value = false }

const move = (e) => { 
    // 计算遮罩层在容器内的绝对位置(中心对齐,减去自身一半尺寸)
    let x = e.clientX - left.value.offsetLeft - mask.value.offsetWidth / 2
    let y = e.clientY - left.value.offsetTop - mask.value.offsetHeight / 2
    if(x<0){
        x=0
    }
    if(y<0){
        y=0
    }
    if(x>250){
        x=250
    }
    if(y>250){
        y=250
    }
    mask.value.style.left = x + 'px'
    mask.value.style.top = y + 'px'
    let imageLeft = x * (bigImage.value.width-500)/(500-250)
    let imageTop = y * (bigImage.value.height-500)/(500-250)
    bigImage.value.style.left = -imageLeft + 'px'
    bigImage.value.style.top = -imageTop + 'px'

}
</script>

<style lang="scss" scoped>
</style>

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值