DOM之放大镜

放大镜逻辑

仅供参考 还未完善

<!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>放大镜</title>
</head>
<body> 
    <div class="preview_img">
        <img src="s3.png" alt="">
        <div class="mask"></div>
        <div class="big">
            <img src="big.jpg" alt="" class="bigImg">
        </div>
    </div>
    <script>
        window.addEventListener('load', function() {
            var preview_img = document.querySelector('.preview_img');
            var mask = document.querySelector('.mask');
            var big = document.querySelector('.big');
            preview_img.addEventListener('mouseover', fn1);   //添加鼠标再图片上
            function fn1(e) {
                mask.style.display = big.style.display = 'block';    //再图片上将预准备的两个盒子展示
            };
            preview_img.addEventListener('mouseout', fn2);   //鼠标离开将临时的盒子隐藏
            function fn2(e) {
                big.style.display = mask.style.display = 'none';
            };
            preview_img.addEventListener('mousemove', fn3);   //添加鼠标再图片上移动的监听事件
            function fn3(e) {
                var x = e.pageX - this.offsetLeft;     // 获取鼠标再盒子里的坐标
                var y = e.pageY - this.offsetTop;
                var maskX = x - mask.offsetWidth/2;    //为鼠标移动设置到半透明盒子的中心做准备
                var maskY = y - mask.offsetHeight/2;  
                var pX=preview_img.offsetWidth-mask.offsetWidth;  //获得半透明的盒子最大移动的距离
                var pY=preview_img.offsetHeight-mask.offsetHeight;
                maskX <= 0 ? maskX = 0 : (maskX >= pX ? maskX = pX : maskX);  //判断鼠标的坐标,防止半透明的盒子跑出边界
                maskY <= 0 ? maskY = 0 : (maskY >= pY ? maskY = pY : maskY);
                mask.style.left = maskX + 'px';   //设置半透明盒子位置
                mask.style.top = maskY + 'px';
			//右边的放大图的设置
                var bigImg=document.querySelector('.bigImg');   //获取图片
                var bigMax=bigImg.offsetWidth-big.offsetWidth;   //获取这张图片最大的移动距离,用图片的宽度减盒子的宽度
            //因为图片的宽度比盒子的宽度大,盒子设置了溢出隐藏,等会按照比例来移动就可以实现它们所对应的放大效果
                var bigX=maskX*bigMax/pX;  //获取比例,大盒子/小盒子的与大图片/小图片的比例相等,所以可以获得大图片所要移动的距离
                var bigY=maskY*bigMax/pY;
                bigImg.style.left=-bigX+'px';  //设置大图片移动的距离
                bigImg.style.top=-bigY+'px';

				//不写下面这个判断会有一个bug,就是如果鼠标移动的太快,瞬间冲小盒子里移动到大盒子里,
				//根据mouseout事件会隐藏掉这两个盒子,但是不会,我也不知道为什么,然后加一个这样的判断,就可以解决了
                if(x>(this.offsetLeft+this.offsetWidth)){
                    big.style.display = mask.style.display = 'none';
                };
            };
        });
    </script>
</body>
</html>
posted @ 2021-09-02 19:04  拾呓  阅读(32)  评论(0编辑  收藏  举报