原生JS实现图片的放大镜效果

实现效果 : 将鼠标移动至图片时,在图片一侧显示鼠标周围位置对应的大图.大图随着鼠标的移动相应改变,鼠标移出时大图消失.


思路 :

1.将浏览的图片,放大后的图片,及鼠标周围的方块布局完成;
2.获取事件对象中的鼠标位置(left,top),通过简单的计算,得到鼠标周围方块的时时位置;
3.根据方块与图片的比例和大图所在块的尺寸与大图的比例,计算得到大图的时时位置;
4.添加鼠标移入移出事件.

值得注意的是 : 当触发onmousemove事件时,浏览器会判断鼠标与事件源之间是否存在子元素,若存在将会吧子元素作为事件源,因此导致方块乱跳现象.处理办法为 : 在图片块中加入一个带有定位属性,尺寸与图片块相同的块,将透明度设为0,这样就隔绝了鼠标下的方块,其实相当于事件源也发生了改变.

完整代码如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            *{                              /*全局重置*/
                padding: 0;
                margin: 0;
            }
            #box{
                position: relative;         /*这里也可以使用绝对属性*/
                width: 400px;
                height: 300px;
                margin: 110px;
                background: url(/JS练习/DOM/pics/2.jpg);
                cursor: crosshair;          /*改变鼠标样式*/
            }
            #sbox{
                position: absolute;
                left: 0;
                top: 0;
                width: 200px;
                height: 150px;
                background: thistle;
                opacity: 0.55;              /*设置透明度,符合w3c规范*/
                filter: alpha(opacity=55);  /*低版本IE标准*/
                display: none;              /*设置不可见*/
            }
            #big{
                position: absolute;
                left: 550px;
                top: 100px;
                display: none;
                width: 400px;
                height: 300px;
                border: 1px darkgray solid;
                overflow: hidden;           /*图片溢出隐藏*/
            }
            #rpic{
                position: absolute;
                left: 0;
                top: 0;
            }
            #cover{
                position: absolute;
                left: 0;
                top: 0;
                width: 400px;
                height: 300px;
                background: black;
                opacity: 0;
                filter: alpha(opacity=0);
            }
        </style>
<script type="text/javascript">
    window.onload=function(){                       //加载页面
        var box = document.getElementById("box");   //抓取元素
        var rpic = document.getElementById("rpic");
        var sbox = document.getElementById("sbox");
        var cover = document.getElementById("cover");
        cover.onmousemove=function(e){              //绑定鼠标移动时间
            var ev = window.event || e ;            //事件对象的兼容性写法
            var evx = ev.offsetX ||ev.layerX;       //获得鼠标离相对最近定位属性的左边距
            var evy = ev.offsetY ||ev.layerY;       //获得上边距
            document.title=evx +'|'+evy;            //在title中显示
            var box_x = evx-100;                    //计算小方块的边距
            var box_y = evy-75;
            if (box_x<0) {                          //赋值前判断方块是否出界并处理
                box_x=0;
            }
            if (box_x>200) {
                box_x=200;
            }
            if (box_y<0) {
                box_y=0;
            }
            if (box_y>150) {
                box_y=150;
            }
            big.style.display='block';              //改变属性,使鼠标移入时图片显示
            sbox.style.display='block';
            sbox.style.left=box_x+'px';             //赋值新位置
            sbox.style.top=box_y+'px';
            var rpic_x=-2*box_x;                    //得到大图的时时定位数据
            var rpic_y=-2*box_y;
            rpic.style.left=rpic_x+'px';
            rpic.style.top=rpic_y+'px';

        }
        box.onmouseout=function(){                  //绑定移出事件
            big.style.display='none';
            sbox.style.display='none';
        }
    }
</script>
    </head>
    <body>
        <div id="box">                              <!--图片的div-->
            <div id="sbox"></div>                   <!--方块的div-->
            <div id="cover"></div>                  <!--透明层的div-->
        </div>
        <div id="big" >                             <!--放置大图的div-->
            <img src="/JS练习/DOM/pics/2b.jpg" id='rpic' />  <!--加入图片-->
        </div>
    </body>
</html>

以上内容学习参考了后盾网孙琪峥老师的公共教学资源,侵权删.

欢迎指导交流.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值