JavaScript实现简单放大镜效果详解

作者:半夏时间:2026-10-24 15:28:33浏览:176

本文详细介绍如何使用JavaScript实现网页中的简单放大镜效果。通过监听鼠标进入、离开及移动事件,动态控制浮动小盒子的位置与显示区域的内容同步缩放。文章涵盖核心逻辑、边界判断公式及完整HTML/CSS/JS代码示例,帮助开发者快速掌握图片局部放大功能的实现原理。

本文分享了一段使用JavaScript实现简单放大镜效果的具体代码,供读者参考学习。

效果

当鼠标在原图片上移动时,会出现一个黄色小盒子跟随鼠标移动。该黄色小盒子覆盖的区域内容,会在右侧的显示区中以放大的形式呈现。

具体效果如下图所示:

效果

核心思路

1. 当鼠标悬停在图片上时,右侧显示区出现;当鼠标离开小盒子区域时,显示区隐藏。

2. 鼠标在图片上移动时,黄色小盒子需跟随鼠标移动,且鼠标指针应始终位于黄色小盒子的中心位置。

3. 需对黄色小盒子的移动范围进行限制,确保其不会超出原图片的边界。

4. 黄色小盒子在原图片上移动的距离,需按相同比例映射到显示区,使显示区内容同步移动。

5. 当显示区尺寸发生变化,或显示区内的图片内容大小改变时,原图片上的黄色小盒子大小需随之动态调整。

操作

1. 首先获取页面中所需的相关DOM元素。


 // 获取页面上我们需要的元素
        var box1=document.querySelector('.box1')
        var yellow=document.querySelector('.yellow')
        var box2=document.querySelector('#rightbox')
        var screen=rightbox.children[0]

2. 实现鼠标悬停在图片上时显示区域,鼠标离开时隐藏区域的逻辑。


// 鼠标进入和离开图片
        box1.onmouseenter=function(){
            box2.style.display='block'
        }
        box1.onmouseleave=function(){
            box2.style.display='none'
        }

利用鼠标的mouseenter(进入)和mouseleave(离开)事件即可实现,分别控制显示区的显示与隐藏状态。

3. 实现鼠标移动时,黄色小盒子跟随移动,并保持鼠标在小盒子中心。


box1.onmousemove=function(e){
          // 算出小盒子在图片时,自身的中心点
           var x=e.pageX-box1.offsetLeft-yellow.offsetWidth/2
           var y=e.pageY-box1.offsetTop-yellow.offsetHeight/2
         //    给黄色小盒子赋值,让黄色小盒子跟随鼠标移动
         yellow.style.left=x+'px'
           yellow.style.top=y+'px'
        }

1. 使用mousemove事件,鼠标在图片上每移动一点即触发一次,确保实时刷新位置。

2. 计算小盒子在图片上的中心点坐标。

计算公式为:(鼠标在页面中的坐标值,减去图片的偏移距离,再减去小盒子自身宽度或高度的一半)。

此处减去一半是为了保证鼠标指针始终位于黄色小盒子的几何中心。

4. 为黄色小盒子添加边界判断条件,防止其超出图片区域。


// 鼠标在图片上移动触发事件
        box1.onmousemove=function(e){
            // 算出小盒子在图片的中心点
           var x=e.pageX-box1.offsetLeft-yellow.offsetWidth/2
           var y=e.pageY-box1.offsetTop-yellow.offsetHeight/2
 
   // --------------------------------------------------------------------------------
 // 新增部分
        //    判断小盒子是否超出img范围,使黄色小盒子不能超出img范围
           if(x<0){
            //    此时的0不是图片的左侧,而是小盒子在最左边时,小盒子的中心点
               x=0
           }else if(x>box1.offsetWidth-yellow.offsetWidth){
            //    小盒子的X轴中心点大于图片盒子的宽度减去自身宽度时,说明超出,则始终等于图片盒子的宽度减去自身宽度
            x=box1.offsetWidth-yellow.offsetWidth
           }
 
        //    同上
           if(y<0){
               y=0
           }else if(y>box1.offsetHeight-yellow.offsetHeight){
            y=box1.offsetHeight-yellow.offsetHeight
           }
 
   // ---------------------------------------------------------------------------------
        //    给黄色小盒子赋值,让黄色小盒子跟随鼠标移动
           yellow.style.left=x+'px'
           yellow.style.top=y+'px'

1. 判断小盒子左侧是否超出图片范围,使用if(x<0)进行判断。注意此时的0是相对于小盒子中心点计算的。

2. 判断右侧边界:x > box1.offsetWidth - yellow.offsetWidth。

即判断小盒子中心点横坐标是否大于(图片区域宽度减去小盒子宽度)。

判定依据是小盒子宽度,参考点为小盒子中心点,坐标0对应小盒子中心,因已减去小盒子宽度的一半,故右侧边界需减去小盒子宽度的一半乘以2

3. 上下方向的判断逻辑相同,这样黄色小盒子就不会超出图片区域。

5. 黄色小盒子在图片上移动多少距离,显示区域需按同比例移动。


// 通过计算,得出小盒子在图片移动多少,显示区就移动多少的比例
 srceen.style.left=-x/box1.offsetWidth*srceen.offsetWidth+'px'
 srceen.style.top=-y/box1.offsetHeight*srceen.offsetHeight+'px'

显示区域移动的距离取决于小盒子移动的距离。

计算公式为:小盒子移动的值除以图片宽度,再乘以显示区域的宽度。

这样计算出的显示区域移动值,就能与小盒子在图片上的移动保持相同的比例。

6. 当显示区大小改变或显示区内容变化时,图片上的黄色小盒子大小随之改变。


 //  计算黄色小盒子在图片上的大小
           yellow.style.width=box1.offsetWidth/(srceen.offsetWidth/box2.offsetWidth)+'px'
           yellow.style.height=box1.offsetHeight/(srceen.offsetHeight/box2.offsetHeight)+'px'
        }

计算方法为:黄色盒子的宽度 = 图片宽度 / (显示区域内容宽度 / 显示区域框的宽度)。

高度的计算方式同理。

由于该计算是在鼠标移动事件中触发的,因此可以实现实时刷新。

调整


.img2{
            width: 3000px;
            height: 3000px;
            position: absolute;
        }
        #rightbox{
            position: absolute;
            top: 0;
            left: 650px;
            width: 900px;
            height: 900px;
            overflow: hidden;
            display: none;
        }

当需要调整框的大小或放大比例时,只需修改相关CSS样式的宽高属性即可。

内容、CSS、JS整体代码


<!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>Document</title>
    <style>
        *{
            padding: 0;
            margin: 0;
        }
        .img1{
            width: 300px;
            height: 300px;
        }
        .img2{
            width: 3000px;
            height: 3000px;
            position: absolute;
        }
        #rightbox{
            position: absolute;
            top: 0;
            left: 650px;
            width: 900px;
            height: 900px;
            overflow: hidden;
            display: none;
        }
        .yellow{
            background-color: yellow;
            opacity: 0.5;
            width: 100px;
            height: 100px;
            position: absolute;
            top: 0;
            left: 0;
        }
        .box1{
            width: 300px;
            height: 300px;
            position: relative;
            margin-left: 300PX;
        }
    </style>
</head>
<body>
    <div class="box1">
        <img src="./images/1.jpg" alt="" class="img1">
        <div class="yellow"></div>
    </div>
    <div id="rightbox">
        <img src="./images/1.jpg" alt="" class="img2">
    </div>
    <script>
        // 获取页面上我们需要的元素
        var box1=document.querySelector('.box1')
        var yellow=document.querySelector('.yellow')
        var box2=document.querySelector('#rightbox')
        var srceen=rightbox.children[0]
        // 鼠标进入和离开图片
        box1.onmouseenter=function(){
            box2.style.display='block'
        }
        box1.onmouseleave=function(){
            box2.style.display='none'
        }
        // 鼠标在图片上移动触发事件
        box1.onmousemove=function(e){
            // 算出小盒子在图片的中心点
           var x=e.pageX-box1.offsetLeft-yellow.offsetWidth/2
           var y=e.pageY-box1.offsetTop-yellow.offsetHeight/2
 
 
        //    判断小盒子是否超出img范围,使黄色小盒子不能超出img范围
           if(x<0){
            //    此时的0不是图片的左侧,而是小盒子在最左边时,小盒子的中心点
               x=0
           }else if(x>box1.offsetWidth-yellow.offsetWidth){
            //    小盒子的X轴中心点大于图片盒子的宽度减去自身宽度时,说明超出,则始终等于图片盒子的宽度减去自身宽度
            x=box1.offsetWidth-yellow.offsetWidth
           }
 
        //    同上
           if(y<0){
               y=0
           }else if(y>box1.offsetHeight-yellow.offsetHeight){
            y=box1.offsetHeight-yellow.offsetHeight
           }
 
 
        //    给黄色小盒子赋值,让黄色小盒子跟随鼠标移动
           yellow.style.left=x+'px'
           yellow.style.top=y+'px'
 
 
        //    通过计算,得出小盒子在图片移动多少,显示区就移动多少的比例
           srceen.style.left=-x/box1.offsetWidth*srceen.offsetWidth+'px'
           srceen.style.top=-y/box1.offsetHeight*srceen.offsetHeight+'px'
 
        //    计算黄色小盒子在图片上的大小
           yellow.style.width=box1.offsetWidth/(srceen.offsetWidth/box2.offsetWidth)+'px'
           yellow.style.height=box1.offsetHeight/(srceen.offsetHeight/box2.offsetHeight)+'px'
        }
        
    </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

作者最新文章