Droppable元素位置计算不正确

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Droppable元素位置计算不正确相关的知识,希望对你有一定的参考价值。

我有一个类的表:.screens,其中的单元格可以放置。我可以在列表中拖动任何项目。我还试图计算用户放置项目的位置,使其显示在正确的位置。但是有一个问题,如果用户试图将项目放在除第一个单元格之外的任何单元格中,则丢弃位置计算不正确。这是我的计算代码:

var pos = ui.draggable.offset(), dPos = $(this).offset();
var droppedTop = ui.position.top - $(this).offset().top + $('#mainContainer').scrollTop();
var droppedLeft = ui.position.left - $(this).offset().left + $('#mainContainer').scrollLeft();

然后我将这些顶部和左侧位置分配给被删除的项目。如果没有表,这个代码可以完美地工作,但只有div。这是小提琴:https://jsfiddle.net/vaxobasilidze/moafzcx8/2/将项目拖放到表中以查看问题。任何想法如何解决这一问题?

答案

你有点不清楚你要做的整体事情。我建议使用jQuery UI .position()来帮助将项目放在单元格中。在你的drop中考虑这个:

    var $dz = $(this);
    var fCount = $dz.find(".foo").length;
    var $item = ui.draggable.appendTo($dz);
    var padTop = 5;
    if (fCount === 0) {
      $item.position({
        my: "center top",
        at: "center top+" + padTop,
        of: $dz
      });
    } else {
      var jump = fCount * 42;
      $item.position({
        my: "center top",
        at: "center top+" + (jump + padTop),
        of: $dz
      });
    }

这会附加项目并将其定位在单元格内。好处是它可以容易地相对于父单元定位项目而不必处理偏移等。

工作示例:https://jsfiddle.net/Twisty/bwpcph7z/4/

另一答案

我自己找到了解决方案。有点棘手,但工作正常。关键是,我正在捕捉掉目标单元格的X和Y索引,然后找出它们之前每个单元格的宽度和高度,并将此值添加到放置位置。以下是此操作的代码:

var cellIndexX = event.target.cellIndex;
var cellIndexY = event.target.parentNode.rowIndex;
var positioningX = cellIndexX*($('#0-0').width());
var positioningY = cellIndexY*($('#0-0').height());

然后像这样添加positionXpositionY

var pos = ui.draggable.offset(), dPos = $(this).offset();
var droppedTop = ui.position.top - $(this).offset().top + $('#mainContainer').scrollTop()+positioningY;
var droppedLeft = ui.position.left - $(this).offset().left + $('#mainContainer').scrollLeft()+positioningX;

以上是关于Droppable元素位置计算不正确的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI (Droppable):如果 droppable 具有相对/绝对的 css 位置,则可拖动元素不会放置在鼠标指针处

jQuery UI droppable:悬停时调整元素大小不起作用

jqueryUI 可拖动的 droppable 和数组中的项目问题

可拖动的 droppable 和 sortable

Vue.js:在元素处于正确位置之前不显示元素

Jquery UI Droppable revert不能再次删除