zoukankan      html  css  js  c++  java
  • 以鼠标位置为中心缩放平移图片(图片map)

            最近一个项目使用一张图片实现地图类似的效果,即图片以鼠标位置为中心缩放、平移;通过度娘搜索找到几个版本,最终下面这个版本真正实现该功能;具体代码是网上Copy的,若有版权或其他问题,请联系我予以处理,有不当之处,请原作者原谅。

    <!doctype html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>移动缩放图片</title>
    </head>
    <body>
    <style>
        #log{position: fixed;top: 0;right: 0;width: 200px;background: #eee;color: #333;padding: 5px;}
    </style>
    <div id="log"></div>
    <script>
        function log(){
            document.getElementById("log").innerHTML = document.getElementById("log").innerHTML+"<br>"+[].join.call(arguments,",")
        }
        </script>
    
        <style>
    *{margin: 0;padding: 0;}
    body{background: #333;}
    #box{position: relative;overflow: hidden;margin: 50px auto;border: 1px solid #fff;background: #fff;}
    #box img{position: absolute;}
        </style>
        <div id="box" style=" 500px;height: 500px;">
            <img src="http://cdn.iknow.bdimg.com/static/common/pkg/common_z_63fa369.png" style="827px; height:262px;" alt="">
        </div>
    
        <script>
        evnt = function(event) {
    
        var evn = event,
            eventDoc, doc, body,
            button = evn.button
            evn.target = evn.target || evn.srcElement;
    
        // Calculate pageX/Y if missing and clientX/Y available
        if (evn.pageX == null && evn.clientX != null) {
            eventDoc = evn.target.ownerDocument || document;
            doc = eventDoc.documentElement;
            body = eventDoc.body;
    
            evn.pageX = evn.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
            evn.pageY = evn.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc && doc.clientTop || body && body.clientTop || 0);
        }
    
        if (!evn.preventDefault) {
            evn.preventDefault = function() {
                this.returnValue = false;
            }
        }
    
        if (!evn.stopPropagation) {
            evn.stopPropagation = function() {
                this.cancelBubble = true;
            }
        }
    
        if (evn.which == null && (evn.charCode != null || evn.keyCode != null)) {
            evn.which = evn.charCode != null ? evn.charCode : evn.keyCode;
        }
    
        // Add which for click: 1 === left; 2 === middle; 3 === right
        // Note: button is not normalized, so don't use it
        if (!evn.which && button !== undefined) {
            evn.which = (button & 1 ? 1 : (button & 2 ? 3 : (button & 4 ? 2 : 0)));
        }
        return evn
    };
    
    function getOffset(o) {
        var left = 0,
            top = 0;
        while (o != null && o != document.body) {
            top += o.offsetTop;
            left += o.offsetLeft;
            o = o.offsetParent;
        }
        return {
            left: left,
            top: top
        };
    }
    
    ;
    (function() {
        var d = document,
            bind = function(b, a, c) {
                b.addEventListener ? b.addEventListener(a, function(event) {
                    c.call(b, evnt(event));
                }, false) : b.attachEvent("on" + a, function(event) {
                    c.call(b, evnt(window.event));
                });
            },
            on = function(b, o) {
                for (var a in o) {
                    bind(b, a, o[a]);
                }
            };
    
        var isRun,
            startX,
            startY,
            endX,
            endY,
            rX,
            rY,
            bgX = 0,
            bgY = 0,
            $b = d.getElementById("box");
        ww = parseInt($b.style.width),
        wh = parseInt($b.style.height),
        i = $b.getElementsByTagName('img')[0],
        img = i.style,
        imgw = parseInt(img.width),
        imgh = parseInt(img.height),
        scaleSize = 1;
    
        function rs() {
            var w, h;
            //以完全显示图片为基准,如果改为>,则为以铺满屏幕为基准
            if (ww / wh < imgw / imgh) {
                w = ww;
                h = imgh * ww / imgw;
                bgX = 0;
                bgY = -(h - wh) / 2;
                scaleSize = ww / imgw; //初始比率
            } else {
                w = imgw * wh / imgh;
                h = wh;
                bgX = -(w - ww) / 2;
                bgY = 0;
                scaleSize = wh / imgh;
            }
            img.width = w + "px";
            img.height = h + "px";
            img.left = bgX + "px";
            img.top = bgY + "px";
        }
        rs();
        /* Init */
        on(d, {
            "mousedown": function(e) {
    
                //按中建快速还原大小
                if (e.which === 2) {
                    rs();
                }
                if (e.which === 1 && e.target && (e.target === i || e.target === $b)) {
                    isRun = true;
                    startX = e.pageX;
                    startY = e.pageY;
    
                    e.preventDefault();
                }
            },
            "mouseup": function(e) {
                if (e.which !== 1) {
                    return;
                }
    
                img.cursor = "default";
                isRun = false;
                 if(typeof(rX)!=="undefined")//这个判断原作没有,去掉该判断会出现单击后,放大缩小不是鼠标位置的情况;处理加载后就点击的情况;即rX是undefined          
                {
                    bgX = rX;
                    bgY = rY;
                }
    
                e.preventDefault();
            },
            "mousemove": function(e) {
                //
                if (e.which !== 1) {
                    return;
                }
                if (isRun) {
                    e.preventDefault();
                    img.cursor = "move";
                    endX = e.pageX;
                    endY = e.pageY;
                    rX = bgX + endX - startX;
                    rY = bgY + endY - startY;
    
                    img.left = rX + "px";
                    img.top = rY + "px";
                }
            },
            "mousewheel": function(e) {
                //以鼠标为中心缩放,同时进行位置调整
                var deltaY = 0;
                var x = e.pageX;
                var y = e.pageY;
    
                e.preventDefault();
    
                if (e.target && (e.target === i)) {
    
                    var l = getOffset($b);
                    x = x - l.left;
                    y = y - l.top;
    
                    var p = (e.wheelDelta) / 1200;
                    var ns = scaleSize;
                    ns += p;
                    ns = ns < 0.1 ? 0.1 : (ns > 5 ? 5 : ns); //可以缩小到0.1,放大到5倍
    
                    //计算位置,以鼠标所在位置为中心
                    //以每个点的x、y位置,计算其相对于图片的位置,再计算其相对放大后的图片的位置
                    bgX = bgX - (x - bgX) * (ns - scaleSize) / (scaleSize);
                    bgY = bgY - (y - bgY) * (ns - scaleSize) / (scaleSize);
                    scaleSize = ns; //更新倍率
    
                    img.width = imgw * ns + "px";
                    img.height = imgh * ns + "px";
                    img.top = bgY + "px";
                    img.left = bgX + "px";
                }
            }
        });
    
    })();
        </script>
    </body>
    </html>



     

  • 相关阅读:
    KMP算法之查找模式串在源串中出现的次数
    快速排序算法分析
    排序算法的稳定性分析(转)
    动态规划之最优二叉搜索树(算法导论)
    动态规划之最长公共子序列(算法导论)
    动态规划原理(算法导论)
    动态规划之钢条切割(算法导论)
    动态规划之矩阵链相乘问题(算法导论)
    HNU 13064 Cuckoo for Hashing解题报告 North America
    HNU 13081 Even Up Solitaire解题报告
  • 原文地址:https://www.cnblogs.com/zhutao1015/p/4108242.html
Copyright © 2011-2022 走看看