JS仿京东放大镜效果

效果图

1.gif


代码演示

window.addEventListener('load', function () {
    // 大盒子
    var preview = document.querySelector('.preview_img');
    // 大图盒子
    var big = document.querySelector('.big');
    // 大图
    var bigImg = document.querySelector('.bigImg');
    // 遮罩层
    var mask = document.querySelector('.mask');

    // 鼠标移入盒子,让遮罩层跟大图显示
    preview.addEventListener('mouseover', function () {
        big.style.display = 'block';
        mask.style.display = 'block';
    })
    // 鼠标移出盒子,让遮罩层跟大图隐藏
    preview.addEventListener('mouseout', function () {
        big.style.display = 'none';
        mask.style.display = 'none';
    })

    // 核心功能
    preview.addEventListener('mousemove', function (e) {
        // 求鼠标在父盒子内的坐标并且使鼠标在遮罩层中间位置
        var x = (e.pageX - this.offsetLeft) - (mask.offsetWidth / 2);
        var y = (e.pageY - this.offsetTop) - (mask.offsetWidth / 2);

        // 用大盒子减去遮罩层盒子的宽度得出最大可移动距离
        var maskMax = this.offsetWidth - mask.offsetWidth;

        // 使遮罩层在大盒子内,不让他出去
        if (x < 0) {
            x = 0;
        } else if (x > maskMax) {
            x = maskMax;
        }

        if (y < 0) {
            y = 0;
        } else if (y > maskMax) {
            y = maskMax;
        }

        mask.style.left = x + 'px';
        mask.style.top = y + 'px';

        // 控制右侧大图移动
        // 思路:遮罩层最大移动距离是100,而大图最大移动距离是300,也就是说让遮罩层移动1px那么大图就要移动3px。
        bigImg.style.left = -x * 3 + 'px'; //这里的结果一定要是负数,因为遮罩层跟大图要相反方向移动才是我们想要的效果
        bigImg.style.top = -y * 3 + 'px';

        
        // 还有一种方法,可以用公式来做:
        // 先用大图的宽度减去大盒子的宽度求出右侧大图最大移动距离
        // var bigMax = bigImg.offsetWidth - big.offsetWidth;

        // // 大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离
        // var bigX = x * bigMax / maskMax;
        // var bigY = y * bigMax / maskMax;
        // bigImg.style.left = -bigX + 'px';
        // bigImg.style.top = -bigY + 'px';
    })
})

源文件
京东放大镜效果.zip

无标签
评论区
头像