我正在努力寻找一种用鼠标动态调整和拖动svg多边形的方法.不幸的是jQueryUi不适用于svg元素.我也检查了Raphael图书馆,但找不到任何文档/片段如何实现这一点.
除了使用SVG之外,还有其他方式可以动态调整和拖动多边形图形吗?
解决方法
您可以自己使用SVG元素.特别地,您可以找到多边形的点,并添加使用jQuery进行拖动的
HTML元素句柄. (我假设你遇到的问题是jQuery UI不能与SVG定位模型一起使用.)这是一个完整的例子,我刚刚写(在Safari 5和Firefox 9中测试).
(免责声明:我不是jQuery的常规用户;除了不使用jQuery以外,该代码可能是单一的).
<!DOCTYPE html> <html><head> <title>untitled</title> <style type="text/css" media="screen"> .handle { position: absolute; border: 0.1em solid black; width: 1em; height: 1em; } </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.16/jquery-ui.min.js"></script> <script type="text/javascript"> function draggablePolygon(polygon) { var points = polygon.points; var svgRoot = $(polygon).closest("svg"); for (var i = 0; i < points.numberOfItems; i++) { (function (i) { // close over variables for drag call back var point = points.getItem(i); var handle = document.createElement("div"); handle.className = "handle"; document.body.appendChild(handle); var base = svgRoot.position(); // center handles over polygon var cs = window.getComputedStyle(handle,null); base.left -= (parseInt(cs.width) + parseInt(cs.borderLeftWidth) + parseInt(cs.borderRightWidth))/2; base.top -= (parseInt(cs.height) + parseInt(cs.borderTopWidth) + parseInt(cs.borderBottomWidth))/2; handle.style.left = base.left + point.x + "px"; handle.style.top = base.top + point.y + "px"; $(handle).draggable({ drag: function (event) { setTimeout(function () { // jQuery apparently calls this *before* setting position,so defer point.x = parseInt(handle.style.left) - base.left; point.y = parseInt(handle.style.top) - base.top; },0); } }); }(i)); } } </script> </head><body> <p> (Offset to test) <svg id="theSVG" width="500" height="500" style="border: 2px inset #CCC;"> <polygon id="x" points="200,200 100,100 100,1" fill="green" /> <polygon id="y" points="200,100 1,100" fill="red" /> </svg> </p> <script type="text/javascript"> draggablePolygon(document.getElementById("x")); draggablePolygon(document.getElementById("y")); </script> </body></html>
您还可以将一个事件处理程序附加到SVG多边形并实现拖动(我已经测试了,这可以工作),但是您将不得不在多边形的当前边界内单击,这是一个非典型的UI,可能很棘手,并实现了自己的打击测试.
为此,您将添加一个onmousedown处理程序到多边形元素.然后检索其点,找到位于点击位置的范围内,存储初始鼠标位置,然后随着鼠标位置的更改,有一个onmousemove处理程序修改点的x和y.