在javascript中单击并拖动功能

时间:2015-08-17 19:51:22

标签: javascript click drag

我正在尝试在JavaScript中创建自己的单击和拖动功能,而不使用jquery。我知道jquery很容易实现,但我更喜欢自己的代码。我有什么,当我点击div,然后移动鼠标,div移动到相同的位置,并没有实现“拖动”外观。我不确定为什么会这样。我希望我的结果能够在图像上移动div,这样我就可以根据div等“裁剪”图像。我的代码是:

index.js

function _(element) {
  return document.getElementById(element);
}

index.css

body {
  background-color: rgb(33, 66, 99);
  margin: 0px;
  padding: 0px;
}

img {
  position:absolute;
}

.selection {
  width: 200px;
  height: 200px;
  background-color: rgb(255,255,255);
  position: absolute;
}

的index.php

<!DOCTYPE html>
<html>
  <head>
    <meta charset = "UTF-8"/>
    <title>Image Cropping</title>
    <link rel = "stylesheet" href = "index.css"/>
    <script src = "index.js"></script>
  </head>
  <body>
    <div class = "image">
      <img src = "model.jpg" alt = "Model" id = "theImage"/>
      <div class = "selection" id = "selection"/>
    </div>
    <script>
      _("theImage").ondragstart = function() { return false; };
      var m = _("selection");
      m.addEventListener("mousedown", mouseDown, false);
      window.addEventListener("mouseup", mouseUp, false);

      function mouseUp() {
        window.removeEventListener("mousemove", move, true);
      }

      function mouseDown(e) {
        window.addEventListener("mousemove", move, true);
      }

      function move(e) {
        var x = m.style.left;
        var y = m.style.top;

        var mouseX = e.clientX;
        var mouseY = e.clientY;

        m.style.top += (mouseX - x) + "px";
        m.style.left += (mouseY - y) + "px";

        // Also tried: m.style.top = (mouseX - x) + "px";
        // And       : m.style.left = (mouseY - y) + "px";
      }
    </script>
  </body>
</html>

1 个答案:

答案 0 :(得分:1)

要添加&#34;拖动外观&#34; ,您可以:

  • 更改光标(cursor: move;
  • 保持光标相对于鼠标的偏移量

对于第二个,我重用了我为我的一个项目创建的函数,为此我实现了拖放移动,不想使用大型库:

/*
 * Returns the given element's offset relative to the document.
 */
function realOffset(elem) {
    var top = 0, left = 0;
    while (elem) {
        top = top + parseInt(elem.offsetTop, 10);
        left = left + parseInt(elem.offsetLeft, 10);
        elem = elem.offsetParent;
    }
    return { top: top, left: left };
}

使用此功能,数学变得简单:

m.style.left = (mouseX - offset.left) + "px";
m.style.top  = (mouseY - offset.top) + "px";

完整演示

&#13;
&#13;
_("theImage").ondragstart = function () { return false; };

var m = _("selection"), offset;
m.addEventListener("mousedown", mouseDown, false);
window.addEventListener("mouseup", mouseUp, false);

function mouseUp() { window.removeEventListener("mousemove", move, true); }

function mouseDown(e) {
    // SAVE THE OFFSET HERE
    offset = {
    	left: e.pageX - realOffset(m).left,
        top: e.pageY - realOffset(m).top
    };
    window.addEventListener("mousemove", move, true);
}

function move(e) {
    // REUSE THE OFFSET HERE
    m.style.left  = (e.pageX - offset.left) + "px";
    m.style.top = (e.pageY - offset.top) + "px";
}

/*
 * Returns the given element's offset relative to the document.
 */
function realOffset(elem) {
    var top = 0, left = 0;
    while (elem) {
        top = top + parseInt(elem.offsetTop, 10);
        left = left + parseInt(elem.offsetLeft, 10);
        elem = elem.offsetParent;
    }
    return { top: top, left: left };
}

function _(element) { return document.getElementById(element); }
&#13;
body {
  background-color: rgb(33, 66, 99);
  margin: 0px;
  padding: 0px;
}

img {
  position:absolute;
}

.selection {
  width: 200px;
  height: 200px;
  background-color: rgba(255,255,255,.5);
  position: absolute;
  cursor: move;
}
&#13;
<div class="image">
    <img src="http://i.imgur.com/vxkljMP.jpg" alt="Model" id="theImage" />
    <div class="selection" id="selection"></div>
</div>
&#13;
&#13;
&#13;