【发布时间】:2020-10-29 17:12:03
【问题描述】:
我正在使用 d3.js 和 Vue js 创建平面图。我想添加一个功能,用户单击一个按钮,该按钮创建一个矩形(门口),用户可以更改比例和 X、Y 位置。我对 vue js 和 d3.js 很陌生,所以我使用 this 作为参考。该按钮起作用并为 X 次按下添加 X 个矩形。但是,当我添加第一个门口并尝试拖动矩形时,它完全脱离了用户的鼠标坐标。此外,当我添加第二个、第三个、第四个等矩形时,我无法更改这些矩形的位置,只能更改第一个矩形。我认为这是因为我在拖动功能中只选择了一个矩形。但是我更关心在矩形上拖动。请问有人能指出我正确的方向吗?
<template>
<div id = "app">
<header>
<Navbar />
</header>
<div class = "floor">
<div id = "tooltip"></div>
<svg width = "850" height = "800">
</svg>
</div>
<div class = "buttons">
<button v-on:click="addRec()"> Add Doorway </button>
</div>
</div>
</template>
addRec(){
console.log("Doorway Added")
var doorGroup = d3.selectAll("svg")
.append("g")
//setting attributes for doorway
var doorway = doorGroup.append("rect")
.attr("width",100)
.attr("height", 25)
.attr("x", 150)
.attr("y", 200)
//setting style attributes for doorway
.attr("fill","#F5F5F5")
.attr("stroke", "black")
.attr("stroke-width", 2.5)
.attr("cursor", "move")
//binding drag method onto rectangle
.call(d3.drag()
.on('start', dragStart)
.on('drag', dragging)
.on('end', dragEnd)
)
},
//this is to be called once used has clicked on the doorway
dragStart(d,i,nodes){
d3.select(nodes[i])
.style("stroke", "red")
},
/*
this is to be called once used has started dragging the doorway
dragging(d) upadtes the position of the doorway, from the mouse X,Y Coors
*/
dragging(d,i,nodes){
var width = 850
var height = 800
var xCoor = d3.pointer(event)[0]
var yCoor = d3.pointer(event)[1]
// d3.select(nodes[i])
// .attr("transform", "translate(" + (xCoor - 200) + "," + (yCoor - 300) + ")")
d3.select(nodes[i])
.attr("x", xCoor)
.attr("y", yCoor)
},
//this is to be called once user has clicked off the doorway
dragEnd(d,i,nodes){
d3.select(nodes[i])
.style("stroke", "black")
},
【问题讨论】:
-
在拖拽功能中,
event定义在哪里?此外,您对 x 和 y 使用相同的值pointer(event)[0]。不过,如果使用 d3v6,event.x和event.y可能 是合适的。是否有缩放应用到 SVG?你能做一个最小的 sn-p 来复制你的问题吗?因为有很多可能有用也可能没用的建议。 -
@AndrewReid 谢谢,我什至没有意识到我对 X 和 Y 坐标使用了相同的值。学习了,谢谢。我正在使用 d3v5。不,没有缩放应用到任何东西。最小的 sn-p 是什么意思?
标签: javascript d3.js drag