【发布时间】:2015-05-26 22:35:26
【问题描述】:
我对 JavaScript 和 JQuery 还很陌生,如果我遗漏了一两个技巧,敬请见谅。
我已经弄清楚如何让 JQuery UI 可拖动对象使用网格选项,并且在页面加载后,“捕捉到所有可拖动对象都引用的虚构网格”(在代码 cmets 中解释)。但是,我不知道如何让这种行为发生.on("dragstart")。
HTML:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<script type="text/javascript" src="jquery-1.10.2.js"></script>
<script type="text/javascript" src="jquery-ui.js"></script>
<script type="text/javascript" src="dragger.js"></script>
</head>
<body>
<div id="parent">
<svg width="300" height="100" class="draggable" id="number1">
<rect x="0" y="0" rx="10" ry="10" width="300" height="100" style="fill:rgb(121,0,121);stroke-width:3;stroke:rgb(0,0,0);">
</svg>
<svg width="300" height="100" class="draggable" id="letterA">
<rect x="0" y="0" rx="100" ry="10" width="300" height="100" style="fill:rgb(0,121,121);stroke-width:3;stroke:rgb(255,0,0);">
</svg>
</div>
</body>
</html>
注意: 两个矩形之间有一个白色的间隙,通过下面的第二个 JavaScript,一旦块被捕捉到网格,它就会消失。或者,这 2 个矩形应该可以相互拖动,并且彼此齐平排列,以被视为对齐到网格上。
JavaScript (dragger.js):
var roundedRemainder = function(numer, denom) {
return numer - (Math.round(numer / denom) * denom);
}
var snapPosition = function(obj, granularity) {
obj.position({
my: "left top", // Unchanging reference point on draggable object
at: "left top", // Unchanging reference point on reference object
of: "#parent", // The object that you want to move items with respect to.
using: function(position, data) {
var newPositions = {
// Get the difference between the "imaginary grid" and the current grid
left: function() {
return roundedRemainder(position.left, granularity);
},
top: function() {
return roundedRemainder(position.top, granularity);
}
}
// Move to the imaginary grid
$(this).css(newPositions);
return newPositions;
}
});
}
$(function() {
var gridSize = 50;
$(".draggable")
// Enable grid usage
.draggable({
grid: [gridSize, gridSize]
})
.on("dragstart", function(event, ui) {
var newPos = snapPosition(ui.helper, gridSize);
})
});
证明snapPosition中的代码有效:
var roundedRemainder = function(numer, denom) {
return numer - (Math.round(numer / denom) * denom);
}
$(function() {
var gridSize = 50;
$(".draggable")
// Enable grid usage
.draggable({
grid: [gridSize, gridSize]
})
.position({
my: "left top", // Unchanging reference point on draggable object
at: "left top", // Unchanging reference point on reference object
of: "#parent", // The object that you want to move items with respect to.
using: function(position, data) {
var newPositions = {
// Get the difference between the "imaginary grid" and the current grid
left: function() {
return roundedRemainder(position.left, granularity);
},
top: function() {
return roundedRemainder(position.top, granularity);
}
}
// Move to the imaginary grid
$(this).css(newPositions);
}
})
});
第一个 JavaScript 尝试在拖动开始后更改块的位置,以将其对齐到假想的网格。第二个在加载页面时自动执行此操作,但不会再执行此操作。例如,如果我将虚构的网格粒度从 50 更改为 79,则拖动不会将对象带回所需的网格。
有没有什么地方可以让我学习如何做到这一点?可行吗?
澄清一下:
- JQuery = 1.10.2(与 JQuery UI 演示中的相同)
- JQuery UI = 1.11.4(与 JQuery UI 演示中的相同)
- 浏览器 = Ubuntu 14.04 上的 Firefox,一切都是最新的
我已经使用过 Google,但是类似于“开始”、“拖动”和“位置”的术语不够独特,无法缩小范围,或者我没有找到合适的位置。我还浏览了 JQuery (UI) 档案。
非常感谢!
【问题讨论】:
标签: javascript jquery html jquery-ui draggable