【问题标题】:Jquery draggables: Removing an element changes position of other dropped elementsJquery draggables:删除元素会更改其他已删除元素的位置
【发布时间】:2012-03-10 01:17:33
【问题描述】:

当放置/放置元素(通过从一个 DIV 拖动到另一个 DIV)然后在放置的 DIV 中移除一个元素时,其中一些元素会改变位置。

这是一个测试场景:http://jsfiddle.net/TcYHW/8/

以及主要代码:

<div id="dropwin"></div>
<div id="dragables">
    <div id="d1" class="d"></div>
    <div id="d2" class="d"></div>
    <div id="d3" class="d"></div>
    <div id="d4" class="d"></div>
</div>


$(".d").draggable({
        containment: '#dropwin',
        stack: '#dragables div',
        cursor: 'move',
      });

我怎样才能避免这种情况?

我发现,元素放置在相对于起始位置的位置。即使移除了一些,我怎样才能让它们粘在掉落的位置?

我发现了两个几乎相似的问题,但没有一个令人满意的答案:

Remove in Jquery divs with draggables and resizables

jQuery draggable removing without changing position of other elements

【问题讨论】:

    标签: jquery position element draggable


    【解决方案1】:

    您需要将元素定位在absolute。那么被删除的框就不会影响其他元素的流动了。

    你可以使用 css 来定位它们absolute:

    .d { 
        width: 50px;
        height: 50px;
        margin: 10px;
        display: inline-block;
        position: absolute;
    }
    

    但是您必须手动放置每个盒子。诀窍是让它们定位在static(或relative.draggable() 完成后),然后使用javascript 设置它们的位置并将它们设置为absolute 定位:

    $('.d').each(function() {
        var top = $(this).position().top + 'px';
        var left = $(this).position().left + 'px';
        $(this).css({top: top, left: left});
    }).css({position: 'absolute'});
    

    演示:http://jsfiddle.net/jtbowden/5S92K/

    【讨论】:

    • 谢谢,您的解决方案看起来像我所需要的,但前提是左上角的“dropwin”是(静态)。如果您尝试此jsfiddle.net/BillyG/5S92K/2,其中 DIV 居中并水平更改浏览器窗口大小,则拖放的可拖动对象不会保持固定,它们会移动。相对于 dropwin-box,定位必须是绝对的。提示,如何解决?
    • #dropwin#dragables 需要有 position: relative 才能进行绝对定位才能做正确的事情。 jsfiddle.net/5S92K/3
    • 谢谢,它解决了迄今为止最好的方法。我更喜欢您的解决方案,因为它不需要像 Kaushtuvs 的解决方案那样在可拖动对象周围添加额外的标签。
    【解决方案2】:

    我刚刚在您的 jsFiddle 演示中进行了一些编辑,它似乎可以正常工作

    我的编辑:

    <div id="dropwin"></div>
    <div id="dragables">
    <div class="outer"><div id="d1" class="d"></div></div>
    <div class="outer"><div id="d2" class="d"></div></div>
    <div class="outer"><div id="d3" class="d"></div></div>
    <div class="outer"><div id="d4" class="d"></div></div>
    </div>
    <button id="b1">Remove d1</button>
    <button id="b2">Remove d2</button>
    <button id="b3">Remove d3</button>
    <button id="b4">Remove d4</button>
    

    在css中:

    #dropwin { width: 300px; height: 300px; border: 1px solid #f00;}
    #dragables { width: 300px; height: 70px; border: 1px solid #00f; }
    .d { width: 50px; height: 50px; margin: 10px; display: inline-block; }
    #d1 { background: #f00; position:absolute; }
    #d2 { background: #ff0; position:absolute; }
    #d3 { background: #f0f; position:absolute; }
    #d4 { background: #0ff; position:absolute; }
    .outer{ margin:1px 2px 0 0; float:left; width:60px;}
    

    【讨论】:

    • 谢谢,我在这里尝试了您的解决方案jsfiddle.net/BillyG/TcYHW/9,它看起来不错,即使“dropwin”居中。我将在我的应用程序中实现它,看看它是否能解决问题。但是为什么要在外部类的顶部和右侧添加此边距?
    • 忘记添加位置:absolute on #d1-#d4 jsfiddle.net/BillyG/TcYHW/10
    • 如果没有边距,div 最初会相互折叠。我的意思是当代码第一次加载时,四个 div 将彼此重叠。很高兴它现在工作。那么你能接受答案吗:)干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多