Ich versuche, das Ziehen Verhalten für Gruppe bestehend aus HTML-Text und Hintergrund-Rechteck mit dem d3-Framework zu implementieren. Ich war in der Lage, es zu funktionieren, obwohl, wenn ich die Drag.origin nicht setze, kann ich bemerkenswerten Sprung wegen des Offset der Mausposition/Elementkoordinaten sehen. Genau wie auf der d3 wiki-page beschrieben Obwohl die Seite beschrieben, wie Sie den Ursprung zum Ziehen festlegen, verstehe ich nicht richtig, wie es in meinem Beispiel implementieren. Ich habe zwei verschiedene Ansätze ausprobiert: Verwenden des Elements zum Gruppieren der Elemente und Definieren eines neuen Elementhaltepunktes. Im ersten Fall muss ich die translate-Funktion verwenden und ich weiß nicht einmal, wie ich die Koordinaten der Gruppe ermitteln soll.Wie setze ich den Ursprung (drag.origin) für das Ziehen-Verhalten in d3 JavaScript-Bibliothek
var svg = d3.select("body").append("svg")
.attr("width", 960)
.attr("height", 500);
var group = svg.append("svg:g")
.attr("transform", "translate(10, 10)")
.attr("id", "group");
var rect1 = group.append("svg:rect")
.attr("rx", 6)
.attr("ry", 6)
.attr("x", 5/2)
.attr("y", 5/2)
.attr("id", "rect")
.attr("width", 250)
.attr("height", 125)
.style("fill", 'white')
.style("stroke", d3.scale.category20c())
.style('stroke-width', 5);
var html1 = group.append("foreignObject")
.attr("x", 50)
.attr("y", 25)
.attr("width", 200)
.attr("height", 100)
.attr("id", "fobject")
.style("border-color", d3.scale.category20c())
.append("xhtml:div")
.style("font", "14px 'Helvetica Neue'")
.html("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu enim quam.");
var innerSvg = svg.append("svg")
.attr("x", 500)
.attr("y", 10)
.attr("id", "innerSvg");
var rect2 = innerSvg.append("svg:rect")
.attr("rx", 6)
.attr("ry", 6)
.attr("x", 5/2)
.attr("y", 5/2)
.attr("id", "rect")
.attr("width", 250)
.attr("height", 125)
.style("fill", 'white')
.style("stroke", d3.scale.category20c())
.style('stroke-width', 5);
var html2 = innerSvg.append("foreignObject")
.attr("x", 50)
.attr("y", 25)
.attr("width", 200)
.attr("height", 100)
.attr("id", "fobject")
.style("border-color", d3.scale.category20c())
.append("xhtml:div")
.style("font", "14px 'Helvetica Neue'")
.html("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec eu enim quam.");
var drag1 = d3.behavior.drag()
.on("drag", function(d,i) {
d3.select(this).attr("transform", function(d,i){
return "translate(" + [ d3.event.x,d3.event.y ] + ")"
})
});
var drag2 = d3.behavior.drag()
.on("drag", function(d,i) {
d3.select(this)
.attr("x", d3.event.x)
.attr("y", d3.event.y);
});
group.call(drag1);
innerSvg.call(drag2);
ich eine Erklärung sehr schätzen würde, natürlich vorbereitet ich ein funktionierendes Beispiel hier: http://jsfiddle.net/Y8y7V/
Vielen Dank für Ihre Erklärung . Im ersten Fall kann ich einfach die X/Y-Koordinaten als Parameter des Elements hinzufügen. Ich frage mich, wie kann ich die Übersetzungsparameter nach den definierten X/Y-Parameter, wie zum Beispiel: var group = svg.append ("svg: g") .attr ("x", 50) .attr ("y") , 25) .attr ("transformieren", "übersetzen (" + [this.attr ("x"), this.attr ("y")] ")") Das von ocourse wird nicht arbeiten, weil das verweist das Fensterobjekt. –
karlitos
Wenn Sie 'origin()' entsprechend einstellen, müssen Sie die Transformation nicht basierend auf den statischen Koordinaten festlegen. –
Was mein Problem nicht löst - Frage, für die ich noch keine Antwort gefunden habe - Wie bekomme ich die Position der Gruppe, das -Element, wenn ich nur die "Transformation" verwenden kann, um ihre Position zu setzen. Danke jedenfalls, Ihre vorherige Erklärung hat mein Problem gelöst und ich konnte eine funktionierende Lösung für Standgehäuse finden. –
karlitos