zoukankan      html  css  js  c++  java
  • 图片放大镜 类淘宝--实现一个页面多张图片都可以进行放大

    这两天从同学那里接手了一个可视化的项目 只剩下少量问题未解决。其中,甲方要求实现一个图片放大镜的功能,同学一开始已经做了。但是后期甲方提出放大镜放的比例有问题,要修改。现在落在我手里了

    修改一下吧。按照惯例,先搜索引擎一波。找到一篇文章,链接如下http://www.cnblogs.com/liu-wang/p/6125314.html#anchor1

    本文章修改了引用文章中的代码实现了自己想要的功能,现在将过程展现出来

    先理解几个概念:关于事件的几个属性:

    event.clientX:响应事件时,鼠标相对于浏览器横向的距离(及从鼠标到浏览器左边的距离)(这里说的是浏览器的有效区域

    event.clientY:响应事件时:鼠标相对于浏览器纵向的距离(及从鼠标到浏览器顶端边的距离)(这里说的是浏览器的有效区域

    event.offsetX: 鼠标响应事件时,鼠标相对于事件源的位置(左上角的坐标)

    event.offsetXY 鼠标响应事件时,鼠标相对于事件源的位置(左上角的坐标)

    元素的属性:

    element.offsetWidth元素的宽度

    element.offsetHeight元素的高度

    下面开始定义css:

    <style type="text/css">
            .div1 {
                position: absolute;
                left: 1%;
                width: 11%;
                border: 1px solid #ccc;
            }
    
            .small_pic img {
                width: 95%;
                height: 95%;
            }
    
            .div1 .small_pic {/*小图*/
                width: 100%;
                height: 160px;
                background: #eee;
                position: relative;
            }
    
            .div1 .float_layer {/*浮动层*/
                width: 50px;
                height: 50px;
                border: 1px solid #000;
                background: #fff;
                filter: alpha(opacity:30);
                opacity: 0.3;
                position: absolute;
                top: 0px;
                left: 0px;
                display: none;
            }
    
            .div1 .mark {
                width: 100%;
                height: 100%;
                position: absolute;
                z-index: 2;
                left: 0px;
                top: 0px;
                background: red;
                filter: alpha(opacity:0);
                opacity: 0;
            }
    
            .div1 .big_pic {/*大图*/
                position: fixed;/*只有设置为fixed时 设置z-index的值才有效果*/
                top: -1px;
                left: 215px;
                width: 500px;
                height: 500px;
                overflow: hidden;
                border: 2px solid #ccc;
                display: none;
                z-index: 100;
            }
    
                .div1 .big_pic img {
                    position: absolute;
                    top: 0px;
                    left: 0px;
                }
              
        </style>

    定义脚本元素

    <script type="text/javascript">
            function getByClass(oParent, sClass) {//通过类名获取class
                var aEle = oParent.getElementsByTagName('*');
                var aTmp = [];
                var i = 0;
    
                for (i = 0; i < aEle.length; i++) {
                    if (aEle[i].className == sClass) {
                        aTmp.push(aEle[i]);
                    }
                }
    
                return aTmp;
            }
    
            window.onload = function () {
                var oDiv = document.getElementsByClassName('div1');
                var x;
                for (var i = 0; i < oDiv.length; i++) {
                   
                    var eve = function(x) {
                        var oMark = getByClass(oDiv[x], 'mark')[0];
                        var oFloat = getByClass(oDiv[x], 'float_layer')[0];
                        var oBig = getByClass(oDiv[x], 'big_pic')[0];
                        var oSmall = getByClass(oDiv[x], 'small_pic')[0];
                        var oImg = oBig.getElementsByTagName('img')[0];
                        oMark.onmouseover = function () {
                            oFloat.style.display = 'block';
                            oBig.style.display = 'block';
    
    
                        };
                        oMark.onmouseout = function () {
                            oFloat.style.display = 'none';
                            oBig.style.display = 'none';
                        };
                        oMark.onmousemove = function (ev) {
                            var oEvent = ev || event;
                            
                            
                            var l = oEvent.offsetX -oFloat.offsetWidth/2;
                            var t = oEvent.offsetY -oFloat.offsetHeight/2 ;
                            var imgWidth = oSmall.offsetWidth;
                            var imgHeight = oSmall.offsetHeight;
                            //判断浮动框是否超过图片边界
                            if (imgWidth - l < oFloat.offsetWidth) {
                                l = imgWidth - oFloat.offsetWidth;
                            }
                            if (l < 0) {
                                l = 0;
                            }
                            if (imgHeight - t < oFloat.offsetHeight) {
                                t = imgHeight - oFloat.offsetHeight;
                            }
                            if (t < 0) {
                                t = 0;
                            }
                            var bigImgHeight = oEvent.clientY - oEvent.offsetY -150;
                            oBig.style.top = bigImgHeight + "px";
    
    
                            oFloat.style.left = l + 'px';
                            oFloat.style.top = t + 'px';
                            var tempX = l / (oMark.offsetWidth - oFloat.offsetWidth);
                            var tempY = t / (oMark.offsetHeight - oFloat.offsetHeight);
    
                            document.title = tempX;
                            oImg.style.left = -tempX * (oImg.offsetWidth - oBig.offsetWidth) + 'px';
                            oImg.style.top = -tempY * (oImg.offsetHeight - oBig.offsetHeight) + 'px';
    
    
                        }
                    }(i);//使用函数的闭包来为页面中的多个图片批量添加事件响应函数
                    
    
                }
            };
    
        </script>

    多个元素,这里只展示一个,因为在项目中我是使用Razor视图引擎循环加载多个图片的

    <div class="div1">
        <div class="small_pic">
          <span class="mark"></span>
          <span class="float_layer"></span>
             <img src="@dbll.GetModel(item1.module_id).str_value" alt="放大图片1">
        </div>
        <div class="big_pic">
          <img src="~/image/@dbll.GetModel(item1.module_id).str_value" alt="放大图片2">
         </div>
    </div>

    完成!!

  • 相关阅读:
    [Oracle] CPU/PSU补丁安装教程
    VMware vSphere 服务器虚拟化之二十 桌面虚拟化之准备虚拟桌面模版
    我是如何写作一本软件+哲学式的书籍的(上)
    设计模式(二)-- 外观模式(Facade)
    PPT资料下载
    Ajax实现xml文件数据插入数据库(一)--- 构建解析xml文件的js库
    Ajax实现xml文件数据插入数据库(二)--- ajax实现与jsp的数据交互。
    iOS-王云鹤 APP首次启动显示用户指导
    控制文件的备份与恢复
    Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
  • 原文地址:https://www.cnblogs.com/c-supreme/p/9354928.html
Copyright © 2011-2022 走看看