【发布时间】:2020-10-31 12:45:28
【问题描述】:
我正在尝试在 d3 (v6.2) 中实现拖动事件,但在解释 d3 x 和 y 坐标时遇到了一些问题。考虑以下代码。当我检查控制台输出时,在我看来,在拖动处理程序中:
-
event.x和event.y是用户(图形)坐标对象位置和 SVG 坐标中的总移动/距离的总和? -
event.dx和event.dy是指示自上次更新以来,您是否向左/向上移动 (-1)、未移动 (0) 或向右/向下 (1)? -
event.subject.x和event.subject.y给出被拖动对象的位置? -
如果我想要拖动的当前坐标(在用户/图形坐标或 SVG 坐标中),我需要自己计算它们(参见代码中的示例,这似乎有效)?
我找不到具体的文档记录在哪里。我的问题是:
- 上述印象是否正确?
- 如果不正确,获取当前拖动坐标的最佳方法是什么?
- 如果正确,为什么要对来自两个不同坐标系的值求和?这对我来说没有意义。
<html>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/6.2.0/d3.min.js"></script>
<svg width="500" height="300"></svg>
<style>
circle.circ {
fill: red;
stroke: black;
stroke-width: 1px;
}
</style>
<script>
function dragHandler(e, d){
const objx = scaleX.invert(e.x - d.x + scaleX(d.x))
const objy = scaleY.invert(e.y - d.y + scaleY(d.y))
console.log(`x: ${e.x}, dx: ${e.dx} sx: ${e.subject.x} objx: ${objx}\ny: ${e.y} dy: ${e.dy} sy: ${e.subject.y} objy: ${objy}`)
}
var drag = d3
.drag()
.on('drag', dragHandler)
var x = [{x: 150, y: 150}]
var svg = d3.select("svg")
var margin = {
top: 20,
right: 80,
bottom: 30,
left: 50
}
var width = svg.attr("width") - margin.left - margin.right
var height = svg.attr("height") - margin.top - margin.bottom
g = svg.append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")")
var scaleX = d3.scaleLinear().range([0, width]).domain([140, 160])
var scaleY = d3.scaleLinear().range([height, 0]).domain([140, 160])
g.append("g")
.attr("class", "axis axis--x")
.attr("transform", "translate(0," + height + ")")
.call(d3.axisBottom(scaleX));
g.append("g")
.attr("class", "axis axis--y")
.call(d3.axisLeft(scaleY))
var circ = g.selectAll(".circ")
.data(x)
.enter()
.append("circle")
.attr("r", 5)
.attr("cx", function(d) { return scaleX(d.x) })
.attr("cy", function(d) { return scaleY(d.y) })
.attr("class", "circ")
.call(drag);
</script>
</body>
<html>
【问题讨论】:
-
文档有点晦涩,但你可以找到它here
-
我已经看到了,但是表格只是说“请参阅 drag.container”,然后在该部分中,它说“[t]拖动手势的容器决定了后续拖动事件的坐标系,影响 event.x 和 event.y”,我不清楚 - 它没有说明它是如何影响它的。我错过了什么吗?
标签: javascript svg d3.js