4

ドラッグ可能なアイテム(#draggable li)がいくつかあり、それらをsortable(#sortable)にドラッグアンドドロップしています。

ソート可能ファイルは2つの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"
  });
});

フィドルのデモhttp://jsfiddle.net/8KDJK/21/

どんな助けでも大歓迎です。ありがとう :)

4

2 に答える 2

6

バグかどうかはわかりませんが、古典的なシナリオではありません。

私は数ヶ月前に回避策を見つけるために多くの時間を費やしました、そしてここに私の解決策があります:http: //jsfiddle.net/8KDJK/23/

今では何ヶ月も問題なく動作しています。

アイデアは、ヘルパー構築コールバック中にスクロール可能なコンテナーに要素クローンを追加し、1ms後にsetTimeout関数を使用してヘルパーを本体に追加し、Webページ全体をドラッグできるようにすることです。

  $("#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のセルに要素をドラッグします

于 2013-01-10T20:55:19.187 に答える
2

解決:

overflow:auto; を使用しないでください。

しかし

オーバーフロー: 可視;

于 2013-12-18T18:09:52.253 に答える