【问题标题】:JavaScript drag-and-drop proxyJavaScript 拖放代理
【发布时间】:2010-06-30 01:44:59
【问题描述】:

我想在我的 Web 应用程序上启用拖放行为。我有一个要拖动的图像。该图像位于另一个具有透明部分的图像后面,以便您可以看到其下方的图像。我不想更改图像的顺序。我的想法是我应该在两个透明的图像之上使用另一层,并将其用作代理将事件传输到我想要拖动的图像。 jQuery UI 的draggable 函数不允许我实时传输事件,即我无法在拖动发生时挂钩它正在做什么,只有在它完成时。

是否有 JavaScript 库或 jQuery 插件可以让我在一个元素上启用拖放功能并将这些事件实时传输到另一个元素?

【问题讨论】:

    标签: javascript jquery drag-and-drop draggable


    【解决方案1】:

    也许我不明白你想要完成什么,但你应该能够毫无问题地拖放重叠的图像 (demo)。

    只需将两个图像包装在一个 div 中,然后使 div 可拖动:

    CSS(不需要使.dragme位置相对,因为它是在可拖动脚本中完成的)

    .dragme img {
     position: absolute;
     top: 0;
     left: 0;
    }
    

    HTML

    <div class="dragme">
     <img src="image1.gif">
     <img src="image2.gif">
    </div>
    

    脚本

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

    我更新了the demo,这并不漂亮,可能有更好的方法,但基本上这会在框架上放置一个不可见的叠加层,然后在拖动叠加层时定位图像。

    CSS

    #draggable, #droppable {
     width: 450px;
     height: 250px;
     padding: 0.5em;
     margin: 10px;
     background: #ddd;
     color:#000;
    }
    .dragme {
     position: relative;
     width: 100px;
     padding: 5px;
    }
    .dragme img {
     position: absolute;
     top: 55px;
     left: 30px;
    }
    .demo {
     width: 500px;
    }
    .border {
     position: absolute;
     top: 75px;
     left: 30px;
     z-index: 1;
    }
    

    HTML

    <div class="demo">
     <div class="border">
      <img src="http://www.imageuploading.net/image/thumbs/large/border-564.png">
     </div>
     <div id="draggable" class="ui-widget-content">
      <p>Drag from here</p>   
      <div class="dragme">
       <img src="http://i142.photobucket.com/albums/r117/SaltyDonut/Icons/evilpuppy.gif">
      </div>
     </div>
     <div id="droppable">
      <p>Drop here</p>
     </div>
    </div>
    

    脚本(演示使用 $(document).ready 因为 jsFiddle 不喜欢 $(window).load)

    $(window).load(function(){
     // cycle through draggable divs (in case there are more than one)
     $(".dragme").each(function(){
      var img = $(this).find('img');
      var pos = img.position();
      // create div overlay on image
      $('<div/>', {
       class : 'overlay',
       css: {
        position: 'relative',
        top: pos.top,
        left: pos.left,
        width: img.outerWidth(),
        height: img.outerHeight(),
        zIndex: 100
       }
      })
       // save original image position
       .data('pos', [pos.left, pos.top])
       .appendTo($(this));
    
      // make overlay draggable
      $(this).find('.overlay').draggable({
       containment : '.demo',
       revert: true,
       revertDuration: 0,
       handle: 'div',
       // drag overlay and image
       drag: function(e,ui){
        img = $(this).parent().find('img');
        img.css({
         top: ui.position.top,
         left: ui.position.left
        });
       },
       // make image revert
       stop: function(e,ui){
        pos = $(this).data('pos');
        $(this).parent().find('img').animate({left: pos[0], top: pos[1] },500);
       }
      });
     });
    
     $("#droppable").droppable({
      drop : function(e,ui) {
       // append entire div wrapper (.dragme)
       ui.helper.parent().appendTo($(this));
      }
     });
    });
    

    【讨论】:

    • 这是我想要做的一个例子:jsfiddle.net/wVref/2 小狗图像在带有透明部分的 PNG 下。我想在两张图片上再放一层。该层将是透明的,并捕获拖动事件并将其传输给小狗,以便它可以移动。如何拖动不可拖动图像下方的图像?
    • 我已经更新了我的答案。就像我上面提到的,可能有更好的方法,但这是我想出的。
    • 我明白了。这是完美的,只是它在不存在覆盖 div 的 Safari 中不起作用。有什么想法吗?
    • 我编辑了 HTML 以便覆盖 div 在标记中。然后它工作正常。这对我来说有点奇怪。 jsfiddle.net/wVref/19
    • 什么是奇怪的?我更新了演示 (jsfiddle.net/wVref/20),通过将顶部和左侧位置设置为零来将其移动到下拉框内。我还在覆盖 div 周围添加了一个黄色边框,以便您可以随时查看它的位置(用于演示)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-22
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多