继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

js实现放大镜详解

慕神8447489
关注TA
已关注
手记 1312
粉丝 174
获赞 957

解决问题流程

分析:
通过现象看本质,原理是什么,涉及到什么东西,之间有什么联系
设计:
根据分析的结果,想想如何去实现,要搭什么样的页面 
实现:
编码调试

原理

    1、鼠标在小图上移动时,通过捕捉鼠标在小图上的位置,定位大图片的响应位置
    2、放大镜的移动方向和大图片的移动方向,横向相反,纵向相反    #### 思路
    1、页面元素
    2、技术点:事件捕获,定位
    onmouseover:会在鼠标指针移动到指定的对象上时发生
    onmouseout:会在鼠标指针移出指定的对象时发生
    onmosuemove:会在鼠标指针移动时发生
    offsetLeft:子元素相对父元素的左边距离
    offsetWidth:盒子的宽度,不报括滚动条
    event.clientX:鼠标的X轴,相对于整个页面
    3、难点:计算
<!doctype html><html><head>
    <meta charset="UTF-8">
    <title>放大镜</title>
    <style>
    * {
        margin: 0;
        padding: 0
    }

    #demo {
        display: block;
        width: 400px;
        height: 255px;
        margin: 50px;
        position: relative;
        border: 1px solid #ccc;
    }

    #small-box {
        position: relative;
        z-index: 1;
    }

    #float-box {
        display: none;
        width: 160px;
        height: 120px;
        position: absolute;
        background: #ffffcc;
        border: 1px solid #ccc;
        filter: alpha(opacity=50);
        opacity: 0.5;
    }

    #mark {
        position: absolute;
        display: block;
        width: 400px;
        height: 255px;
        background-color: #fff;
        filter: alpha(opacity=0);
        opacity: 0;
        z-index: 10;
    }

    #big-box {
        display: none;
        position: absolute;
        top: 0;
        left: 460px;
        width: 400px;
        height: 300px;
        overflow: hidden;
        border: 1px solid #ccc;
        z-index: 1;
        ;
    }

    #big-box img {
        position: absolute;
        z-index: 5
    }    </style>
    <script>
    /*
    解决问题流程
    分析:
    通过现象看本质,原理是什么,涉及到什么东西,之间有什么联系
    设计:
    根据分析的结果,想想如何去实现,要搭什么样的页面 
    实现:
    编码调试
    */
    /*原理
        1、鼠标在小图上移动时,通过捕捉鼠标在小图上的位置,定位大图片的响应位置
        2、放大镜的移动方向和大图片的移动方向,横向相反,纵向相反
    */
    /*
        思路
        1、页面元素
        2、技术点:事件捕获,定位
        onmouseover:会在鼠标指针移动到指定的对象上时发生
        onmouseout:会在鼠标指针移出指定的对象时发生
        onmosuemove:会在鼠标指针移动时发生
        offsetLeft:子元素相对父元素的左边距离
        offsetWidth:盒子的宽度,不报括滚动条
        event.clientX:鼠标的X轴,相对于整个页面
        3、难点:计算    
    */
    //页面加载完毕后执行
    window. = function() {        var objDemo = document.getElementById("demo");        var objSmallBox = document.getElementById("small-box");        var objMark = document.getElementById("mark");        var objFloatBox = document.getElementById("float-box");        var objBigBox = document.getElementById("big-box");        var objBigBoxImage = objBigBox.getElementsByTagName("img")[0];

        objMark.onmouseover = function() {
            objFloatBox.style.display = "block"
            objBigBox.style.display = "block"
        }

        objMark.onmouseout = function() {
            objFloatBox.style.display = "none"
            objBigBox.style.display = "none"
        }        // 在onmousemove里,鼠标移动都会发生改变 
        objMark.onmousemove = function(ev) {            var _event = ev || window.event; //兼容多个浏览器的event参数模式
            // 鼠标的坐标 - demo.offsetLeft - 小图片容器 -放大镜宽度的一半
            var left = _event.clientX - objDemo.offsetLeft - objSmallBox.offsetLeft - objFloatBox.offsetWidth / 2;            var top = _event.clientY - objDemo.offsetTop - objSmallBox.offsetTop - objFloatBox.offsetHeight / 2;            /*这段代码时判断移出小盒子外的逻辑 start*/
            // left移出为负数,我们让他等于0,固定住
            if (left < 0) {
                left = 0;
            } else if (left > (objMark.offsetWidth - objFloatBox.offsetWidth)) {
                left = objMark.offsetWidth - objFloatBox.offsetWidth;
            }            if (top < 0) {
                top = 0;
            } else if (top > (objMark.offsetHeight - objFloatBox.offsetHeight)) {
                top = objMark.offsetHeight - objFloatBox.offsetHeight;

            }            /*这段代码时判断移出小盒子外的逻辑 end*/
            objFloatBox.style.left = left + "px"; //oSmall.offsetLeft的值是相对什么而言
            objFloatBox.style.top = top + "px";            // 设置大图片的
            var percentX = left / (objMark.offsetWidth - objFloatBox.offsetWidth);            var percentY = top / (objMark.offsetHeight - objFloatBox.offsetHeight);

            objBigBoxImage.style.left = -percentX * (objBigBoxImage.offsetWidth - objBigBox.offsetWidth) + "px";
            objBigBoxImage.style.top = -percentY * (objBigBoxImage.offsetHeight - objBigBox.offsetHeight) + "px";
        }
    }    </script></head><body>
    <div id="demo">
        <div id="small-box">
            <div id="mark"></div>
            <div id="float-box"></div>
            <img src="http://img.mukewang.com/537d77fb0001559d04000255.jpg"/>
    </div>
            <div id="big-box">
                <img src="http://img.mukewang.com/537d781b0001c04210240654.jpg"/>
    </div>
            </div></body><!-- ie的兼容问题
1、图片上面是放大镜,放大镜上是鼠标
2、当鼠标在图片上的时候,会触发图片的mouseover事件,放大镜显示
3、放大镜显示,鼠标即在图片上,又在放大镜上,所以触发了图片的mouseout事件,让放大镜隐藏,又触发了mouseover事件,往复多次,就产生了bug
解决方案:
1、在图片和放大镜上放一个遮罩层,出发的是遮罩层事件
2、在ie中无法识别,遮罩层,需要给他加个背景,在进行透明的设置
 --></html>



作者:jia林
链接:https://www.jianshu.com/p/278a3fa52a8d


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP