我想在d3可视化文件中创建一个文本,可以在编辑器中使用。我开始使用示例(http://bl.ocks.org/mbostock/4063550)。当我向文本元素添加一个dragbeheavier时,我可以从ChromeDevTools中看出某些内容被拖动但是没有可视化表示。我也尝试使用JQuery UI做什么也没用。我错过了什么,甚至可以这样做?
答案 0 :(得分:12)
您可以使用drag.behaviour向元素添加拖动事件。
1)创建一个函数来处理拖动事件(d3.event类型):
function dragmove(d) {
d3.select(this)
.style("top", ((d3.event.sourceEvent.pageY) - this.offsetHeight/2)+"px")
.style("left", ((d3.event.sourceEvent.pageX) - this.offsetWidth/2)+"px")
}
2)使用上述函数作为处理程序创建拖动行为:
var drag = d3.behavior.drag()
.on("drag", dragmove);
3)在d3选择中使用.call
将其绑定到元素或一组元素:
d3.select("body").append("div")
.attr("id", "draggable")
.text("Drag me bro!")
.call(drag)
试一试:http://jsfiddle.net/HvkgN/2/
以下是同一个示例adapted for an svg text element:
function dragmove(d) {
d3.select(this)
.attr("y", d3.event.y)
.attr("x", d3.event.x)
}
var drag = d3.behavior.drag()
.on("drag", dragmove);
d3.select("body").append("svg")
.attr("height", 300)
.attr("width", 300)
.append("text")
.attr("x", 150)
.attr("y", 150)
.attr("id", "draggable")
.text("Drag me bro!")
.call(drag)
答案 1 :(得分:2)
将拖动添加到SVG元素的更好看的方法是使用转换变换来移动可拖动元素。将此与一个使用d3.event.dx和d3.event.dy监视鼠标移动的拖动事件处理程序相结合。
var transX = 0;
var transY = 0;
var theElement = d3.select('svg#xyz text.blahblah').attr('transform', "translate(" + transX + ", " + transY + ")");
var repositionElement = function(data) {
transX += d3.event.dx;
transY += d3.event.dy;
theElement.attr('transform', "translate(" + transX + ", " + transY + ")");
};
var addDragging = function (element) {
element.call(d3.behavior.drag().on('drag', repositionElement));
};
addDragging(theElement);
此外,与直接更改x / y不同,此技术可用于使整个<g>
组可拖动,因此当用户点击并拖动组的任何部分时,整个组都会移动!