jquery ui draggable中如何避免div叠加?

Posted

技术标签:

【中文标题】jquery ui draggable中如何避免div叠加?【英文标题】:How to avoid the superposition of divs in jquery ui draggable? 【发布时间】:2019-05-21 01:02:36 【问题描述】:

我在容器内动态生成一些 div,这些 div 可以使用最新版本的 jquery-ui 进行拖动。问题是当一个 div 移动到另一个位置时,它不尊重其他 div 的空间,所以它可以在另一个 div 的顶部,我不希望这样。

如果我决定移动一个 div 并将其放在另一个 div 上,会发生这种情况:

这种行为不好,最好是如果我尝试将一个 div 放在另一个上,则不会执行此操作。

这是我的html代码:

<div class="container">
    <div class="row" id="main_row_blog_results"> 
         <!--here the divs are dynamically generated -->
    </div>
</div>

这是我的 JS 代码:

$(document).ready(function()
    $("#btnAddTextsBlog").click(function()
        var texts = "this is a random text";
        var content2 = "<div id='text1' class='draggable' style='float: left; margin-left: 30px; margin-right: 30px; margin-top: 30px; display: block;'><p contenteditable='true' style='font-size: 18px;'>"+texts+"</p></div>";

        $("#main_row_blog_results").append(content2); 

        $(".draggable").draggable(); 

    );         
    $( '.draggable' ).draggable(

    );

我想知道当用户将 div 拖放到其他 div 的空间中时,我该怎么做,将这个 div 移回原来的位置......这个想法是防止 div 之间的碰撞?

【问题讨论】:

与完整的工作示例共享完整的相关代码以重现 你需要使用碰撞检测见***.com/questions/4230029/… 从您的描述中不清楚如果用户将项目拖入该空间会发生什么。应该阻止这样做还是应该将下面的物品移开?请澄清您的问题。 @Twisty 对不起,你是对的。当用户将项目拖放到该空间时,该项目应移回其原始位置... 我确实编辑了我的问题。 【参考方案1】:

我建议如下:

$(function() 
  function makeDrag(obj) 
    obj.draggable(
      handle: ".drag-handle",
      revert: "invalid"
    );
  

  $("#btnAddTextsBlog").click(function() 
    var content = $("<div>", 
      id: "text" + ($(".draggable").length + 1),
      class: "draggable",
    ).css(
      float: "left",
      margin: "30px",
      "margin-bottom": 0,
      disply: "block"
    ).appendTo($("#main_row_blog_results"));

    $("<span>", 
      class: "ui-icon drag-handle 	ui-icon-arrow-4-diag"
    ).css(
      border: "1px solid #000",
      "border-radius": "3px",
      "margin-right": "3px"
    ).appendTo(content);

    $("<p>", 
      contenteditable: true
    ).css(
      "font-size": "18px",
      display: "inline-block"
    ).html("this is a random text").appendTo(content);

    makeDrag(content);
  );

  makeDrag($(".draggable"));
);
.drag-handle:hover 
  background-color: #ccc;
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
<button id="btnAddTextsBlog">Add</button>
<div class="container">
  <div class="row" id="main_row_blog_results">
    <!--here the divs are dynamically generated -->
  </div>
</div>

所以revert 有几个选项。我在这里使用invalid

如果设置为"invalid",则只有当可拖动对象没有被拖放到可放置对象上时才会发生还原。对于"valid",情况正好相反。

我还添加了一个句柄,因为如果用户去编辑&lt;p&gt; 元素,他们可能会单击它来编辑它,它可能会尝试拖动。因此,为避免任何潜在的混淆,我们使用句柄。

我不再添加 HTML 字符串,而是创建 jQuery 对象,这些对象在创建动态项目时更易于操作。

我还创建了一个可以将 jQuery 对象初始化为可拖动对象的小函数。这有助于始终使用相同的设置进行设置。

希望对您有所帮助。

【讨论】:

太好了,对我帮助很大。谢谢你。

以上是关于jquery ui draggable中如何避免div叠加?的主要内容,如果未能解决你的问题,请参考以下文章

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

jquery ui draggable - 如何防止拖动到文档顶部之外?

如何让 Jquery UI 的 Droppable 在其左上角进入内部时接受 Draggable? [关闭]

jQuery UI:将 Selectable 与 Draggable 结合起来

如何以编程方式调用 jQuery UI Draggable 拖动开始?

jQuery-ui-draggable 将像素值转换为百分比