jQueryのドラッグ可能なグリッド
-
27-09-2019 - |
質問
のコンストラクターの「グリッド」オプションのように見えます ドラッグ可能 ドラッグされている要素の元の座標に比較的バウンドされています。 上 それぞれ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>
それらすべてが[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増加し、それを移動します 354px 単なる単なる増加する代わりに 46px (254 + 46 = 300)、グリッドの次の停留所に到達します - 300px, 、私たちが見ている場合 親div 参照ポイントとして、および「グリッドホルダー」。
私はドラッグ可能なソースを見ていましたが、それは組み込みの欠陥のように見えます - 彼らはドラッグ可能な要素の元の位置に比べてすべての計算を行うだけです。
Draggable Libraryのコードをモンキーパッチすることを避けたいと思います。ここで本当に探しているのは、ドラッグ可能なものを含む親と比較してグリッド位置を計算する方法です。しかし、モンキーパッチが避けられない場合、私はそれと一緒に暮らさなければならないと思います。
解決
ドラッグして自分のスクリプトを追加するだけでこの問題を回避しました。
ソースを突っ込んでもかまいません http://labs.pezcuckow.com/solveit/game.html そして、Make Draggable関数! (ゲーム以外のゲームが近づいた場所)
また、リバートに問題がありますが、グリッドにスナップしたことはありません。そこで、私は自分の「無効な場合はチェック」機能を最後に書きました:ドラガブルの(上記のゲームで再び表示可能)。
他のヒント
@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;
}
});
私はここ数日間Jquery Draggableを使い始めましたが、これに簡単な修正が見つかりました。
位置プロパティを絶対に設定し、グリッドに並ぶ値に上部と左に設定されたウィジェットを追加します。
上/左の値は絶対的なものであるため、DBにオフにして保管するときにもより理にかなっています。
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>