[JavaScript] 仿京东放大镜案例

实现效果:

案例分析:
整个案例可以分为三个功能模块
第一个模块:鼠标经过小图片盒子,黄色的遮挡层和大图片盒子显示,离开隐藏2个盒子功能
第二个模块:黄色的遮挡层跟随鼠标功能。
第三个模块:移动黄色遮挡层,大图片跟随移动功能。

代码在文章末尾,为方便理解先给大家对本例进行一下讲解:
第一部分:
在这里插入图片描述
preview_img 代表装手机图片的盒子 ,mask代表用来遮罩的淡黄色盒子,big代表用来装放大效果手机图片的大盒子

那么显而易见第一个模块主要就是做一个显示与隐藏的效果
然后重头戏,第二个模块就来了

重点部分第二个模块解析:
第二个模块主要是做一个黄色的遮挡层跟随鼠标功能。
在这里插入图片描述
把鼠标坐标给遮挡层不合适。因为遮挡层坐标以父盒子为准。
首先是获得鼠标在盒子的坐标。之后把数值给遮挡层做为left和top值。
此时用到鼠标移动事件,但是还是在小图片盒子内移动。
我们发现,遮挡层位置不对,需要再减去盒子自身高度和宽度的一半。
遮挡层不能超出小图片盒子范围。如果小于零,就把坐标设置为0,如果大于遮挡层最大的移动距离,就把坐标设置为最大的移动距离
遮挡层的最大移动距离:小图片盒子宽度减去遮挡层盒子宽度

第三个模块:
移动黄色遮挡层,大图片跟随移动功能。并且求大图片的移动距离公式
在这里插入图片描述
主要最后的式子里是-bigx和-bigy,因为放大镜效果是当我们鼠标在图片上往右走时,big盒子里的大图片实际上是往左走的。所以要加负号

代码示例:

window.addEventListener('load',function() {
    var preview_img = this.document.querySelector('.preview_img');
    var mask = this.document.querySelector('.mask');
    var big = this.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';
    })
    //2.鼠标移动的时候,让黄色的盒子跟着鼠标来走
    preview_img.addEventListener('mousemove',function(e) {
        //先计算出鼠标在盒子内的坐标
        var x = e.pageX - this.offsetLeft;
        var y = e.pageY - this.offsetTop;
        //盒子高度300的一半是150
        //我们mask移动的距离
        var maskx = x - mask.offsetWidth / 2;
        var masky = y - mask.offsetHeight / 2
        //如果x坐标小于0就让他停在0的位置

        //maskmax遮挡层最大移动距离
        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
        var bigx = maskx*bigmax / maskmax;
        //大图片移动距离y
        var bigy = masky*bigmax / maskmax;
        bigimg.style.left = -bigx + 'px';
        bigimg.style.top = -bigy + 'px';
    })
})

你可能感兴趣的:(javascript,javascript,css3,html5,前端)