放大镜

案例图片

成品

案例代码

		* {
            padding: 0;
            margin: 0;
        }

        .box {
            position: relative;
            width: 1200px;
            margin: 100px auto;
        }

        .small_box {
            width: 450px;
            height: 450px;
            border: 1px solid #000;
            cursor: move;
        }

        .max_box {
            position: absolute;
            display: none;
            top: 0px;
            left: 452px;
            width: 540px;
            height: 540px;
            background-color: #ccc;
            border: 1px solid #000;
            overflow: hidden;
        }

        .mask {
            position: absolute;
            display: none;
            top: 0;
            left: 0;
            width: 300px;
            height: 300px;
            background: rgba(0, 0, 0, .2);
        }

        .big_img {
            position: absolute;
            top: 0;
            left: 0;
        }
	<div class="box">
        <div class="small_box">
            <img src="img/small.jpg" alt="">
            <div class="mask"></div>
        </div>
        <div class="max_box">
            <img src="img/big.jpg" alt="" class="big_img">
        </div>
    </div>
		// 获取元素
        var box = document.querySelector('.box')
        var min_box = document.querySelector('.small_box');
        var mask = document.querySelector('.mask');
        var max_box = document.querySelector('.max_box');
        var max_img = max_box.querySelector('img');

        // 鼠标移入min_box 显示出mask、max_box
        min_box.addEventListener('mouseover', function (e) {
            mask.style.display = 'block';
            max_box.style.display = 'block';
        })

        // 鼠标移出min_box 隐藏mask、max_box
        min_box.addEventListener('mouseout', function () {
            mask.style.display = '';
            max_box.style.display = '';
        })

        min_box.addEventListener('mousemove', function (e) {
            // 获取鼠标在盒子里的坐标
            var x = e.pageX - box.offsetLeft;
            var y = e.pageY - box.offsetTop;
            // console.log(x, y);

            // 让mask 跟着鼠标移动
            var maskY = y - mask.offsetHeight / 2;
            var maskX = x - mask.offsetWidth / 2;

            // mask 移动范围
            var maskX_max = min_box.offsetWidth - mask.offsetWidth;
            var maskY_max = min_box.offsetHeight - mask.offsetHeight;

            if (maskX <= 0) {
                maskX = 0;
            } else if (maskX >= maskX_max) {
                maskX = maskX_max;
            }

            if (maskY <= 0) {
                maskY = 0;
            } else if (maskY >= maskY_max) {
                maskY = maskY_max;
            }

            mask.style.left = maskX + 'px';
            mask.style.top = maskY + 'px';

            // 大图片跟着移动
            var max_imgX = max_img.offsetWidth - max_box.offsetWidth;
            var max_imgY = max_img.offsetHeight - max_box.offsetHeight;

            // 大图片的移动距离 = 遮挡层移动距离 * 大图片最大移动距离 / 遮挡层的最大移动距离
            max_img.style.left = -maskX * max_imgX / maskX_max + 'px';
            max_img.style.top = -maskY * max_imgY / maskY_max + 'px';
        })

案例图片

小图片
大图片

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值