d3.js のd3.behavior.drag()
drag
イベントを使用してデータ モデルを更新し (要素の位置をすぐに設定せずに)、「描画」関数を実行して、更新されたモデルに基づいてすべての要素を更新しようとしています。transform
さらに、ドラッグされたオブジェクトに関連付けられているすべての要素を移動するために、含まれているグループ要素で翻訳を使用しています (以下にリンクされている例から余分な要素を削除しました)。これにより、ドラッグされた要素がドラッグされるにつれてスタッタリングし、ドラッグが速くなるほど悪化します。
jsFiddle のこの簡素化された例を参照してください。
例のコードは次のとおりです。
blocks = [
{ x: 0, y: 0 }
];
drag = d3.behavior.drag()
.origin(Object)
.on("drag", function(d) {
d.x = d3.event.x;
d.y = d3.event.y;
draw();
});
svg = d3.select("body")
.append("svg:svg")
.attr("width", 600)
.attr("height", 600);
function draw() {
g = svg.selectAll("g")
.data(blocks);
gEnter = g.enter().append("g");
g.attr("transform", function(d) { return "translate("+d.x+","+d.y+")"; });
gEnter.append("rect")
.attr("height", 100)
.attr("width", 100)
.call(drag);
}
draw();