【发布时间】:2015-06-24 09:57:09
【问题描述】:
我在使用具有自己坐标空间的旋转 SVG 元素时遇到问题。正常的拖放不起作用。例如:元素向右移动而不是向上移动,向左移动而不是向下移动。我正在寻找一种简单的解决方案,对具有不同度数设置的 SVG 元素使用正常的拖放操作。
可以在这里看到一个演示http://jsfiddle.net/jmdajkkb/
HTML 视图:
<div ng-app>
<div ng-controller="myController">
<svg style="height: 612px; width: 612px;" ng-mouseup="mouseUp()" ng-mousemove="mouseMove($event)">
<rect fill="orange" width="100" height="100" ng-mousedown="elementMouseDown($event)" ng-attr-x="{{element.x}}" ng-attr-y="{{element.y}}" ng-attr-transform="rotate({{element.rotation.degree}}, {{element.rotation.x}}, {{element.rotation.y}})" />
</svg>
</div>
</div>
JavaScript:
function myController($scope) {
$scope.element = {
"x": 350,
"y": 50,
"rotation": {
"degree": 60,
"x": 50,
"y": 50
}
};
var isDragging = false, x, y;
$scope.elementMouseDown = function(eventArgs){
isDragging = true;
x = eventArgs.clientX;
y = eventArgs.clientY;
};
$scope.mouseMove = function(eventArgs) {
if(isDragging) {
$scope.element.x += eventArgs.clientX - x;
$scope.element.y += eventArgs.clientY - y;
x = eventArgs.clientX;
y = eventArgs.clientY;
};
};
$scope.mouseUp = function() {
isDragging = false;
};
}
顺便问一下,“拖放”逻辑应该放在控制器还是指令中?
更新
是的,在转换中附加翻译它可以工作。但在我的项目中,我们有一个稍微复杂一点的场景。
用户可以在运行时插入更多元素(矩形)。他可以通过单击选择一个元素并使用拖放或旋转功能。选择元素在带有圆圈的单独组中可用。
这是获得更好视图的新代码:http://jsfiddle.net/kjaxdf8c/
【问题讨论】:
-
将未旋转的
<g>元素作为<rect>元素的容器并拖动它。 -
我在一个矩形中有不同的子元素,在我的项目中固定 X 和 Y 位置。不幸的是,这种解决方法是不可能的。
-
在 SVG 中
<rect>元素不允许有孩子,所以我不明白你的评论。 -
是的,没错。我有一个带有子元素的单独
.. 有固定位置.. 单独的 位于 -
然后使用两个
<g>元素。祖父母可以保持固定,父母就是你拖动的东西。
标签: javascript angularjs html svg drag-and-drop