Jquery UI可拖拽组件无法滚动排序容器

4
我有一些可拖动的项目(#draggable li),我正在将它们拖放到一个可排序的列表(#sortable)中。
这个可排序的列表被两个div包裹,最外层的div有overflow-y: scroll样式。在可排序的列表扩展并滚动时,拖放机制正常工作。
当我尝试直接将一个项目拖放到可排序的列表上时,我无法让可排序的滚动条自动滚动到我想要到达的位置(比如想要向上拖放到第一个元素之上或向下拖放到最后一个元素之下)。但是当我尝试在它们之间拖放和排序项目时,滚动条在拖放时会自动滚动。
是一个错误还是我的代码有问题?
以下是完整的代码:
<body>
    <ul id="draggable" class="connectedSortable">
        <li class="ui-state-default big">Item 1</li>
        <li class="ui-state-default big">Item 2</li>
        <li class="ui-state-default big">Item 3</li>
        <li class="ui-state-default big">Item 4</li>
        <li class="ui-state-default big">Item 5</li>
        <li class="ui-state-default big">Item 6</li>
    </ul>

  <div id="outerDiv">
    <div id="innerDiv">
      <ul id="sortable" class="connectedSortable">
      </ul>
    </div>
  </div>
</body>

//CSS

#sortable, #draggable { 
  list-style-type: none; 
  margin: 0; 
  padding: 0 0 2.5em; 
  margin-right: 10px; 
}
#sortable li, #draggable li { 
  margin: 0 5px 5px 5px; 
  padding: 5px; 
  font-size: 1.2em; 
  width: 120px; 
}
.marker{
    background: none repeat scroll 0 0 #DDDDDD;
    border-bottom: 1px solid #BBBBBB;
    border-top: 1px solid #BBBBBB;
    display: block;
    height: 20px;
    width: 100%;
    text-align: center;
    vertical-align: middle;
    color: #666;
    font-size: 18px;
    font-style: italic;
}

#outerDiv{
    background: none repeat scroll 0 0 #EEEEEE;
    height: 100%;
    right: 0;
    position: absolute;
    overflow-y: scroll; 
    top: 0;
    width: 300px;
}

#innerDiv{
    border: 1px solid #CCCCCC;
    min-height: 400px;
    position:absolute;
}
#sortable{
    width: 200px;
    padding: 10px;
    border : 1px solid black;
    min-height: 230px;
}

#draggable{
    position:absolute;
    top:0;
    left:0;
}
.big{
    height: 80px;
}

//JS

$(function() {
  $( "#sortable" ).sortable({
       placeholder: "marker",
       axis: "y",
  });

  $("#draggable li").draggable({
      helper: "clone",
      cursor: "move",
      revert: "invalid",
      revertDuration: 500,
      connectToSortable: "#sortable"
  });
});

这里有一个 Fiddle 的演示链接:http://jsfiddle.net/8KDJK/21/

如果需要帮助,请随时留言。谢谢 :)

2个回答

6
我不确定这是否是一个错误,但它不符合传统情况。几个月前,我花了很多时间寻找解决方法,这是我的解决方案:http://jsfiddle.net/8KDJK/23/。它已经工作了好几个月,没有问题。思路是在助手构建回调期间将元素克隆附加到可滚动容器中,然后使用setTimeout函数在1毫秒后将助手附加到body,以便在整个网页中拖动。
  $("#draggable li").draggable({
      cursor: "move",
      revert: "invalid",
      revertDuration: 500,
      connectToSortable: "#sortable",

      //Here is the workaround 
      //**********************

      containment: 'body',
      helper: function(){ 
        //Hack to append the element to the body (visible above others divs), 
        //but still bellonging to the scrollable container  
        $('#sortable').append('<div id="clone" class="ui-state-default big">' + $(this).html() + '</div>');   
        $("#clone").hide();
        setTimeout(function(){
            $('#clone').appendTo('body'); 
            $("#clone").show();
        },1);
        return $("#clone");
    }
  });

链接到我的之前的问题:JqueryUI,将元素拖入包含大表格的滚动可放置div的单元格


嘿,那个方法可行。也许在拖动时,我的元素仍然附加在主体上,因此它不是可滚动容器的一部分。我尝试在可排序的“over”事件上将其附加到可滚动容器中,但对我来说没有起作用。因此,我现在将使用您的解决方法。谢谢 :) - Mandeep Jain
1
很遗憾,在拖动过程中您无法重置选项。 - sdespont
1
对你来说是个坏消息,但好消息是我已经在IE8上测试了我的小提琴http://jsfiddle.net/QvRjL/134/,它可以正常工作。因此,请检查差异,可能是CSS定位问题。 - sdespont
非常感谢,这对我解决一个阻塞问题非常有帮助。谢谢! - Vincent Duprez
太棒了 - 我已经寻找这个解决方案好几个月了。 - JoeTidee
显示剩余4条评论

2
解决方案:
不要使用overflow:auto;
而是使用
overflow:visible;

Sortable项目上的overflow hidden也可能导致这个问题。 - Tim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接