6

Draggableのコンストラクターの「grid」オプションは、ドラッグされる要素の元の座標に比較的バインドされているように見えます。つまり、3つのドラッグ可能なdivがあり、それぞれの上部が100、200、254ピクセルに設定されている場合は、親に:

<div class="parent-div" style="position: relative;">
    <div id="div1" class="draggable" style="top: 100px; position: absolute;"></div>
    <div id="div2" class="draggable" style="top: 200px; position: absolute;"></div>
    <div id="div3" class="draggable" style="top: 254px; position: absolute;"></div>
</div>

Adnはすべて、「grid」を[1、100]に設定してドラッグできるようになっています。

draggables = $('.draggable');
$.each(draggables, function(index, elem) {
    $(elem).draggable({
                       containment: $('#parent-div'),
                       opacity: 0.7,
                       revert: 'invalid',
                       revertDuration: 300,
                       grid: [1, 100],
                       refreshPositions: true
    });
});

ここでの問題は、たとえばdiv3を下にドラッグすると、上部が100増加し、46px(254 + 46 = 300)だけ増加するのではなく、354pxに移動することです。これにより、次の停止に移動します。グリッド内-300px親-divを参照ポイントおよび「グリッドホルダー」として見ている場合。

ドラッグ可能なソースを調べましたが、これは組み込みの欠陥のようです。ドラッグ可能な要素の元の位置を基準にしてすべての計算を実行するだけです。

ドラッグ可能なライブラリのコードにモンキーパッチを適用することは避けたいと思います。ここで本当に探しているのは、ドラッグ可能なライブラリに、含まれている親に対するグリッド位置を計算させる方法です。ただし、モンキーパッチがやむを得ない場合は、一緒に暮らす必要があると思います。

4

4 に答える 4

12

@Pezの答えが失われたので(404)、これが私がそれをした方法です:

$('#elem').draggable({
    ....,
    drag: function(e, ui) {
        ui.position.left = Math.floor(ui.position.left / 10) * 10;
        ui.position.top = Math.floor(ui.position.top / 10) * 10;
    }
});

デモ: http: //jsfiddle.net/ThiefMaster/yGsSE/

于 2011-06-15T14:09:20.483 に答える
2

この問題を回避するには、ドラッグするために独自のスクリプトを追加します。ドラッグ可能の下で、次のように設定します。

divide math.Floor(x/100)*100 

Yについても同じです。

于 2010-06-14T09:56:29.457 に答える
0

過去数日間、ドラッグ可能なJQueryを使い始めましたが、これを簡単に修正できることがわかりました。

positionプロパティをabsoluteに設定し、上と左をグリッドに沿った値に設定してウィジェットを追加します。

上/左の値は絶対値であるため、オフにしてデータベースに保存する場合にも意味があります。

于 2011-02-06T13:25:38.187 に答える
0

Jqueryデスクトップ:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/jquery-ui.min.js"></script>
<link rel="stylesheet/less" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.10/themes/base/jquery-ui.css">

<div class="parent-div" style="position: relative;">
    <div id="div1" class="draggable" style="top: 100px; position: absolute;">1</div>
    <div id="div2" class="draggable" style="top: 200px; position: absolute;">2</div>
    <div id="div3" class="draggable" style="top: 254px; position: absolute;">3</div>
</div>

<script>
var Z_INDEX_APP = 0;
var Z_INDEX_WINDOW_COUNTER = 1;
var Z_INDEX_NOTE_COUNTER = 999;
var Z_INDEX_FOR_DRAGGED = 99999;
var Z_INDEX_FOR_NOTIF = 999999; 
var ICONS_GRID_CELL_SIZE = 75;
var ICONS_GRID_PADDING_LEFT = 20;
var ICONS_GRID_PADDING_TOP = 50; 
draggables = $('.draggable');
$.each(draggables, function(index, elem) {
    $(elem).draggable({
        containment: $('#parent-div'),
        start: function(event) {
        icon = $(this);
        icon.css('z-Index', Z_INDEX_FOR_DRAGGED);
        dragStartLeft = icon.css('left');
        dragStartTop = icon.css('top');
        icon.addClass('desktop-app-dragging');
        icon.removeClass('desktop-app-pressed');
    },
    stop: function(event) {         
        icon.css('z-Index', Z_INDEX_APP);
        var appId = icon.attr('id').split('_')[1];
        icon.removeClass('desktop-app-dragging');
        var alignedX = ICONS_GRID_PADDING_LEFT + Math.floor(parseInt(icon.css('left'))/ICONS_GRID_CELL_SIZE) * ICONS_GRID_CELL_SIZE;
        var alignedY = ICONS_GRID_PADDING_TOP + Math.floor(parseInt(icon.css('top'))/ICONS_GRID_CELL_SIZE)  * ICONS_GRID_CELL_SIZE;
        if ( alignedX < ICONS_GRID_PADDING_LEFT ) alignedX = ICONS_GRID_PADDING_LEFT;
        if ( alignedY < ICONS_GRID_PADDING_TOP ) alignedY = ICONS_GRID_PADDING_TOP;         
        var iconToSwitch = null;
        $(".desktop-app").each(function(index, app) {           
            if ( app.style.top == ( alignedY + 'px' ) && app.style.left == ( alignedX + 'px' ) ) {
                iconToSwitch = app;
            }
        });
        if ( iconToSwitch != null ) {
            var appToSwitchId = iconToSwitch.id.split('_')[1];
            var updateUrl = 'api/desktop?cmd=update&id=' + appToSwitchId + '&x=' + parseInt(dragStartLeft) + '&y=' + parseInt(dragStartTop);
            //$.getJSON(updateUrl);
            iconToSwitch.style.left = dragStartLeft;
            iconToSwitch.style.top = dragStartTop;
        }       
        icon.css('left', alignedX + 'px');
        icon.css('top', alignedY + 'px');
        var updateUrl = 'api/desktop?cmd=update&id=' + appId + '&x=' + alignedX + '&y=' + alignedY;
        //$.getJSON(updateUrl);
    }

    });
});
</script>
于 2012-01-30T17:17:31.663 に答える