图片放大镜效果

案例分析

//案例分三大块

//1 鼠标经过图片盒子 遮罩盒子 和 放大镜盒子显示 鼠标离开 它们隐藏

//2 遮罩层跟随鼠标移动功能

//3 移动黄色遮罩层 大图片跟随移动

1)第一部分思路

2)第二部分思路

3)第三部分思路

 4)最大移动值的概念 

 代码实现

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>手机详情页!</title>
    <style>
        .preview_img {
            position: relative;
             398px;
            height: 398px;
            border: 1px solid #ccc;
        }
        .mask {
            display: none;
            position: absolute;
            top: 0;
            left: 0;
             300px;
            height: 300px;
            background: #FEDE4F;
            opacity: .5;
            border: 1px solid #ccc;
            cursor: move;
        }
        .big {
            display: none;
            position: absolute;
            left: 410px;
            top: 0;
             500px;
            height: 500px;
            background-color: pink;
            z-index: 999;
            border: 1px solid #ccc;
            overflow: hidden;
        }
        .big img {
            position: absolute;
            top: 0;
            left: 0;
        }
    </style>
</head>
<body>
<div class="preview_img">
    <img src="upload/s3.png" alt="">
    <div class="mask"></div>
    <div class="big">
        <img src="upload/big.jpg" alt="" class="bigImg">
    </div>
</div>

<script>
    var preview_img = document.querySelector('.preview_img');//外面的大盒子
    var mask = document.querySelector('.mask');//黄色阴影盒
    var big = document.querySelector('.big');//最大的盒子

    //1 鼠标移入显示隐藏的2个盒子
    preview_img.addEventListener('mouseover',function () {
        mask.style.display = 'block';
        big.style.display = 'block';
    });
    //2 鼠标松开 隐藏2个盒子
    preview_img.addEventListener('mouseout',function () {
        mask.style.display = 'none';
        big.style.display = 'none';
    });

    //3 鼠标移动的时候 让黄色盒子跟着鼠标走
    preview_img.addEventListener('mousemove',function (e) {
        //3.1 先求出鼠标在盒子内的坐标
        var x = e.pageX - preview_img.offsetLeft;
        var y = e.pageY - preview_img.offsetTop;

        //3.2 把鼠标的坐标 给 遮挡盒子的left 和 top值
        var maskX = x - mask.offsetWidth / 2; //x坐标
        var maskY = y - mask.offsetHeight / 2; //y坐标
        var levelMax = preview_img.offsetWidth - mask.offsetWidth;//遮挡层x轴最大移动距离
        var verticalMax = preview_img.offsetHeight - mask.offsetHeight;//遮挡层y轴最大移动距离

        //3.3 做x和y方向最小最大可移动范围的判断
        // 如果小于0 就等于0 保证移动不出左边
        // 如果大于最大值 就等于最大值 保证移动不出右边
        maskX <= 0 ? maskX = 0 : maskX;
        maskX >= levelMax ? maskX = levelMax : maskX;
        maskY <= 0 ? maskY = 0 : maskY;
        maskY >= verticalMax ? maskY = verticalMax : maskY;
        //3.4 拼接一下 单位px
        mask.style.left = maskX + 'px';
        mask.style.top  = maskY + 'px';

        //3.5 做放大镜效果
        var bigImg = document.querySelector('.bigImg');//拿到大图
        var bigImgMax_x = bigImg.offsetWidth  - big.offsetWidth;//大图x轴的最大移动距离
        var bigImgMax_y = bigImg.offsetHeight - big.offsetHeight;//大图y轴的最大移动距离

        //计算公式:大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离
        //            bigImgX    =    maskX    *    bigImgMax_x   /   levelMax
        var bigImgX = maskX * bigImgMax_x /  levelMax;//大图x轴移动距离
        var bigImgY = maskY * bigImgMax_x / verticalMax;//大图y轴移动距离

        bigImg.style.left = - bigImgX + 'px';
        bigImg.style.top  = - bigImgY + 'px';
    });
</script>
</body>
</html>

用到的图片


原文地址:https://www.cnblogs.com/fuyunlin/p/14458709.html