2011-08-03 18 views
10

私は2つのコンテナを持っています。サムネイルコンテナ、および「ページ」コンテナ。どちらもdivです。サムネイルは、2つのコンテナ間で前後にドラッグできます。サムネイルを「無効」に戻したので、どちらか一方の外にドロップされた場合は、2つのコンテナのいずれかにスナップバックします。jQuery UIドラッグ可能、グリッドにスナップする

サムネイルは、「ページ」コンテナ内の20x20グリッドにスナップする必要があります。これはクライアントのため、クライアントはサムネイルを任意の場所の「ページ」コンテナに置くことができますが、それでもきれいに整列させることができます。

ドラッグ可能な「グリッド」オプションはこれではあまりうまく機能しないようです。 「グリッド」は、スナップ可能な実際のグリッドがページにあるかのように動作するのではなく、ドラッグを開始するときにドラッグ可能な位置によって決まるようです。

これを修正する方法はありますか?グリッドは、ドラッグを開始するときにドラッグ可能な位置ではなく、「ページ」コンテナに基づいていますか?

+0

私はあなたがこれに対する解決策を見つけたらまだ興味があります。私は以下の1つの答えを試しましたが、それは私の問題を解決しませんでした。私の問題は、各要素がドロップされた場所に基づいて独自のグリッドを持つように見えるということです。 – crush

+0

@crush、私は最初のドラッグのストップイベントでカスタム丸め関数を使用して成功しました。オブジェクトの位置が一番近いXピクセルに丸められたら、グリッドの倍数を知っている開始位置に基づいて新しいグリッドパラメータを適用できます。 – Capsule

+0

@Capsuleは基本的に私がやったことです。 – crush

答えて

3

チェックのjQuery UIサイト上のスナップ例は:

http://jqueryui.com/demos/draggable/#snap-to

あなたはそれらの同じ例を取ると、グリッドとスナップパラメータの両方を指定することができます。

スナップは、スナップセレクタの左上隅に基づいています。

$("#draggable5").draggable({ snap: ".ui-widget-header", grid: [ 80, 80 ] }); 

Jqueryサイトの例では、大きなコンテナに基づいて「80x80」のボックスがスナップされるようになりました。あなたの状況では

それは100%の幅と高さのdivを作成するのが最も簡単かもしれないが、その後、スナップセット:...その後にスナップするグリッドを指定し、そのDIVに(CSSセレクタを使用して)セレクタを

幸運

+0

"スナップは、スナップセレクタの左隅にあります。 - 間違っている、これは*働かない*。それが欲しいです。 ** http://jsfiddle.net/FNhFX/6/** – Yarin

2

ドラッグ可能な開始イベントを使用して開始位置を最も近い20ピクセルに丸めることができます。

ような何か(未テスト...):

$('#draggable').draggable(
    {snap : grid: [20,20]}, 
    {start : function(event, ui) { 
     var startPosition = $(ui.draggable).position(); 
     $(ui.draggable).css({ 
      'left' : (Math.round(startPosition.left/20)*20)+'px', 
      'top' : (Math.round(startPosition.top/20)*20)+'px'}); 
     } 
    } 
); 

私はそれを達成するために自分自身をしようとしているが、それはもっとトリッキーですので、私は別の容器にドラッグされた要素のクローンを作成しています;-) 私はまだ開始イベントでヘルパーの位置を設定する方法を理解する必要があります...

もちろん、開始位置が既に絶対(ドラッグされた場合など)の場合にのみ機能します。

実際には、このメソッドをストップイベントに適用してグリッドプロパティを削除することでほぼ達成できました。そこには、グリッドは、もはやそれ自体ませんが、それを削除するとき、それはあなた自身のグリッドに行くので、周りのオブジェクトを移動するときには、任意の視覚的なフィードバックを得ることはありません

: :

stop: function(event, ui) { 
    var stopPosition = $(ui.draggable).position(); 
    $(ui.draggable).css({'left' : (Math.round(stopPosition.left/20)*20)+'px', 'top' : (Math.round(stopPosition.top/20)*20)+'px'}); 
} 

はここで働い例ですhttp://jsfiddle.net/qNaHE/3/

関連する問題