javascript实现图片放大镜效果

当我们在电商网站上购买商品时,经常会看到这样一种效果,当我们把鼠标放到我们浏览的商品图片上时,会出现类似放大镜一样的一定区域的放大效果,方便消费者观察商品。今天我对这一技术,进行简单实现,实现图片放大镜效果。
我在代码中进行了代码编写的思路的说明和详细的代码注释,方便读者,请看代码:

<!doctype html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style type="text/css">
            *{margin:0px; padding:0px;}
            .small-box {
                width:300px;
                height:300px;
                margin-left:100px;
                margin-top:100px;
                border:1px #ccc solid;
                cursor:move;
                float:left;
                position:relative;
            }
            .small-box img {
                width:300px;
                height:300px;
            }
            .tool {
                width:150px;
                height:150px;
                background-color:gold;
                opacity:0.6;
                filter:alpha(opacity=60);
                position:absolute;
                left:0px;
                top:0px;
                display:none;
            }
            .tool.active {
                display:block;
            }
            .big-box {
                width:300px;
                height:300px;
                border:1px #ccc solid;
                overflow:hidden;
                float:left;
                margin-top:100px;
                position:relative;
                display:none;
            }
            .big-box.active {
                display:block;
            }
            .big-box img {
                width:600px;
                height:600px;
                position:absolute;
            }
        </style>
    </head>
    <body>
        <div class="small-box" id="smallBox">
            <img src="img1.jpg"/>
            <div class="tool" id="tool"></div>
        </div>
        <div class="big-box" id="bigBox">
            <img src="img1.jpg" id="bigImg" />
        </div>
        <script>
            /*
                第一步:当页面加载完后,获取所要操作的节点对象。
                第二步:为smallBox添加一个鼠标浮动事件
                            当鼠标浮动到smallBox可视区域的时候,显示出小黄盒子tool
                            和右边的大盒子(小黄盒子的放大版)bigBox
                            添加active

                        为smallBox添加一个鼠标离开事件
                            隐藏小黄盒子和右边的大盒子
                            去掉active

                第三步:为smallBox添加一个鼠标移动事件
                        小黄盒子tool要跟着鼠标的坐标移动
                        右边的大盒子里的图片也跟着指定的比例移动
            */
            var smallBox = document.getElementById("smallBox");//小盒子
            var tool = document.getElementById("tool");//小盒子中的黄色区域
            var bigBox = document.getElementById("bigBox");//大盒子
            var bigImg = document.getElementById("bigImg");//放大的图片
            //鼠标进入小盒子区域内,显示黄色区域和大盒子
            smallBox.onmouseenter = function(){
                tool.className = "tool active";
                bigBox.className = "big-box active";
            }
            //鼠标离开小盒子区域,不显示黄色区域和大盒子
            smallBox.onmouseleave = function(){
                tool.className = "tool";
                bigBox.className = "big-box";
            }
            //鼠标在小盒子内移动
            smallBox.onmousemove = function(e){
                var _e = window.event||e;//事件对象
                var x = _e.clientX-this.offsetLeft-tool.offsetWidth/2;//事件对象在小盒子内的横向偏移量
                var y = _e.clientY-this.offsetTop-tool.offsetHeight/2;//竖向偏移量
                if(x<0){
                    x = 0;//当左偏移出小盒子时,设为0
                }
                if(y<0){
                    y = 0;//当上偏移出小盒子时,设为0
                }
                if(x>this.offsetWidth-tool.offsetWidth){
                    x = this.offsetWidth-tool.offsetWidth;//当右偏移出小盒子时,设为小盒子的宽度-黄色放大区域宽度
                }
                if(y>this.offsetHeight-tool.offsetHeight){
                    y = this.offsetHeight-tool.offsetHeight;//当下偏移出小盒子时,设为小盒子的高度-黄色放大区域高度
                }
                tool.style.left = x + "px";//黄色放大区域距离小盒子左偏距
                tool.style.top = y + "px";//黄色放大区域距离小盒子上偏距
                bigImg.style.left = -x*2 + "px";//放大图片移动方向相反,偏移距离加倍
                bigImg.style.top = -y*2 + "px";
            }
        </script>
    </body>
</html>

这里,我并没有对代码中css样式,javascript行为进行和html结构的分离,方便读者阅读和运行。
有读者可能考虑,获取事件对象的偏移距离时直接使用offsetX和offsetY属性,省去了计算,但是笔者在试验时,出现了异常,黄色放大区域并不能稳定的随着鼠标进行移动,笔者认为,当时用offsetX和offsetY时,执行onmousemove会不断地出发onmouseover,而onmouseover会产生事件传播,从而导致在获取offsetX时出现异常。最终,笔者采用上述代码中的方法,能够出现稳定的效果。读者可以自行运行代码,查看效果。这里附上笔者的效果图:
这里写图片描述

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值