javascript - 使用 jQuery 的可拖动 div,如何应用元素的单击偏移量?

标签 javascript jquery drag-and-drop

标题可能有点困惑,我会解释一下。我用 jQuery 创建了一个可拖动的 div(不是 jQuery UI 的可拖动)。这是代码:

let target = null;

this.el.on('mousedown', (ev) => {
    target = this.el;
}).on('mouseup', (ev) => {
    target = null;
});

$(document.body).on('mousemove', 'div', (ev) => {
    if(target) {
        this.x = ev.pageX;
        this.y = ev.pageY;

        this.update(); // update css
    }
});

代码非常简单,而且运行良好。问题是,当我从中心或任何地方(而不是左上角)拖动时,元素始终遵循光标的协调,因此元素的左上角始终放置在我拖动的位置。是的,这是正确的,因为这就是我所做的,但我想从拖动的位置移动元素。

这很难解释,所以我会给出更简单的解释。如果(0,0)中有一个盒子(div)并且它的大小为5x5,并且通过单击(0,0)将盒子移动到(10,10),则它的目的地应该是(10,10)。但是,如果我通过将 (2.5,2.5) 拖动到 (10,10) 来移动该框,则目标必须是 (12.5,12.5),而不是 (10,10)。

但在我的代码中,目标是 (10,10),而不是 (12.5,12.5),因为从点击点的偏移量不会应用于翻译。

如果您还是不明白我的问题是什么,请参阅jquery-ui's draggable example 。这正是我想要做的。

我知道问题是什么,但我所有的尝试都不起作用,所以我在这里需要很少的帮助。任何建议将不胜感激!

示例为here !

最佳答案

只需包含 offsetXoffsetY来自 mousedown 的值事件进入您的计算,通过从 pageX 中减去它和pageYmousemove处理程序。

$(document).ready(function() {
  function DraggableElement() {
    this.x = 0;
    this.y = 0;
    this.width = 100;
    this.height = 100;

    this.el = $('<div></div>')
    .addClass('box')
    .appendTo($('#playground'));

    this.update();

    var self = this;
    var target = null;
    var offsetX = 0;
    var offsetY = 0;

    this.el.on('mousedown', function(ev) {
      offsetX = ev.offsetX;
      offsetY = ev.offsetY;
      target = self.el;
    }).on('mouseup', function() {
      target = null;
    });

    $(document.body).on('mousemove', 'div', function(ev) {
      if(target) {
        self.x = ev.pageX - offsetX;
        self.y = ev.pageY - offsetY;
        self.update();
      }
    });
  }
  DraggableElement.prototype.update = function() {
    this.el.css({
      top: this.y + 'px',
      left: this.x + 'px',
      width: this.width + 'px',
      height: this.height + 'px'
    })
  };

  var el = new DraggableElement();
});
* {
  padding: 0;
  margin: 0;
}
#playground {
  background-color: #eee;
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}
.box {
  position: absolute;
  background-color: red;
  cursor: pointer;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="playground"></div>

关于javascript - 使用 jQuery 的可拖动 div,如何应用元素的单击偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39053661/

相关文章:

javascript - 增加单选按钮的大小

javascript - 单击链接以滚动到特定的 div (jquery)

ios - 如何从 iOS 中的水平可滚动项目列表中拖动,并将其拖放到下方的垂直列表中,该列表最多可以接受 4 个项目

Silverlight 工具包 TreeView 拖放

JavaScript 固定数组或对象长度?

javascript - AngularJS 路由页面未显示

javascript无法使用ajax参数发送 '+'字符

javascript - Mixitup jQuery 插件在选择过滤器后重置

javascript - 使用 jquery 对图像进行源代码控制?

javascript - Jquery 一次拖动所有项目