4

いくつかの正方形のドラッグ可能なオブジェクト (この場合は<td>、数字が入ったボックスのみ) をいくつかの空のテーブル セルにスナップし、それらの (外側の) エッジではなく、それらのセルの中心 (空の td ボックス) にスナップできるようにします。これは、デフォルトで行われているようです。

これが私のスクリプトです。

<script type="text/javascript">
 $(document).ready(function () {
     $(".inputs div").draggable( {
       snap: ".spaces"
     });    
 });    
</script>

編集:これがファイル全体です

 <!DOCTYPE html>
  <head>
   <title>Draggable</title>
   <script type="text/javascript" src="jquery-1.7.2.min.js"></script>
   <script type="text/javascript" src="jquery-ui-1.8.21.custom.min.js"></script>
   <script type="text/javascript" src="jquery.ui.touch-punch.min.js"></script>
   <style>
    .block {
        z-index:9999;
        cursor:move;
    }
    li {
        list-style:none;
    }
    tr {
        border: 2px solid black;
    }
    table {
        border: 2px solid black;
    }
    .inputs div {
        float:left;
        background-color:#FFFFFF;
        color:#004E66;
        font-size:x-large;
        margin:2px;
        padding:20px;
        border:1px solid black;
    }
    .spaces td {
        background-color:#666666;
        margin:2px;
        padding:36px;
        border:2px solid black;
    }
 </style>
</head>

<body>
<form id="form1">
  <div class="inputs">
    <div>1</div>
    <div>2</div>
    <div>3</div>    
    <div>4</div>
    <div>5</div>
    <div>6</div>
  </div>
  <br/>
  <table class="spaces">
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
    <tr>
        <td></td>
        <td></td>
        <td></td>
    </tr>
  </table>
</form>
<!-- here we are telling jquery to make each element inside of class 'inputs' draggable -->
<script type="text/javascript">
   $(document).ready(function () {
      $(".inputs div").draggable( {
         snap: ".spaces"
      }).center();  
  });   
</script>

これは、何が起こっているかの大まかなテキストベースの図です

---+---------+
XXXXXXXXXXXX X|
     | | | |
     | | Yx|
     | | X|
---+-------+X|
     | | X|
  • 上記のボックスが一番上の tr 行の右隅にある td セルの場合
  • 次に、Xは要素が現在くっついている場所です(明らかにそれほど大きくはありません。くっついている場所を示しているだけです...実際には、Xの一部を削除して、特定の近さに達したときに角にスナップする方法を示していますそれに…)
  • 基本的に、このモデルは、テーブルの外部エッジのみがドラッグ可能な要素に関して「重力」を持つことを示しています。私が本当にやりたいことは、外部エッジへの引力ではなく、すべてのエッジへの反発で td セルにスナップすることです。
  • Y は、ドラッグされた要素の目的のスナップ位置です。
  • 最後に、プレゼンテーション上の理由から、突然のジャンプではなく、ある種のトランジションで要素を所定の位置にスナップしたいと思います...
4

6 に答える 6

12

私はこれがあなたが望むものだと信じています。

必要に応じて配置を変更することができ、ニーズにより適しています。

デモはこちら: DEMO

$(document).ready(function () {


$(".inputs div").draggable( {
        opacity: .4,
        create: function(){$(this).data('position',$(this).position())},
        cursorAt:{left:15},
        cursor:'move',
        start:function(){$(this).stop(true,true)}
   });

     $('.spaces').find('td').droppable({
         drop:function(event, ui){
             snapToMiddle(ui.draggable,$(this));
         }
     });

 }); 


function snapToMiddle(dragger, target){
    var topMove = target.position().top - dragger.data('position').top + (target.outerHeight(true) - dragger.outerHeight(true)) / 2;
    var leftMove= target.position().left - dragger.data('position').left + (target.outerWidth(true) - dragger.outerWidth(true)) / 2;
    dragger.animate({top:topMove,left:leftMove},{duration:600,easing:'easeOutBack'});
}
于 2012-07-11T19:51:50.970 に答える
6

snapToMiddle 関数に関する注意事項:

それを適切に機能させるには、次のように変更する必要がありました >

function snapToMiddle(dragger, target){
    var offset = target.offset();
    var topMove = (target.outerHeight(true) - dragger.outerHeight(true)) / 2;
    var leftMove= (target.outerWidth(true) - dragger.outerWidth(true)) / 2;
    dragger.offset({ top: topMove + offset.top, left: leftMove + offset.left })
}

また、ドラッガーをドロッパーに関連付ける配列を作成し、ウィンドウのサイズ変更時に、すべてのドロッパーが迷子にならないようにします。

$( window ).resize(function() {
    for( i = 0 ; i < assc.length - 1 ; i++ )
    {
        var drp = assc[i].drop;
        var drg = assc[i].drag;
        snapToMiddle(drg,drp);
    }
});
于 2015-03-25T15:29:08.347 に答える
2

http://jsfiddle.net/vtdhV/

私はあなたの問題を解決するフィドルを作成しました..ある種(私が正しく理解していれば)。

赤いdivはtdsの中央に配置され、代わりにそれらにスナップします。境界線を削除するだけで、tdの中心にスナップするように見えます。の性質により.draggable、ドラッグ可能なオブジェクトは、すべてのエッジではなく、任意のエッジに同時にスナップします。

これだけでは不十分な場合は.stop、期待に基づいて要素の位置を調整するための呼び出しハンドラーを実装する必要があります。

于 2012-07-11T06:08:14.847 に答える
1

ドラッグした要素と同じサイズのスナップ ターゲットを指定する必要があります。ドラッグ可能オブジェクトが常にすべて同じサイズである場合、これは大したことではありません。空の絶対位置の div をセルに追加し、CSS を設定してサイズと中央が正しくなるようにします。次に、snapセレクターをその div に設定します。スナップ ターゲットの内側にのみスナップするには、 を に設定snapModeします"inner"

$(".inputs div").draggable({
    snap: ".spaces td div",
    snapMode: "inner"
});

ただし、ドラッグ可能オブジェクトのサイズが異なる可能性がある場合は、要素のドラッグを開始するたびに、サイズを変更してドロップ ターゲットを再配置する必要があります。ドラッグ可能のマウスダウンでこれを行います(遅すぎて機能しないmousedownため使用します):dragstart

$(".inputs div").draggable({
    snap: ".spaces td div",
    snapMode: "inner",
}).mousedown(function(){
    var targets = $(".spaces td div");
    targets.height(this.offsetHeight);
    targets.width(this.offsetWidth);
    targets.each(function(){
        $(this).position({ of: this.parentNode });
    });
});

http://jsfiddle.net/gilly3/mPr3A/

于 2012-07-11T20:09:20.953 に答える
0

これらのtdsにdivを追加し、tdsと新しく追加されたdivに固定の幅と高さを指定して中央に配置します。次に、ドラッグ可能なオブジェクトをこれらのdivにスパンします。

$(document).ready(function () {
    $('<div></div>').appendTo('.spaces td');
    $(".inputs div").draggable({
        snap: ".spaces td div",
        snapMode:'inner'
    });  
}); 

また、tdsとdivのcssは次のようになります。

.block {
    z-index:9999;
    cursor:move;
}

.productCode {

}

li {
    list-style:none;
}
tr {
    border: 2px solid black;
}
table {
    border: 2px solid black;
}

.inputs div {
    float:left;
    background-color:#FFFFFF;
    color:#004E66;
    font-size:x-large;
    margin:2px;
    padding:20px;
    border:1px solid black;
}

.spaces td {
    background-color:#666666;
    width:80px;
    height:80px;            
    border:2px solid black;
}

.spaces td div {
    margin:0 auto;
    width:50px;
    height:70px;
}

フィドルデモ-http://jsfiddle.net/nsjithin/u25Bs/1/

于 2012-07-11T08:45:16.553 に答える
-1

問題が正しければ、現在のスクリプトを次のように置き換えます。

$(document).ready(function () {

    // create a bunch of invisible divs
    var divs = $('<div></div><div></div><div></div><div></div>');

    // make them 2/2 and add them to the existing tds
    divs.css({ width:'50%', float:'left' }).appendTo('.spaces td');

    // snap to everything
    $(".inputs div").draggable({snap: ".spaces td, .spaces td div" }).center(); 

}); 

私が言わなかったら、私はそれを修正します。

于 2012-07-11T06:00:26.977 に答える