仿京东淘宝放大镜效果 JavaScript

本文详细介绍了如何使用JavaScript实现京东淘宝商品图片的放大镜效果。主要涉及鼠标经过显示遮挡层和大图片,遮挡层跟随鼠标移动以及大图片同步移动的功能。通过offsetWidth和offsetTop获取元素尺寸和位置,并利用鼠标移动事件调整遮挡层和大图片的位置,确保遮挡层在小图片盒子内正确移动,同时避免超出范围。
摘要由CSDN通过智能技术生成

首先我们分析一下整个案例

1.鼠标经过小图片盒子时黄色的遮挡层和大图片盒子显示,离开时隐藏

2.黄色的遮挡层跟随鼠标功能。

3.移动黄色遮挡层,大图片跟随移动功能。

html骨架和css:

<style>
    .preview_img {
        position: relative;
        height: 400px;
        width: 400px;
        border: 1px solid #ccc;
    }
    
    .mask {
        display: none;
        position: absolute;
        top: 0;
        left: 0;
        width: 300px;
        height: 300px;
        background-color: #FEDE4F;
        opacity: .5;
        border: 1px solid #ccc;
        cursor: move;
    }
    
    .big img {
        position: absolute;
        top: 0;
        left: 0;
    }
    
    .big {
        display: none;
        position: absolute;
        left: 410px;
        top: 0;
        width: 500px;
        height: 500px;
        border: 1px solid #ccc;
        overflow: hidden;
    }
</style>

<body> 
        <div class="preview_img">
            <img src="tp/jd.png" alt="">
            <div class="mask "></div>
            <div class="big "><img src="tp/jd1.png " alt=" " class="bigImg"></div>
        </div>
</body>

 这里黄色遮挡层跟大盒子先隐藏起来display: none

offsetWidth(offsetHight):它返回该元素的像素宽高度,包含内边距(padding)和边框(border),不包含外边距(margin),单位是像素 px

offsetTop (offsetLeft):返回当前元素相对于 offsetParent 节点顶部边界的偏移像素值。

获取元素:

 var preview_img = document.querySelector('.preview_img');
 var mask = document.querySelector('.mask');
 var big = document.querySelector('.big');

当我们鼠标经过离开 preview_img 就显示和隐藏 mask 遮挡层 和 big 大盒子:

preview_img.addEventListener('mouseover', function() {
        mask.style.display = 'block';

        big.style.display = 'block';
    })
preview_img.addEventListener('mouseout', function() {
            mask.style.display = 'none';
            big.style.display = 'none';
        })

黄色的遮挡层跟随鼠标功能分析:
把鼠标坐标给遮挡层不合适,因为遮挡层坐标以父盒子为准。首先是获得鼠标在盒子的坐标,
之后把数值给遮挡层做为left和top值。

用到鼠标移动事件,但是还是在小图片盒子内移动。此时发现遮挡层位置不对,需要再减去盒子自身高度和宽度的一半。

遮挡层不能超出小图片盒子范围。如果小于零,就把坐标设置为0;如果大于遮挡层最大的移动距离,就把坐标设置为最大的移动。(距离遮挡层的最大移动距离:小图片盒子宽度减去遮挡层盒子宽度)

最后移动黄色遮挡层大图片也跟着移动,因为小图片大图片是等比例,所以有:

preview_img.addEventListener('mousemove', function(e) {
        // 先计算出鼠标在盒子内的坐标
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        // console.log(x, y);
        // 减去盒子高度 300的一半 是 150 就是我们mask 的最终 left 和top值了
        // mask 移动的距离
        var maskX = x - mask.offsetWidth / 2;
        var maskY = y - mask.offsetHeight / 2;
        // 如果x 坐标小于了0 就让他停在0 的位置
        // 遮挡层的最大移动距离
        var maskMax = preview_img.offsetWidth - mask.offsetWidth;
        if (maskX <= 0) {
            maskX = 0;
        } else if (maskX >= maskMax) {
            maskX = maskMax;
        }
        if (maskY <= 0) {
            maskY = 0;
        } else if (maskY >= maskMax) {
            maskY = maskMax;
        }
        mask.style.left = maskX + 'px';
        mask.style.top = maskY + 'px';
        // 大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离
        // 大图
        var bigIMg = document.querySelector('.bigImg');
        // 大图片最大移动距离
        var bigMax = bigIMg.offsetWidth - big.offsetWidth;
        // 大图片的移动距离 X Y
        var bigX = maskX * bigMax / maskMax;
        var bigY = maskY * bigMax / maskMax;
        bigIMg.style.left = -bigX + 'px';
        bigIMg.style.top = -bigY + 'px';

    })

最后效果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我该早点睡的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值