以鼠标位置为中心缩放平移图片(图片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="width: 500px;height: 500px;">
        <img src="http://cdn.iknow.bdimg.com/static/common/pkg/common_z_63fa369.png" style="width: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>
时间: 2024-10-16 15:01:04

以鼠标位置为中心缩放平移图片(图片map)的相关文章

在WPF里面实现以鼠标位置为中心缩放移动图片

原文:在WPF里面实现以鼠标位置为中心缩放移动图片 在以前的文章使用WPF Resource以及Transform等技术实现鼠标控制图片缩放和移动的效果里面,介绍了如何在WPF里面移动和放大缩小图片,程序也支持使用滚轮的方式缩放图片.然而前面文章里介绍的缩放功能只能以图片中心为原点来实现,但是这种功能往往并不是客户想要的,我们看图片的时候,往往都喜欢以鼠标放在图片的焦点为原点进行图片的缩放. 咋看起来,实现这个功能也不是很难, ScaleTransform类里面定义了CenterX和Center

Android 手势检测实战 打造支持缩放平移的图片预览效果(下)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39480503,本文出自:[张鸿洋的博客] 上一篇已经带大家实现了自由的放大缩小图片,简单介绍了下Matrix:具体请参考:Android 手势检测实战 打造支持缩放平移的图片预览效果(上):本篇继续完善我们的ImageView~~ 首先加入放大后的移动~~ 1.自由的进行移动 我们在onTouchEvent里面,加上移动的代码,当然了,必须长或宽大于屏幕才可以移动~~~ @Ov

MFC的OnMouseMove移动位置和OnMouseWheel缩放实现

1. 基本作用 OnMouseMove响应鼠标移动时间 OnMouseWheel响应鼠标中键的滚动 2. 参数说明 afx_msgvoidOnMouseMove(UINTnFlags, CPointpoint); nFlags说明:指示虚拟按键是否按下 ,此参数可以是任何下列值的组合 MK_CONTROL 当CTRL键按下时 MK_LBUTTON 当鼠标左键按下时 MK_MBUTTON 当鼠标中键按下时(滚动不属于按下) MK_RBUTTON 当鼠标右键按下时. MK_SHIFT 当SHIFT按

类似地图的以鼠标为中心缩放图像

以鼠标为中心进行缩放,就像使用百度地图时一样.这种方式比一般的以图像中心点为中心进行缩放更加符合人们的思维惯性. 在网上找了没发现现成的,自己研究了半天,绕来绕去,头晕眼花的.后来得到群友的帮助才解决了这个问题. 下面给出由网友霸天虎兄弟提供的方法改写出来的代码: procedure TForm1.Zoom(I: Single); var NewW, NewH: Integer; NewX, NewY, SX, SY: Integer; A, B: Double; begin FScale :=

Unity UGUI在鼠标位置不同时 图片浮动效果

1 /// <summary> 2 /// 在鼠标位置不同时 图片浮动效果 3 /// </summary> 4 public class TiltWindow : MonoBehaviour 5 { 6 public Vector2 range = new Vector2(5f, 3f); 7 8 Transform mTrans; 9 Quaternion mStart; 10 Vector2 mRot = Vector2.zero; 11 12 void Start () 1

Android绘画板(普通绘画模式和缩放平移绘画模式)

ScaleSketchPadDemo 项目地址: demo apk体验下载 demo2 apk体验下载 用法: 进入项目根目录:https://github.com/ShaunSheep/ScaleSketchPadDemo clone or download   项目到本地, 打开Android Studio->file->new->import new moudle->选中本地的app或aap2 此项目包含两个模块 app1 为普通绘画板 app2 为可所发的绘画板 方便各位A

如何获取鼠标位置

获取鼠标位置,首先需要加载js文件: 然后设置一个div,给定大小: 最后进行具体操作: //首先要先设置一个div,给定大小 <div id="m"></div> //进行操作 <script type="text/javascript"> var x,y,T,L; T=$("#m").offset().top;//div离开左端的距离 L=$("#m").offset().left;//

j-query应用---鼠标悬停不同文字显示不同背景图片banner动画

源代码部分:注意事项:样式表的引用的路径要一致. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta htt

C++获取鼠标位置及全局检测鼠标行为

1.获取鼠标位置(在屏幕的位置)  CPoint m_mouse; GetCursorPos(&m_mouse); 2. 屏幕转化为客户端(控件的相对位置)& 客户端位置转化为屏幕位置 ClientToScreen(this->m_hwnd,m_mouse);  //客户端位置转化为屏幕位置 ScreenToClient(this->m_hwnd,m_mouse) ;  //屏幕转化为客户端 3.获取控件关于在屏幕的位置 CRect  rc GetWindowRect(&