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

Posted

技术标签:

【中文标题】jQuery UI (Droppable):如果 droppable 具有相对/绝对的 css 位置,则可拖动元素不会放置在鼠标指针处【英文标题】:jQuery UI (Droppable) : Draggable element not placed at mouse pointer if droppable has css position relative / absolute 【发布时间】:2021-03-25 20:06:53 【问题描述】:

我正在使用 jquery ui 拖放。

如果可放置的 div (#dropContainer) 的 css 位置为相对/绝对/固定,则放置的元素不会放在我的鼠标指针上。

<div id="dropContainer" style="position:relative;"></div>

如果我删除可放置 div 的位置,它会按预期工作。 但是由于一些明显的原因需要使用位置

draggableInputNo = 0;

var buttonElement = '<div class="button" style="width:200px;">Button</div>'
var textElement = '<div class="text">Text Element</div>'

$(function() 
  $("#dropContainer").droppable(
    drop: function(event, ui) 
      $element = ui.helper.clone();
      $element.resizable();
      $element.draggable();
      $element.selectable();

      if (ui.draggable.hasClass('draggableInput text')) 
        draggableInputNo++;
        $element.attr("id", 'draggableInput' + draggableInputNo);
        $element.appendTo(this);
        $element.append(textElement);
      
      else if (ui.draggable.hasClass('draggableInput button')) 
        draggableInputNo++;
        $element.attr("id", 'draggableInput' + draggableInputNo);
        $element.appendTo(this);
        $element.append(buttonElement);
      
    
  );

  $(".draggableInput").draggable(
    //containment: '#rpWebPushPopupContainer',
    cursor: 'move',
    helper: draggableInputHelper,
  );

);

function draggableInputHelper(event) 
  return '<div id="draggableInput' + draggableInputNo + '" class="draggableInputHelper resizable" ></div>'
.draggableInput 
  width: 50px;
  height: 30px;
  padding: 1em;
  float: left;
  margin: 10px 10px 10px 0;
  background-color: #9933ff;
  border-radius: 10px;
  border: 1px solid #9933ff;


.draggableInputHelper 
  width: 100px;
  height: 30px;
  padding: 0.5em;
  margin: 10px 10px 10px 0;
  background-color: #006699;
  border-radius: 10px;
  border: 1px solid #006699;
  color:#ffffff;


#dropContainer 
  width: 300px;
  height: 200px;
  padding: 0.5em;
  margin: 10px;
  float: left;
  border: 1px solid #867979;
  border-radius: 4px;
  background-color: yellow;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.9.1/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.9.1/themes/base/jquery-ui.min.css" />

<div class="draggableInput text">Text</div>
<div class="draggableInput button">Button</div>

<div id="dropContainer" style="position:relative;"></div>

【问题讨论】:

【参考方案1】:

当您在divrelative 中放置元素时,包含在可放置元素中的元素会不必要地添加父元素的偏移位置。所以在 drop 回调函数中去掉多余的offset

如下调整你的位置。

var parent = $('#dropContainer.ui-droppable');
var leftAdjust = $element.position().left - parent.offset().left;
var topAdjust = $element.position().top - parent.offset().top;
$element.css(
      left: leftAdjust,
      top: topAdjust
      )

draggableInputNo = 0;

var buttonElement = '<div class="button" style="width:200px;">Button</div>'
var textElement = '<div class="text">Text Element</div>'

$(function() 
  $("#dropContainer").droppable(
    drop: function(event, ui) 
      $element = ui.helper.clone();
      $element.resizable();
      $element.draggable();
      $element.selectable();

      if (ui.draggable.hasClass('draggableInput text')) 
        draggableInputNo++;
        $element.attr("id", 'draggableInput' + draggableInputNo);
        $element.appendTo(this);
        $element.append(textElement);
        var parent = $('#dropContainer.ui-droppable');
        var leftAdjust = $element.position().left - parent.offset().left;
        var topAdjust = $element.position().top - parent.offset().top;
        $element.css(
          left: leftAdjust,
          top: topAdjust
        );
       else if (ui.draggable.hasClass('draggableInput button')) 
        draggableInputNo++;
        $element.attr("id", 'draggableInput' + draggableInputNo);
        $element.appendTo(this);
        $element.append(buttonElement);
        var parent = $('#dropContainer.ui-droppable');
        var leftAdjust = $element.position().left - parent.offset().left;
        var topAdjust = $element.position().top - parent.offset().top;
        $element.css(
          left: leftAdjust,
          top: topAdjust
        );
      
    
  );

  $(".draggableInput").draggable(
    //containment: '#rpWebPushPopupContainer',
    cursor: 'move',
    helper: draggableInputHelper,
  );

);

function draggableInputHelper(event) 
  return '<div id="draggableInput' + draggableInputNo + '" class="draggableInputHelper resizable" ></div>'
.draggableInput 
  width: 50px;
  height: 30px;
  padding: 1em;
  float: left;
  margin: 10px 10px 10px 0;
  background-color: #9933ff;
  border-radius: 10px;
  border: 1px solid #9933ff;


.draggableInputHelper 
  width: 100px;
  height: 30px;
  padding: 0.5em;
  margin: 10px 10px 10px 0;
  background-color: #006699;
  border-radius: 10px;
  border: 1px solid #006699;
  color: #ffffff;


#dropContainer 
  width: 300px;
  height: 200px;
  padding: 0.5em;
  margin: 10px;
  float: left;
  border: 1px solid #867979;
  border-radius: 4px;
  background-color: yellow;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.9.1/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.9.1/themes/base/jquery-ui.min.css" />

<div class="draggableInput text">Text</div>
<div class="draggableInput button">Button</div>

<div id="dropContainer" style="position:relative;"></div>

【讨论】:

@Shree,太好了……这正是我想要的。 非常感谢 TON。我接受并支持您的回答。感谢您的快速解决方案。 像魅力一样工作...再次感谢您挽救了我的一天 很高兴为您提供帮助:)【参考方案2】:

这是另一个例子,基于你上面已经得到的答案。

$(function() 
  function draggableInputHelper(event) 
    return $("<div>", 
      id: "draggableInput" + draggableInputNo,
      class: "draggableInputHelper resizable"
    );
  

  function correctDrop(ui, par) 
    return 
      top: (ui.position.top - $(par).offset().top) + "px",
      left: (ui.position.left - $(par).offset().left) + "px"
    
  

  var draggableInputNo = 0;

  var buttonElement = $("<div>", 
      class: "button"
    )
    .css("width", "200px")
    .html("Button");
  var textElement = $("<div>", 
    class: "text"
  ).html("Text Element");

  $("#dropContainer").droppable(
    drop: function(event, ui) 
      $element = ui.helper.clone();
      $element.attr("id", 'draggableInput' + ++draggableInputNo);
      $element.css(correctDrop(ui, $("#dropContainer"))).appendTo(this);
      if (ui.draggable.hasClass('draggableInput text')) 
        $element.append(textElement);
       else if (ui.draggable.hasClass('draggableInput button')) 
        $element.append(buttonElement);
      
      $element.resizable();
      $element.draggable();
      $element.selectable();
    
  );

  $(".draggableInput").draggable(
    cursor: 'move',
    helper: draggableInputHelper,
  );
);
.draggableInput 
  width: 50px;
  height: 30px;
  padding: 1em;
  float: left;
  margin: 10px 10px 10px 0;
  background-color: #9933ff;
  border-radius: 10px;
  border: 1px solid #9933ff;


.draggableInputHelper 
  width: 100px;
  height: 30px;
  padding: 0.5em;
  margin: 10px 10px 10px 0;
  background-color: #006699;
  border-radius: 10px;
  border: 1px solid #006699;
  color: #ffffff;


#dropContainer 
  width: 300px;
  height: 200px;
  padding: 0.5em;
  margin: 10px;
  float: left;
  border: 1px solid #867979;
  border-radius: 4px;
  background-color: yellow;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.9.1/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.9.1/themes/base/jquery-ui.min.css" />

<div class="draggableInput text">Text</div>
<div class="draggableInput button">Button</div>

<div id="dropContainer" style="position:relative;"></div>

这只是压缩了一些代码。制作小函数可以更轻松地应用一些所需的更改。

【讨论】:

以上是关于jQuery UI (Droppable):如果 droppable 具有相对/绝对的 css 位置,则可拖动元素不会放置在鼠标指针处的主要内容,如果未能解决你的问题,请参考以下文章

jQuery UI - Droppable 只接受一个可拖动的

Jquery UI Droppable revert不能再次删除

02 Jquery UI Droppable 放置插件

使用 jquery-ui droppable 时,如何从 droppable 区域中删除已经删除的项目?

jQuery UI 的贪婪 droppable 无法按预期工作

如何在 jQuery UI 中使用 Draggable 和 Droppable 将拖动的 li 添加到可放置的 ui 中?