美文网首页基础前端
淘宝京东图片放大镜

淘宝京东图片放大镜

作者: CondorHero | 来源:发表于2019-04-18 01:38 被阅读5次

获取淘宝放大图的两种方法:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>放大镜实例!</title>
    <style>
        * {margin: 0;padding: 0;}
        .box {
            width: 300px;
            height: 400px;
            margin: 80px;
            position: relative;
        }
        .box .zoom {
            position: absolute;
            top: 0;
            left: 0;
            width: 160px;
            height: 160px;
            background: url(https://gtms01.alicdn.com/tps/i4/T12pdtXaldXXXXXXXX-2-2.png) repeat  0 0 ;
            cursor: move;
            display: none;
        }
        .box .large {
            position: absolute;
            left: 350px;
            top: 0;
            background: url(images/large.jpg) no-repeat;
            width: 400px;
            height: 400px;
            display: none;
        }
    </style>
</head>
<body>
    <div class="box" id= "box">
        <img src="images/small.jpg" alt="睡衣">
        <div class="zoom" id= "zoom"></div>
        <div class="large" id = "large"></div>
    </div>
    <script>
        var box = document.getElementById("box");
        var zoom = document.getElementById("zoom");
        var large = document.getElementById("large");

        //小图相对于大图的缩放比例
        var rate = 140 / 350;

        //鼠标进入显示zoom和large
        box.onmouseover = function(){
            zoom.style.display = "block";
            large.style.display = "block";
        }
        //鼠标离开隐藏zoom和large
        box.onmouseout = function(){
            zoom.style.display = "none";
            large.style.display = "none";
        }

        //移动事件的监听,移动范围定义在box里
        box.onmousemove = function(event){
            //处理event的兼容
            event = event || window.event;

            //得到页面的卷动值
            var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
            var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
            
            //(getAllLeft(box) - scrollLeft)先计算box的净left值减去卷动值,得到类似box盒子没有父定位盒子和卷动值的offsetleft
            //(getAllTop(box) - scrollTop)先计算box的净top值减去卷动值,得到类似box盒子没有父定位盒子和卷动值的offsettop
            //x , y表示zoom盒子在box盒子里面x,y的距离。
            //最后减去八十,八十是zoom盒子宽的一半,目的是让鼠标在zoom盒子中间
            var x = event.clientX - (getAllLeft(box) - scrollLeft) - 80;
            var y = event.clientY - (getAllTop(box) - scrollTop) - 80 ;

            //此处的if语句目的是让zoom盒子移动时不能超出box盒子的范围
            if(x < 0){
                x = 0;
            }else if(x > 140){
                x = 140;
            }
            if(y < 0){
                y = 0;
            }else if(y > 240){
                y = 240;
            }

            //更改zoom盒子在box盒子里的位置
            zoom.style.left = x + "px";
            zoom.style.top = y + "px";
            //更改大图large盒子里background-position的位置,同时通过rate与zoom的移动距离保持一致
            large.style.backgroundPosition = -x/rate + "px" +" " + -y/rate+ "px";

            //封装函数用来得到对象obj的净top值
            function getAllTop(obj){
                var Alltop = obj.offsetTop;
                var currentobj = obj;
                while(currentobj = currentobj.offsetParent){
                    Alltop += currentobj.offsetTop;
                }
                return Alltop;
            }
            //封装函数用来得到对象obj的净left值
            function getAllLeft(obj){
                var Allleft = obj.offsetLeft;
                var currentobj = obj;
                while(currentobj = currentobj.offsetParent){
                    Allleft += currentobj.offsetLeft;
                }
                return Allleft;
            }
        }
    </script>
</body>
</html>

为了降低耦合性对程序进行改动如下:

  1. 放大镜 zoom 盒子定位中心点的方法由减去八十改为 zoom.offsetWidth/2
  2. if 语句防止放大镜 zoom盒子出线的值改为根据盒子本身宽调整大小。
    140→ box.offsetHeight - zoom.offsetHeight
    240→ box.offsetHeight - zoom.offsetHeight
  3. rate 比率修改,要是想降低 rate 的耦合性,就不能使用背景定位法,必须改用绝对定位方法。使用 overflow: hidden;

修改后的源代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>放大镜实例!</title>
    <style>
        * {margin: 0;padding: 0;}
        .box {
            width: 300px;
            height: 400px;
            margin: 80px;
            position: relative;
        }
        .box .zoom {
            position: absolute;
            top: 0;
            left: 0;
            width: 160px;
            height: 160px;
            background: url(https://gtms01.alicdn.com/tps/i4/T12pdtXaldXXXXXXXX-2-2.png) repeat  0 0 ;
            cursor: move;
            display: none;
        }
        .box .large {
            position: absolute;
            left: 350px;
            top: 0;
            /*background: url(images/large.jpg) no-repeat;*/
            width: 400px;
            height: 400px;
            display: none;
            overflow: hidden;
        }
        .box .large .pic {
            position: absolute;
        }
        
    </style>
</head>
<body>
    <div class="box" id= "box">
        <img src="images/small.jpg" alt="睡衣">
        <div class="zoom" id= "zoom"></div>
        <div class="large" id = "large"><img src="images/large.jpg" alt="" id="pic" class = "pic"></div>
    </div>
    <script>
        var box = document.getElementById("box");
        var zoom = document.getElementById("zoom");
        var large = document.getElementById("large");
        var pic = document.getElementById("pic");

        //小图相对于大图的缩放比例
        // var rate = 140 / 350;

        //鼠标进入显示zoom和large
        box.onmouseover = function(){
            zoom.style.display = "block";
            large.style.display = "block";
        }
        //鼠标离开隐藏zoom和large
        box.onmouseout = function(){
            zoom.style.display = "none";
            large.style.display = "none";
        }

        //移动事件的监听,移动范围定义在box里
        box.onmousemove = function(event){

            //只有触发move事件zoom.offsetWidth和large.offsetWidth才有值。
            var rate = (box.offsetWidth - zoom.offsetWidth) / (pic.offsetWidth - large.offsetWidth);
            //处理event的兼容
            event = event || window.event;

            //得到页面的卷动值
            var scrollLeft = document.body.scrollLeft || document.documentElement.scrollLeft;
            var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
            
            //(getAllLeft(box) - scrollLeft)先计算box的净left值减去卷动值,得到类似box盒子没有父定位盒子和卷动值的offsetleft
            //(getAllTop(box) - scrollTop)先计算box的净top值减去卷动值,得到类似box盒子没有父定位盒子和卷动值的offsettop
            //x , y表示zoom盒子在box盒子里面x,y的距离。
            //最后减去八十,八十是zoom盒子宽的一半,目的是让鼠标在zoom盒子中间
            var x = event.clientX - (getAllLeft(box) - scrollLeft) - zoom.offsetWidth/2;
            var y = event.clientY - (getAllTop(box) - scrollTop) - zoom.offsetWidth/2;

            //此处的if语句目的是让zoom盒子移动时不能超出box盒子的范围
            if(x < 0){
                x = 0;
            }else if(x > box.offsetWidth - zoom.offsetWidth){
                x = box.offsetWidth-zoom.offsetWidth;
            }
            if(y < 0){
                y = 0;
            }else if(y > box.offsetHeight - zoom.offsetHeight){
                y = box.offsetHeight - zoom.offsetHeight;
            }

            //更改zoom盒子在box盒子里的位置
            zoom.style.left = x + "px";
            zoom.style.top = y + "px";
            //更改大图large盒子里background-position的位置,同时通过rate与zoom的移动距离保持一致
            // large.style.backgroundPosition = -x/rate + "px" +" " + -y/rate+ "px";
            pic.style.left = -x/rate + "px";
            pic.style.top = -y/rate+ "px";

            //封装函数用来得到对象obj的净top值
            function getAllTop(obj){
                var Alltop = obj.offsetTop;
                var currentobj = obj;
                while(currentobj = currentobj.offsetParent){
                    Alltop += currentobj.offsetTop;
                }
                return Alltop;
            }
            //封装函数用来得到对象obj的净left值
            function getAllLeft(obj){
                var Allleft = obj.offsetLeft;
                var currentobj = obj;
                while(currentobj = currentobj.offsetParent){
                    Allleft += currentobj.offsetLeft;
                }
                return Allleft;
            }
        }
    </script>
</body>
</html>

相关文章

  • 淘宝京东图片放大镜

    获取淘宝放大图的两种方法: 拿到小图链接:https://img.alicdn.com/imgextra/i4/3...

  • 用js实现图片放大镜效果

    很多电商网站比如:京东、天猫、淘宝都有放大镜效果,每当看到心仪的物品时,鼠标移入图片时,便呈现出放大的效果。在没有...

  • 购物网站首页小析

    小析下几个购物网站的web首页 淘宝 京东 天猫 淘宝 淘宝web 页面整体字体啊图片啊,相较于天猫和京东是比...

  • 放大镜

    一、多种图片放大镜 二、单张图片放大镜

  • 案例:仿京东放大镜

    案例:仿京东放大镜 整个案例可以分为三个功能模块 鼠标经过小图片盒子, 黄色的遮挡层 和 大图片盒子显示,离开隐藏...

  • 29 仿京东放大镜案例

    欢迎关注我的微信公众号:CurryCoder的程序人生 1.仿京东放大镜案例 功能需求:鼠标经过小图片盒子,黄色的...

  • 淘宝京东捡漏资源哪来的,京东拍卖捡漏技巧,淘宝京东怎么拍卖东西?

    淘宝京东捡漏资源哪来的,京东拍卖捡漏技巧,淘宝京东怎么拍卖东西? 京东快递配送也是超级赞的! 淘宝捡漏群资源其实就...

  • 京东放大镜

    话不多说,直接先上效果图 效果图 文件结构图: 1569806498039.png 上代码: CSS HTML JS

  • 京东店群vs淘宝店群

    京东店群vs淘宝店群 1、京东店群vs淘宝店群 笔者【JDwuhuoyuan】 (1)选择类目:京东店...

  • 学习随笔:用jQuery实现图片提示效果

    用jQuery实现图片提示效果:图片的提示效果,我们经常会在网页上见到(比如淘宝,京东),如下图显示的效果: 用J...

网友评论

    本文标题:淘宝京东图片放大镜

    本文链接:https://www.haomeiwen.com/subject/tceawqtx.html