图片放大镜案例

100 阅读1分钟
<body>
    <style>
        .box {
            width: 200px;
            height: 125px;
            background-image: url("./image/img-41.jpg");
            background-size: 100%;
            background-repeat: no-repeat;
            position: relative;
        }

        .mask {
            width: 30px;
            height: 30px;
            background-color: rgba(255, 220, 0, 0.6);
            display: none;
            position: absolute;
        }
        .imgbox {
            width: 300px;
            height: 300px;
            position: relative;
            left:300px;
            top: -150px;
            /* 超出视口的图片隐藏 */
            overflow: hidden;
        }
        .imgbox img {
            position: absolute;
            width: 1208px;
            height: 750px;
        } 
    </style>
    <div class="box">
        <!-- 小滑块 -->
        <div class="mask"></div>
    </div>
    <div class="imgbox">
        <!-- imgbox宽高和小滑块等比例缩放 -->
        <img src="./image/img-41.jpg" alt="">
    </div>
    <script>
        //一个任何元素求相对于文档中body的坐标,就是相对于页面的距离
        Object.prototype.offset = function () {
            let parent1 = this.offsetParent; //获取上一级定位元素对象
            let x = this.offsetLeft;
            let y = this.offsetTop;
            while (parent1 != null) {
                x += parent1.offsetLeft;
                y += parent1.offsetTop;
                parent1 = parent1.offsetParent;
            }
            return { x, y };
        };
    </script>
    <script>
        let mask = document.querySelector(".mask");
        let box = document.querySelector(".box");
        let img=document.querySelector(".imgbox img");
        //鼠标移入divbox就不隐藏小滑块
        box.onmouseenter = function (event) {
            mask.style.display = "block";
            //让小滑块跟着鼠标移动,则小滑块需要设置定位
            box.onmousemove = function (event) {
                //求出鼠标指针在box盒子的偏移量,就是鼠标离box盒子左上角的坐标
                //求出鼠标离页面(body)的距离减去box盒子离页面(body)的距离
                //求鼠标在某个盒子的距离就用鼠标离页面(body)的距离减去某个盒子离页面(body)的距离 
                let weizhi=box.offset();
                let x1=weizhi.x;
                let y1=weizhi.y;
                //鼠标到页面的距离
                let x2=event.pageX;
                let y2=event.pageY;
                //鼠标离box盒子左上角的坐标
                let x=x2-x1-mask.offsetHeight/2;
                let y=y2-y1-mask.offsetWidth/2;
                //不能让滑块超出box盒子,超出就定位在临界点
                if(y<=0){
                    y=0;
                };
                if(y>=box.offsetHeight-mask.offsetHeight){
                    y=box.offsetHeight-mask.offsetHeight;
                };
                //横轴同理
                if(x<=0){
                    x=0;
                };
                if(x>=box.offsetWidth-mask.offsetWidth){
                    x=box.offsetWidth-mask.offsetWidth;
                };
                //让小滑块中心跟着鼠标指针移动
                mask.style.top=y+"px";
                mask.style.left=x+"px";
                //小滑块先右移动,图片向左移动
                img.style.top=-y*(img.offsetHeight/box.offsetHeight)+"px";
                img.style.left=-x*(img.offsetWidth/box.offsetWidth)+"px";
            };
        };
        //鼠标移除divbox就隐藏小滑块
        box.onmouseleave = function (event) {
            mask.style.display = "none";
            mask.onmousemove = null;
        };
    </script>
</body>

求鼠标在某个盒子的距离就用鼠标离页面(body)的距离减去某个盒子离页面(body)的距离

8011EA442332699BEA9BCA4B1E6D8134.png

DFD6E086DA3626ADA3EDF0AE62530E39.png

2.gif