原生JS 实现放大镜功能

总体三个元素的css样式:

  1. 小图片 (wrap)插入img
  2. 镜片(box)插入背景图
  3. 大图片(big)插入背景图
 <style>
            * {
                margin: 0;
                padding: 0;
            }
            .box {
                display: none;
                position: absolute;
                top: 0;
                left: 0;
                width: 230px;
                height: 230px;
                /* background-color: #0f0; */
    
                background: url(images/dotpng.png)
            }
            #wrap {
                width: 430px;
                height: 430px;
                position: absolute;
                top: 100px;
                left: 100px;
                border: 1px solid #000;
            }
            #big {
                display: none;
                width: 430px;
                height: 430px;
                position: absolute;
                top: 100px;
                left: 550px;
                background: url(images/big.jpg);
                border: 1px solid #000;
            }
        </style>

下面为html

   <div id="wrap">
            <img src="images/small.jpg" >
            <div class="box"></div>
        </div>
    
        <div id="big">
        </div>

下面为script内容

<script>
    // 获取小图片
   var wrap = document.querySelector("#wrap");
    //  镜片
   var box = document.querySelector(".box");
    //  大图片
   var big = document.querySelector("#big");
    // 设置鼠标进入图片区域事件 
   wrap.onmouseenter=function(){
       console.log("鼠标进入了");
    //    鼠标进去后显示镜片与大图片
       box.style.display= "block";
       big.style.display = "block";

        // 最后看这一步   小图片的clientWidth 减去 镜片的clientWidth  除以  800 减去 大图片的clientWidth 算出比例   (这个800是找的图片是800x800的)
        var r = (wrap.clientWidth - box.clientWidth) / (800 - big.clientWidth) 

        // 设置鼠标在图片区域移动事件(绑定在document上)
        document.onmousemove=function(e){
        // 获取鼠标在页面(整个页面,包括滚动条下面需要拖动的的页面)的坐标
        var mouseX = e.pageX;
        var mouseY = e.pageY;

        // 获取元素离视口的距离(获取图片距离视口有多少距离,需用到函数)
        var elementX = offset(wrap).left;
        var elementY = offset(wrap).top;

        // 求出镜片元素最终移动值(鼠标进入页面的X/Y坐标 减去 图片到视口上边/下边的距离 减去 镜片元素宽度/高度的一半 减去 图片的上/下边框 )
        var zz_X = mouseX - elementX - box.clientWidth/2 - wrap.clientLeft;
        var zz_Y = mouseY - elementY - box.clientHeight/2 - wrap.clientTop;



        // 设置镜片移动范围
        // 判断zz_X数值如果小于0 那个元素就出超出父元素的范围(左边超出)        
        if(zz_X < 0 ){
            // 如果镜片移动值小于0  就让他强制等于 0 
            zz_X = 0 ;
        // 判断如果zz_X数值如果大于  父元素的clientWidth距离  减去 镜片元素的chlientWidth距离就会超出父元素范围(右边超出)
        }else if(zz_X > wrap.clientWidth-box.clientWidth){
       //  就让他强制等于  父元素的clientWidth距离  减去 镜片元素的chlientWidth距离
            zz_X = wrap.clientWidth - box.clientWidth;
        }



        // 判断zz_y数值如果小于0 那个元素就出超出父元素的范围(上边超出)        
        if(zz_Y < 0 ){
        //  如果小于0就让他强制等于 0  相当于让镜片的top值强制设置为 0 
            zz_Y = 0 ;
        // 判断如果zz_y数值如果大于  父元素的clientHeight距离  减去 镜片元素的clientHeight距离就会超出父元素范围(下边超出)
        }else if(zz_Y > wrap.clientHeight - box.clientHeight){
        //  就让他强制等于  父元素的clientWidth距离  减去 镜片元素的chlientWidth距离             
            zz_Y = wrap.clientHeight - box.clientHeight;
        }



        // 最终镜片移动值 赋值给镜片元素box的left/top值
        box.style.left = zz_X + "px";
        box.style.top = zz_Y + "px";

        // 大图片的背景图片定位值 // 设置镜片移动时右边大图片显示的内容(改变定位值)//  动态的移动值 除以 算出的比例
        big.style.backgroundPositionX = -zz_X / r + "px";
        big.style.backgroundPositionY = -zz_Y / r + "PX";
       }
   }
//    鼠标移出事件
   wrap.onmouseleave=function(){
       console.log("鼠标移出了");
    //    移除后镜片与大图片设置为隐藏
       box.style.display = "none";
       big.style.display = "none";
   }

    


// 计算某个元素到视口的距离  
   function offset(dom) {
        // 返回一个对象
        var obj = {
            left: 0,
            top: 0
        }
        // 先让这个对象加上 dom的自己得到定位父元素的距离
        obj.left = dom.offsetLeft;
        obj.top = dom.offsetTop;
        // 判定浏览器是否是IE8 
        var isIE8 = window.navigator.userAgent.indexOf("MSIE 8") != -1;


        // 循环往上走 累加每一个offsetParent的offsetLeft和clientLeft 
        // 加每一个offsetParent的offsetTop和clientTop
        var offsetParent = dom.offsetParent;
        while (offsetParent != document.body) {
            if (isIE8) {
                obj.left += offsetParent.offsetLeft;
                obj.top += offsetParent.offsetTop;
            } else {
                obj.left += offsetParent.offsetLeft + offsetParent.clientLeft;
                obj.top += offsetParent.offsetTop + offsetParent.clientTop;
            }
            offsetParent = offsetParent.offsetParent;
        }
        return obj;
    }

</script>  

最终放大镜就完成了如下
在这里插入图片描述

如有不对请指正

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的原生JS实现放大镜功能的代码: HTML: ``` <div class="container"> <img src="image.jpg" alt="product image" id="product-image"> <div class="magnifier"></div> </div> ``` CSS: ``` .container { position: relative; } .magnifier { position: absolute; width: 200px; height: 200px; border: 1px solid #ccc; display: none; pointer-events: none; background-repeat: no-repeat; background-size: 400px 400px; background-position: 0 0; } ``` JS: ``` const container = document.querySelector('.container'); const magnifier = document.querySelector('.magnifier'); const productImage = document.querySelector('#product-image'); container.addEventListener('mousemove', e => { const containerRect = container.getBoundingClientRect(); const x = e.clientX - containerRect.left; const y = e.clientY - containerRect.top; const magnifierSize = 200; const imageWidth = productImage.width; const imageHeight = productImage.height; const ratioX = imageWidth / containerRect.width; const ratioY = imageHeight / containerRect.height; const bgPosX = -x * ratioX + magnifierSize / 2; const bgPosY = -y * ratioY + magnifierSize / 2; magnifier.style.display = 'block'; magnifier.style.left = `${x - magnifierSize / 2}px`; magnifier.style.top = `${y - magnifierSize / 2}px`; magnifier.style.backgroundImage = `url(${productImage.src})`; magnifier.style.backgroundPosition = `${bgPosX}px ${bgPosY}px`; }); container.addEventListener('mouseleave', () => { magnifier.style.display = 'none'; }); ``` 这段代码会在鼠标移动到图片上时,显示一个放大镜,并在放大镜内显示鼠标所在位置的图片放大后的部分。当鼠标移开图片时,放大镜会隐藏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值