如何用js写放大镜

今天带大家来学习学习如何使用js来写一个放大镜,放大镜的代码其实不难,难在对于结构的理解。

结构的理解

这点大家可以参考一下,某宝某东等等购物网站,其中的商品都会放上去就会显示一张大照片。
一般情况下都是
左边一个小盒子,里面一张照片和一个遮盖层 这里面的照片要比盒子的大小小
右边一个大盒子,里面放一张大照片,这个大照片的长宽要比和盒子要大

结构搭建

大家理解了结构的原理的话,搭建起来还是很简单的

js的书写

js的最主要的就是理解最后一步,求大图片在大盒子里面能移动的最大距离

注释我都写在代码里面了大家仔细阅读代码即可
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        .box {
            width: 350px;
            height: 350px;
            margin: 100px;
            border: 1px solid #ccc;
            position: relative;
        }
        
        .big {
            width: 400px;
            height: 400px;
            position: absolute;
            top: 0;
            left: 360px;
            border: 1px solid #ccc;
            overflow: hidden;
            display: none;
        }
        
        .big img {
            position: absolute;
            width: 800px;
        }
        
        .mask {
            width: 175px;
            height: 175px;
            background: rgba(255, 255, 0, 0.4);
            position: absolute;
            top: 0px;
            left: 0px;
            cursor: move;
            display: none;
        }
        
        .small {
            position: relative;
        }
    </style>
</head>

<body>
    <div class="box" id="box">
        <div class="small" id="s_box">
            <img src="images/small.jpg" width="350" alt="" />
            <div class="mask" id="mask"></div>
        </div>
        <div class="big" id="b_box">
            <img src="images/big.jpg" alt="" id="bigimg" />
        </div>
    </div>
    <script>
        //封装函数 直接写zhd即可调用
        function zhd(id) {
            return document.getElementById(id)
        }
        //给小盒子添加事件 使其进入时显示大照片和遮盖层
        zhd('s_box').onmouseenter = function() {
            zhd('mask').style.display = 'block'
            zhd('b_box').style.display = 'block'
        }
        zhd('s_box').onmouseleave = function() {
            zhd('mask').style.display = 'none'
            zhd('b_box').style.display = 'none'
        }

        //让遮盖层跟着鼠标的移动一起移动
        zhd('s_box').onmousemove = function(e) {

            //获取鼠标在盒子中的位置,就是遮盖层的坐标
            var x = e.pageX - zhd('s_box').offsetLeft
            var y = e.pageY - zhd('s_box').offsetTop

            //使鼠标显示在遮盖层的中间
            x -= zhd('mask').offsetWidth
            y -= zhd('mask').offsetHeight

            //如果鼠标往左边的方向离开盒子则把最小值赋值给盒子
            x = x < 0 ? 0 : x
            y = y < 0 ? 0 : y

            //如果鼠标往右边的方向离开盒子则把最大值赋值给盒子
            x = x > zhd('box').offsetWidth - zhd('mask').offsetWidth ? zhd('box').offsetWidth - zhd('mask').offsetWidth : x
            y = y > zhd('box').offsetHeight - zhd('mask').offsetHeight ? zhd('box').offsetHeight - zhd('mask').offsetHeight : y

            //把距离赋值给position实现移动  记得加"px"
            zhd('mask').style.left = x + 'px'
            zhd('mask').style.top = y + 'px'

            //当遮盖层移动的时候,让大图片移动
            //遮盖层能移动的最大距离
            var maskMax = zhd('box').offsetWidth - zhd('mask').offsetWidth

            // 大图片最大能够移动的距离
            var bigImg = zhd('bigimg').offsetWidth - zhd('b_box').offsetWidth

            //x / maskMax = bigMax / bigImg
            bigMaxX = x / maskMax * bigImg
            bigMaxY = y / maskMax * bigImg

            //把距离赋值给position实现移动  记得加"px"
            zhd('bigimg').style.left = -bigMaxX + 'px'
            zhd('bigimg').style.top = -bigMaxY + 'px'
        }
    </script>
</body>

</html>

咋们下期见啦

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值