天天看点

js 图片放大镜效果

js 图片放大镜效果
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
      .preview_img {
    position: relative;
    width: 332px;
    height: 332px;
}

.product_images {
    width: 332px;
    height: 332px;
    border: 1px solid #dddddd;
}

.mask {
    display: none;
    position: absolute;
    top: 0;
    left: 0;
    width: 200px;
    height: 200px;
    background: #FEDE4F;
    opacity: .5;
    border: 1px solid #ccc;
    cursor: move;
}

.big {
    display: none;
    position: absolute;
    left: 410px;
    top: 0;
    width: 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="/images/2.jpg" alt="" class="product_images">
            <!-- 遮挡层 -->
            <div class="mask"></div>
            <!-- 放大版的图片  此处最好有个放大高清图-->
            <div class="big">
                <img src="/images/2.jpg" alt="" class="bigImg" style="width: 750px;height: 750px;">
            </div>
        </div>
    <script>
        window.addEventListener('load', function () {
            // 放大镜效果
            // 1.鼠标经过区域 遮挡层和大图片显示和隐藏
            // 2.鼠标移动 遮挡层跟着移动 主要是获得鼠标移动时不断变化的位置赋值给遮挡层
            // 3.遮挡层与大图片位置与之对应 按比例移动


            // 1.鼠标经过preview_img时 遮挡层和大图片显示 和 隐藏
            // 获取事件源
            var preview_img = this.document.querySelector('.preview_img');
            var mask = this.document.querySelector('.mask');
            var big = this.document.querySelector('.big');
            // 注册事件
            preview_img.addEventListener('mouseover', function () {
                mask.style.display = 'block';
                big.style.display = 'block';
            })
            preview_img.addEventListener('mouseleave', function () {
                mask.style.display = 'none';
                big.style.display = 'none';
            })
            // 2.鼠标移动 更新遮挡层的位置
            // 给区域添加侦听器,只要鼠标一移动 就更新遮挡层的位置  切记:只有开启定位的盒子 才可以使用left和top值
            preview_img.addEventListener('mousemove', function (e) {

                // (1) 经过时 就要获得鼠标在preview_img里面的坐标
                var mouseX = e.pageX - preview_img.offsetLeft;
                var mouseY = e.pageY - preview_img.offsetTop;
                // console.log(mouseX, mouseY); 
                // (2) 更新遮挡层的位置 
                // a.如果直接赋值的话:鼠标是在遮挡层的左上角,为了美观鼠标应该在遮挡层的中心位置 - 盒子高\宽的一半
                var maskX = mouseX - mask.offsetWidth / 2;
                var maskY = mouseY - mask.offsetHeight / 2;
                // b.此时还会出现一个问题:遮挡层在preview_img区域之外也出现了  我们只需要在区域内显示 区域外不显示
                // 所以 我们需要一个判断条件 left的最大值(previwe_img.width-mask.width)和最小值(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';
                // console.log(mask.style.left, mask.style.top);

                // 3.大图片跟随遮挡层的移动而移动 
                // 有一个核心算法: 遮挡层移动位置/遮挡层最大移动位置 = 大图片移动位置/大图片最大移动位置
                // 遮挡层移动位置:maskX maxkY; 遮挡层最大移动位置:maskMax 
                // 大图片移动位置: bigX bigY; 大图片最大移动位置:bigMax
                // (1)bigMax = 图片尺寸-装图片盒子的尺寸  图片比盒子大
                var bigImg = document.querySelector('.bigImg');
                var bigMax = bigImg.offsetWidth - big.offsetWidth;
                // (2) bigX = 遮挡层移动位置 * 大图片最大移动位置 / 遮挡层最大移动位置
                var bigX = maskX * bigMax / maskMax;
                var bigY = maskY * bigMax / maskMax;
                // (3) 大图片的left和top值: big系列的值  的负值
                bigImg.style.left = -bigX + 'px';
                bigImg.style.top = -bigY + 'px';
            })
        })
    </script>

</body>

</html>
           

转自:https://blog.csdn.net/qq_42383764/article/details/104921449