У меня есть HTML-структура:
<body>
<div id="board">
<div id="block" />
</div>
</body>
#board
можно расположить в любом месте.
Например, давайте предположим, что это position: relative; left: 3px; top: 7px;
position: relative; left: 3px; top: 7px;
(обратите внимание, что top & left не является умножением на 10), у body
есть margin: 0, padding 0
.
Я хочу, чтобы мой #block
был привязан к сетке 10px x 10px
. Но эта сетка должна начинаться в верхнем левом углу родителя (#board
), а не в верхнем левом углу страницы!
Поэтому он должен привязать мой # #block
к (3,7), (13, 17), (23, 27),...
вместо (0,0), (10, 10), (20, 20)...
.
Как его достичь?
Когда я использую:
jQuery(value).draggable({
containment: "#board",
grid: [10,10],
snap: "#board"
});
Он привязывается к сетке 10px x 10px
верхнем левом углу страницы, а не #board
(и только дополнительно привязывается к краям #board
, что не является решением).
Похоже, у вас есть правильная идея. Если вы позиционируете #block относительно #board и следуете совету Shningamae, установив "привязку" к истине, вы достигнете желаемого результата. Вы можете проверить результат с помощью метода смещения jQuery:
$('#block').draggable({
containment: "#board",
grid: [10,10],
snap: true,
stop: function() {
var offset = $(this).offset();
console.log("Top: " + offset.top + " Left: " + offset.left);
}
});
Вот пример: http://jsfiddle.net/63G8H/
Snap - это логическое значение, которое
Если установлено значение селектора или true (эквивалентно ".ui-draggable"), перетаскиваемый объект будет привязываться к краям выбранных элементов, когда он находится рядом с краем элемента.
По умолчанию: false
Я думаю, что ваш параметр оснастки должен быть "правдой".
Также у нас есть еще один вариант для оснастки:
SNAPMODE
Определяет, к каким краям элементов привязки привязывается перетаскиваемый объект. Игнорируется, если привязка ложна. Возможные значения: "внутренний", "внешний", "оба",
По умолчанию: "оба"
Источник: JQuery SDK Draggable